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