表 14.10 數學函數
名稱 | 描述 |
---|---|
ABS() |
傳回絕對值 |
ACOS() |
傳回反餘弦值 |
ASIN() |
傳回反正弦值 |
ATAN() |
傳回反正切值 |
ATAN2() 、ATAN() |
傳回兩個引數的反正切值 |
CEIL() |
傳回不小於引數的最小整數值 |
CEILING() |
傳回不小於引數的最小整數值 |
CONV() |
在不同進位制之間轉換數字 |
COS() |
傳回餘弦值 |
COT() |
傳回餘切值 |
CRC32() |
計算循環冗餘檢查值 |
DEGREES() |
將弧度轉換為度 |
EXP() |
求冪 |
FLOOR() |
傳回不大於引數的最大整數值 |
LN() |
傳回引數的自然對數 |
LOG() |
傳回第一個引數的自然對數 |
LOG10() |
傳回引數的 10 底對數 |
LOG2() |
傳回引數的 2 底對數 |
MOD() |
傳回餘數 |
PI() |
傳回 pi 的值 |
POW() |
傳回引數的指定次方 |
POWER() |
傳回引數的指定次方 |
RADIANS() |
傳回轉換為弧度的引數 |
RAND() |
傳回隨機浮點數值 |
ROUND() |
將引數四捨五入 |
SIGN() |
傳回引數的符號 |
SIN() |
傳回引數的正弦值 |
SQRT() |
傳回引數的平方根 |
TAN() |
傳回引數的正切值 |
TRUNCATE() |
截斷到指定的小數位數 |
所有數學函數在發生錯誤時都會傳回 NULL
。
傳回
X
的絕對值,如果X
為NULL
,則傳回NULL
。結果類型衍生自引數類型。這的一個含意是
ABS(-9223372036854775808)
會產生錯誤,因為結果無法儲存在帶正負號的BIGINT
值中。mysql> SELECT ABS(2); -> 2 mysql> SELECT ABS(-32); -> 32
此函數可以安全地與
BIGINT
值一起使用。傳回
X
的反餘弦值,也就是餘弦值為X
的值。如果X
不在-1
到1
的範圍內,或者如果X
為NULL
,則傳回NULL
。mysql> SELECT ACOS(1); -> 0 mysql> SELECT ACOS(1.0001); -> NULL mysql> SELECT ACOS(0); -> 1.5707963267949
傳回
X
的反正弦值,也就是正弦值為X
的值。如果X
不在-1
到1
的範圍內,或者如果X
為NULL
,則傳回NULL
。mysql> SELECT ASIN(0.2); -> 0.20135792079033 mysql> SELECT ASIN('foo'); +-------------+ | ASIN('foo') | +-------------+ | 0 | +-------------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS; +---------+------+-----------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------+ | Warning | 1292 | Truncated incorrect DOUBLE value: 'foo' | +---------+------+-----------------------------------------+
傳回
X
的反正切值,也就是正切值為X
的值。如果X
為NULL
,則傳回NULL
。mysql> SELECT ATAN(2); -> 1.1071487177941 mysql> SELECT ATAN(-2); -> -1.1071487177941
傳回兩個變數
X
和Y
的反正切值。它類似於計算
的反正切值,但會使用這兩個引數的符號來判斷結果的象限。如果Y
/X
X
或Y
為NULL
,則傳回NULL
。mysql> SELECT ATAN(-2,2); -> -0.78539816339745 mysql> SELECT ATAN2(PI(),0); -> 1.5707963267949
傳回不小於
X
的最小整數值。如果X
為NULL
,則傳回NULL
。mysql> SELECT CEILING(1.23); -> 2 mysql> SELECT CEILING(-1.23); -> -1
對於精確值數值引數,傳回值具有精確值數值類型。對於字串或浮點引數,傳回值具有浮點類型。
在不同的數字基底之間轉換數字。傳回數字
N
的字串表示法,從基底from_base
轉換為基底to_base
。如果任何引數為NULL
,則傳回NULL
。引數N
會被解譯為整數,但可以指定為整數或字串。最小基底為2
,最大基底為36
。如果from_base
為負數,則N
會被視為帶正負號的數字。否則,N
會被視為不帶正負號的數字。CONV()
以 64 位元精確度運作。如果
CONV()
的任何引數為NULL
,則傳回NULL
。mysql> SELECT CONV('a',16,2); -> '1010' mysql> SELECT CONV('6E',18,8); -> '172' mysql> SELECT CONV(-17,10,-18); -> '-H' mysql> SELECT CONV(10+'10'+'10'+X'0a',10,10); -> '40'
傳回
X
的餘弦值,其中X
以弧度為單位。如果X
為NULL
,則傳回NULL
。mysql> SELECT COS(PI()); -> -1
傳回
X
的餘切值。如果X
為NULL
,則傳回NULL
。mysql> SELECT COT(12); -> -1.5726734063977 mysql> SELECT COT(0); -> out-of-range error
計算循環冗餘檢查值,並傳回 32 位元不帶正負號的值。如果引數為
NULL
,則結果為NULL
。引數應為字串,如果可能的話,如果不是字串,則會被視為字串。mysql> SELECT CRC32('MySQL'); -> 3259397556 mysql> SELECT CRC32('mysql'); -> 2501908538
傳回從弧度轉換為度的引數
X
。如果X
為NULL
,則傳回NULL
。mysql> SELECT DEGREES(PI()); -> 180 mysql> SELECT DEGREES(PI() / 2); -> 90
傳回以
X
為冪的 e(自然對數的底數)值。此函數的反函數為LOG()
(僅使用單一引數)或LN()
。如果
X
為NULL
,則此函數傳回NULL
。mysql> SELECT EXP(2); -> 7.3890560989307 mysql> SELECT EXP(-2); -> 0.13533528323661 mysql> SELECT EXP(0); -> 1
傳回不超過
X
的最大整數值。如果X
為NULL
,則傳回NULL
。mysql> SELECT FLOOR(1.23), FLOOR(-1.23); -> 1, -2
對於精確值數值引數,傳回值具有精確值數值類型。對於字串或浮點引數,傳回值具有浮點類型。
將數字
X
格式化為類似'#,###,###.##'
的格式,四捨五入到D
個小數位數,並將結果以字串形式傳回。如需詳細資訊,請參閱 第 14.8 節,「字串函數和運算子」。此函數可用來取得十進位數字或字串的十六進位表示法;其方式會根據引數的類型而有所不同。如需詳細資訊,請參閱第 14.8 節,「字串函數和運算子」中此函數的描述。
傳回
X
的自然對數;也就是說,X
的以 e 為底的對數。如果X
小於或等於 0.0E0,則函數會傳回NULL
,並報告警告「對數的引數無效」。如果X
為NULL
,則傳回NULL
。mysql> SELECT LN(2); -> 0.69314718055995 mysql> SELECT LN(-2); -> NULL
如果使用一個參數呼叫,此函數會傳回
X
的自然對數。如果X
小於或等於 0.0E0,則函數會傳回NULL
,並報告警告「對數的引數無效」。如果X
或B
為NULL
,則傳回NULL
。此函數的反函數(以單一引數呼叫時)為
EXP()
函數。mysql> SELECT LOG(2); -> 0.69314718055995 mysql> SELECT LOG(-2); -> NULL
如果使用兩個參數呼叫,此函數會傳回以
B
為底的X
對數。如果X
小於或等於 0,或者如果B
小於或等於 1,則會傳回NULL
。mysql> SELECT LOG(2,65536); -> 16 mysql> SELECT LOG(10,100); -> 2 mysql> SELECT LOG(1,100); -> NULL
傳回以 2 為底的
對數。如果X
X
小於或等於 0.0E0,則函數會傳回NULL
,並報告警告「對數的引數無效」。如果X
為NULL
,則傳回NULL
。mysql> SELECT LOG2(65536); -> 16 mysql> SELECT LOG2(-100); -> NULL
LOG2()
可用於找出數字需要多少位元才能儲存。此函數等同於運算式LOG(
。X
) / LOG(2)傳回以 10 為底的
X
對數。如果X
小於或等於 0.0E0,則函數會傳回NULL
,並報告警告「對數的引數無效」。如果X
為NULL
,則傳回NULL
。mysql> SELECT LOG10(2); -> 0.30102999566398 mysql> SELECT LOG10(100); -> 2 mysql> SELECT LOG10(-100); -> NULL
模數運算。傳回
N
除以M
的餘數。如果M
或N
為NULL
,則傳回NULL
。mysql> SELECT MOD(234, 10); -> 4 mysql> SELECT 253 % 7; -> 1 mysql> SELECT MOD(29,9); -> 2 mysql> SELECT 29 MOD 9; -> 2
此函數可以安全地與
BIGINT
值一起使用。MOD()
也適用於具有小數部分的值,並傳回除法後精確的餘數mysql> SELECT MOD(34.5,3); -> 1.5
MOD(
傳回N
,0)NULL
。傳回 π (pi) 的值。預設顯示的小數位數為 7 位,但 MySQL 在內部使用完整的雙精度值。
由於此函數的傳回值是雙精度值,因此其確切表示法在不同的平台或實作中可能會有所不同。這也適用於任何使用
PI()
的運算式。請參閱第 13.1.4 節,「浮點類型(近似值)- FLOAT、DOUBLE」。mysql> SELECT PI(); -> 3.141593 mysql> SELECT PI()+0.000000000000000000; -> 3.141592653589793000
傳回
X
的Y
次方值。如果X
或Y
為NULL
,則傳回NULL
。mysql> SELECT POW(2,2); -> 4 mysql> SELECT POW(2,-2); -> 0.25
這是
POW()
的同義詞。傳回從度轉換為弧度的引數
X
。(請注意,π 弧度等於 180 度。)如果X
為NULL
,則傳回NULL
。mysql> SELECT RADIANS(90); -> 1.5707963267949
傳回範圍
0
<=v
<1.0
內的隨機浮點數值v
。若要取得範圍i
<=R
<j
內的隨機整數R
,請使用運算式FLOOR(
−i
+ RAND() * (j
。例如,若要取得範圍i
))7
<=R
<12
內的隨機整數,請使用下列陳述式SELECT FLOOR(7 + (RAND() * 5));
如果指定整數引數
N
,則會將其用作種子值使用常數初始值設定項引數時,種子會在陳述式準備執行之前初始化一次。
當使用非常數的初始值引數(例如欄位名稱)時,
RAND()
的每次調用都會使用不同的值來初始化種子。
此行為的一個含義是,對於相等的引數值,
RAND(
每次都會傳回相同的值,因此會產生可重複的欄位值序列。在以下範例中,N
)RAND(3)
所產生的值序列在其出現的兩個地方是相同的。mysql> CREATE TABLE t (i INT); Query OK, 0 rows affected (0.42 sec) mysql> INSERT INTO t VALUES(1),(2),(3); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT i, RAND() FROM t; +------+------------------+ | i | RAND() | +------+------------------+ | 1 | 0.61914388706828 | | 2 | 0.93845168309142 | | 3 | 0.83482678498591 | +------+------------------+ 3 rows in set (0.00 sec) mysql> SELECT i, RAND(3) FROM t; +------+------------------+ | i | RAND(3) | +------+------------------+ | 1 | 0.90576975597606 | | 2 | 0.37307905813035 | | 3 | 0.14808605345719 | +------+------------------+ 3 rows in set (0.00 sec) mysql> SELECT i, RAND() FROM t; +------+------------------+ | i | RAND() | +------+------------------+ | 1 | 0.35877890638893 | | 2 | 0.28941420772058 | | 3 | 0.37073435016976 | +------+------------------+ 3 rows in set (0.00 sec) mysql> SELECT i, RAND(3) FROM t; +------+------------------+ | i | RAND(3) | +------+------------------+ | 1 | 0.90576975597606 | | 2 | 0.37307905813035 | | 3 | 0.14808605345719 | +------+------------------+ 3 rows in set (0.01 sec)
在
WHERE
子句中的RAND()
會針對每一列(當從單一資料表選取時)或列的組合(當從多個資料表聯結選取時)進行評估。因此,就最佳化工具而言,RAND()
不是常數值,不能用於索引最佳化。如需更多資訊,請參閱 第 10.2.1.20 節「函式呼叫最佳化」。在
ORDER BY
或GROUP BY
子句中使用具有RAND()
值的欄位可能會產生非預期的結果,因為對於任何子句,RAND()
表達式可能會針對同一列評估多次,每次傳回不同的結果。如果目標是以隨機順序擷取列,您可以使用如下的陳述式SELECT * FROM tbl_name ORDER BY RAND();
若要從一組列中選取隨機樣本,請將
ORDER BY RAND()
與LIMIT
結合使用SELECT * FROM table1, table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000;
RAND()
並非設計為完美的隨機產生器。它是一種快速產生隨機數的方法,並且在相同 MySQL 版本中,可在不同平台之間移植。此函式對於基於陳述式的複製是不安全的。如果當
binlog_format
設定為STATEMENT
時使用此函式,則會記錄警告。將引數
X
四捨五入到D
個小數位數。四捨五入演算法取決於X
的資料類型。如果未指定,D
預設為 0。D
可以是負數,使值X
的小數點左側的D
位數變成零。D
的最大絕對值為 30;超過 30(或 -30)的任何位數都會被截斷。如果X
或D
為NULL
,則函式傳回NULL
。mysql> SELECT ROUND(-1.23); -> -1 mysql> SELECT ROUND(-1.58); -> -2 mysql> SELECT ROUND(1.58); -> 2 mysql> SELECT ROUND(1.298, 1); -> 1.3 mysql> SELECT ROUND(1.298, 0); -> 1 mysql> SELECT ROUND(23.298, -1); -> 20 mysql> SELECT ROUND(.12345678901234567890123456789012345, 35); -> 0.123456789012345678901234567890
傳回值與第一個引數具有相同的類型(假設它是整數、倍精準度或十進位)。這表示對於整數引數,結果是一個整數(沒有小數位數)
mysql> SELECT ROUND(150.000,2), ROUND(150,2); +------------------+--------------+ | ROUND(150.000,2) | ROUND(150,2) | +------------------+--------------+ | 150.00 | 150 | +------------------+--------------+
ROUND()
根據第一個引數的類型使用以下規則以下範例顯示精確值和近似值的四捨五入方式有何不同
mysql> SELECT ROUND(2.5), ROUND(25E-1); +------------+--------------+ | ROUND(2.5) | ROUND(25E-1) | +------------+--------------+ | 3 | 2 | +------------+--------------+
如需更多資訊,請參閱 第 14.24 節「精確度數學」。
ROUND()
(和TRUNCATE()
)傳回的資料類型是根據此處列出的規則判定的當第一個引數為任何整數類型時,傳回類型永遠是
BIGINT
。當第一個引數為任何浮點類型或任何非數值類型時,傳回類型永遠是
DOUBLE
。當第一個引數為
DECIMAL
值時,傳回類型也是DECIMAL
。傳回值的類型屬性也會從第一個引數複製,但當第二個引數為常數值時的
DECIMAL
除外。當所需的小數位數小於引數的有效位數時,結果的有效位數和精確度會相應調整。
此外,對於
ROUND()
(但對於TRUNCATE()
函式則否),精確度會擴展一位,以容納增加有效位數的四捨五入。如果第二個引數為負數,則會調整傳回類型,使其有效位數為 0,並具有相應的精確度。例如,ROUND(99.999, 2)
傳回100.00
,第一個引數為DECIMAL(5, 3)
,而傳回類型為DECIMAL(5, 2)
。如果第二個引數為負數,則傳回類型的有效位數為 0,且具有相應的精確度;
ROUND(99.999, -1)
傳回100
,這是DECIMAL(3, 0)
。
根據
X
是負數、零或正數,傳回引數的符號,值為-1
、0
或1
。如果X
為NULL
,則傳回NULL
。mysql> SELECT SIGN(-32); -> -1 mysql> SELECT SIGN(0); -> 0 mysql> SELECT SIGN(234); -> 1
傳回
X
的正弦值,其中X
以弧度表示。如果X
為NULL
,則傳回NULL
。mysql> SELECT SIN(PI()); -> 1.2246063538224e-16 mysql> SELECT ROUND(SIN(PI())); -> 0
傳回非負數
X
的平方根。如果X
為NULL
,則函式傳回NULL
。mysql> SELECT SQRT(4); -> 2 mysql> SELECT SQRT(20); -> 4.4721359549996 mysql> SELECT SQRT(-16); -> NULL
傳回
X
的正切值,其中X
以弧度表示。如果X
為NULL
,則傳回NULL
。mysql> SELECT TAN(PI()); -> -1.2246063538224e-16 mysql> SELECT TAN(PI()+1); -> 1.5574077246549
傳回數字
X
,截斷為D
個小數位數。如果D
為0
,則結果沒有小數點或小數部分。D
可以是負數,使值X
的小數點左側的D
位數變成零。如果X
或D
為NULL
,則函式傳回NULL
。mysql> SELECT TRUNCATE(1.223,1); -> 1.2 mysql> SELECT TRUNCATE(1.999,1); -> 1.9 mysql> SELECT TRUNCATE(1.999,0); -> 1 mysql> SELECT TRUNCATE(-1.999,1); -> -1.9 mysql> SELECT TRUNCATE(122,-2); -> 100 mysql> SELECT TRUNCATE(10.28*100,0); -> 1028
所有數字都向零捨入。
TRUNCATE()
傳回的資料類型遵循與判斷ROUND()
函式傳回類型相同的規則;如需詳細資訊,請參閱ROUND()
的描述。