SQL 的主要功能就是對數據進行處理和分析。為了提高數據處理的效率,SQL 為我們提供了許多預定義的功能模塊,也就是函數(Function)。
數值函數通常接收一個或者多個數字類型的參數,并且返回一個數值結果。本文比較五種主流數據庫常用數值函數的實現和差異,包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。
數值函數 | 函數功能 | MySQL | Oracle | SQL Server | PostgreSQL | SQLite |
---|
ABS(x) | 計算x的絕對值 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
CEILING(x) | 返回大于或等于x的最小整數 | ✔️ | CEIL(x) | ✔️ | ✔️ | CEIL(x) |
FLOOR(x) | 返回小于或等于x的最大整數 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
MOD(x, y) | 計算x除以y的余數 | ✔️ | ✔️ | x % y | ✔️ | x % y |
ROUND(x, n) | 將x四舍五入到n位小數 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
RANDOM() | 返回一個偽隨機數 | RAND() | DBMS_RANDOM | RAND() | ✔️ | ✔️ |
絕對值函數
ABS(x) 函數計算輸入參數的絕對值,例如:
SELECT ABS(-1), ABS(1), ABS(0)
FROM employee
WHERE emp_id = 1;
查詢返回的結果如下:
ABS(-1)|ABS(1)|ABS(0)
-------|------|------
1| 1| 0
取整函數
CEIL(x) 和 CEILING(x) 函數返回大于或等于 x 的最小整數,也就是向上取整。FLOOR(x) 函數返回小于或等于 x 的最大整數,也就是向下取整。例如:
SELECT CEIL(-2), CEILING(-2), FLOOR(4.5)
FROM employee
WHERE emp_id = 1;
Oracle 不支持 CEILING(x) 函數,Microsoft SQL Server 不支持 CEIL(x) 函數。查詢返回的結果如下:
CEIL(-2)|CEILING(-2)|FLOOR(4.5)
--------|-----------|----------
-2| -2| 4
ROUND(x, n) 函數將 x 四舍五入到 n 位小數,也就是執行四舍五入運算。例如:
SELECT ROUND(9.456, 1), ROUND(9.456)
FROM employee
WHERE emp_id = 1;
第二個函數調用時省略了參數 n,表示四舍五入到整數。Microsoft SQL Server 不能省略參數 n,可以將 ROUND(9.456) 替換成 ROUND(9.456, 0)。查詢返回的結果如下:
ROUND(9.456, 1)|ROUND(9.456)
---------------|------------
9.5| 9
求余函數
MOD(x, y)函數計算 x 除以 y 的余數,也就是執行求模運算。例如:
-- Oracle、MySQL 以及 PostgreSQL
SELECT MOD(5,3)
FROM employee
WHERE emp_id = 1;
Oracle、MySQL 以及 PostgreSQL 實現了 MOD 函數。查詢返回的結果如下:
MOD(5,3)
--------
2
Microsoft SQL Server 和 SQLite 沒有提供 MOD 函數,可以使用%運算符進行求模運算:
-- Microsoft SQL Server、MySQL、PostgreSQL 以及 SQLite
SELECT 5 % 3
FROM employee
WHERE emp_id = 1;
MySQL 和 PostgreSQL 也支持這種語法。查詢返回的結果和上面的示例相同。
生成偽隨機數
通過計算機生成的隨機數都是偽隨機數,數據庫都提供了生成偽隨機數的函數。
MySQL 使用 RAND 函數返回一個大于或等于 0 且小于 1 的隨機數。Microsoft SQL Server 也使用 RAND 函數返回隨機數,但是隨機數的取值范圍為大于 0 且小于 1。例如:
-- MySQL 和 Microsoft SQL Server
SELECT RAND()
FROM employee
WHERE emp_id <= 3;
對于 MySQL 而言,在一個查詢語句中的多次 RAND 函數調用都會返回不同的隨機數。查詢返回的結果如下:
RAND()
-------------------
0.12597889371773124
0.6288336549222783
0.7662316241918427
對于 Microsoft SQL Server 而言,在一個查詢語句中的多次 RAND 函數調用返回相同的隨機數。查詢返回的結果如下:
RAND()
-------------------
0.47224141500963573
0.47224141500963573
0.47224141500963573
一般來說,如果你運行上面的示例將會得到不同的隨機數。不過,我們也可以為 RAND 函數指定一個隨機數種子,重現相同的隨機數。例如:
-- MySQL 和 Microsoft SQL Server
SELECT RAND(1);
其中,函數中的參數 1 是隨機數種子。多次執行以上查詢將會返回相同的結果。
Oracle 提供了一個系統程序包 DBMS_RANDOM,其中的 VALUE 函數可以用于返回大于或等于 0 且小于 1 的隨機數。例如:
-- Oracle
SELECT DBMS_RANDOM.VALUE
FROM employee
WHERE emp_id <= 3;
查詢返回的結果如下:
VALUE
----------------------------------------
0.18048925385153716390255039523196767411
0.3353631757935088547857071602303392595
0.3412188906823928592522036537134902456
對于 Oracle,每次調用 RAND 函數都會返回不同的隨機數。
提示:Oracle 系統程序包 DBMS_RANDOM 中還提供了其他生成隨機數和隨機字符串的函數,以及設置隨機數種子的方法,可以查看其官方文檔。
PostgreSQL 提供了 RANDOM 函數,可以返回一個大于或等于 0 且小于 1 的隨機數。例如:
-- PostgreSQL
SELECT RANDOM()
FROM employee
WHERE emp_id <= 3;
查詢返回的結果如下:
random
------------------
0.1523788485137807
0.2580784959938427
0.0528612944722024
對于 PostgreSQL,每次調用 RANDOM 函數都會返回不同的隨機數。如果想要重現相同的隨機數,可以使用 SETSEED 函數。例如,重復執行以下兩個語句可以得到相同的隨機數:
-- PostgreSQL
SELECT SETSEED(0);
SELECT RANDOM();
SQLite 也提供了 RANDOM 函數,可以返回一個大于或等于-263 且小于或等于 263-1 的隨機整數。例如:
-- SQLite
SELECT RANDOM()
FROM employee
WHERE emp_id <= 3;
查詢返回的結果如下:
RANDOM()
--------------------
3344080139226703236
-4444734262945592004
8384000175497818543
對于 SQLite,每次調用 RANDOM 函數都會返回不同的隨機數。SQLite 不支持隨機數種子設置,無法重現相同的隨機數。
提示:除我們上面介紹的函數外,SQL 還提供其他的數值函數,例如乘方和開方函數、對數函數以及三角函數,有需要時可以查看數據庫相關的文檔。
該文章在 2024/3/15 14:53:52 編輯過