表格 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
傳回 e(自然對數的底數)的
X
次冪的值。此函數的反函數為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
如果使用兩個參數呼叫,此函數會傳回
X
以B
為底的對數。如果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)傳回
X
的以 10 為底的對數。如果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.25 節,「精確數學」。
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()
的說明。