文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


14.6.2 數學函數

表 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

  • ABS(X)

    傳回 X 的絕對值,如果 XNULL,則傳回 NULL

    結果類型衍生自引數類型。這的一個含意是 ABS(-9223372036854775808) 會產生錯誤,因為結果無法儲存在帶正負號的 BIGINT 值中。

    mysql> SELECT ABS(2);
            -> 2
    mysql> SELECT ABS(-32);
            -> 32

    此函數可以安全地與 BIGINT 值一起使用。

  • ACOS(X)

    傳回 X 的反餘弦值,也就是餘弦值為 X 的值。如果 X 不在 -11 的範圍內,或者如果 XNULL,則傳回 NULL

    mysql> SELECT ACOS(1);
            -> 0
    mysql> SELECT ACOS(1.0001);
            -> NULL
    mysql> SELECT ACOS(0);
            -> 1.5707963267949
  • ASIN(X)

    傳回 X 的反正弦值,也就是正弦值為 X 的值。如果 X 不在 -11 的範圍內,或者如果 XNULL,則傳回 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' |
    +---------+------+-----------------------------------------+
  • ATAN(X)

    傳回 X 的反正切值,也就是正切值為 X 的值。如果 XNULL,則傳回 NULL

    mysql> SELECT ATAN(2);
            -> 1.1071487177941
    mysql> SELECT ATAN(-2);
            -> -1.1071487177941
  • ATAN(Y,X)ATAN2(Y,X)

    傳回兩個變數 XY 的反正切值。它類似於計算 Y / X 的反正切值,但會使用這兩個引數的符號來判斷結果的象限。如果 XYNULL,則傳回 NULL

    mysql> SELECT ATAN(-2,2);
            -> -0.78539816339745
    mysql> SELECT ATAN2(PI(),0);
            -> 1.5707963267949
  • CEIL(X)

    CEIL()CEILING() 的同義詞。

  • CEILING(X)

    傳回不小於 X 的最小整數值。如果 XNULL,則傳回 NULL

    mysql> SELECT CEILING(1.23);
            -> 2
    mysql> SELECT CEILING(-1.23);
            -> -1

    對於精確值數值引數,傳回值具有精確值數值類型。對於字串或浮點引數,傳回值具有浮點類型。

  • CONV(N,from_base,to_base)

    在不同的數字基底之間轉換數字。傳回數字 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'
  • COS(X)

    傳回 X 的餘弦值,其中 X 以弧度為單位。如果 XNULL,則傳回 NULL

    mysql> SELECT COS(PI());
            -> -1
  • COT(X)

    傳回 X 的餘切值。如果 XNULL,則傳回 NULL

    mysql> SELECT COT(12);
            -> -1.5726734063977
    mysql> SELECT COT(0);
            -> out-of-range error
  • CRC32(expr)

    計算循環冗餘檢查值,並傳回 32 位元不帶正負號的值。如果引數為 NULL,則結果為 NULL。引數應為字串,如果可能的話,如果不是字串,則會被視為字串。

    mysql> SELECT CRC32('MySQL');
            -> 3259397556
    mysql> SELECT CRC32('mysql');
            -> 2501908538
  • DEGREES(X)

    傳回從弧度轉換為度的引數 X。如果 XNULL,則傳回 NULL

    mysql> SELECT DEGREES(PI());
            -> 180
    mysql> SELECT DEGREES(PI() / 2);
            -> 90
  • EXP(X)

    傳回以 X 為冪的 e(自然對數的底數)值。此函數的反函數為 LOG()(僅使用單一引數)或 LN()

    如果 XNULL,則此函數傳回 NULL

    mysql> SELECT EXP(2);
            -> 7.3890560989307
    mysql> SELECT EXP(-2);
            -> 0.13533528323661
    mysql> SELECT EXP(0);
            -> 1
  • FLOOR(X)

    傳回不超過 X 的最大整數值。如果 XNULL,則傳回 NULL

    mysql> SELECT FLOOR(1.23), FLOOR(-1.23);
            -> 1, -2

    對於精確值數值引數,傳回值具有精確值數值類型。對於字串或浮點引數,傳回值具有浮點類型。

  • FORMAT(X,D)

    將數字 X 格式化為類似 '#,###,###.##' 的格式,四捨五入到 D 個小數位數,並將結果以字串形式傳回。如需詳細資訊,請參閱 第 14.8 節,「字串函數和運算子」

  • HEX(N_or_S)

    此函數可用來取得十進位數字或字串的十六進位表示法;其方式會根據引數的類型而有所不同。如需詳細資訊,請參閱第 14.8 節,「字串函數和運算子」中此函數的描述。

  • LN(X)

    傳回 X 的自然對數;也就是說,X 的以 e 為底的對數。如果 X 小於或等於 0.0E0,則函數會傳回 NULL,並報告警告對數的引數無效。如果 XNULL,則傳回 NULL

    mysql> SELECT LN(2);
            -> 0.69314718055995
    mysql> SELECT LN(-2);
            -> NULL

    此函數與 LOG(X) 同義。此函數的反函數為 EXP() 函數。

  • LOG(X), LOG(B,X)

    如果使用一個參數呼叫,此函數會傳回 X 的自然對數。如果 X 小於或等於 0.0E0,則函數會傳回 NULL,並報告警告對數的引數無效。如果 XBNULL,則傳回 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

    LOG(B,X) 等於 LOG(X) / LOG(B)

  • LOG2(X)

    傳回以 2 為底的 X 對數。如果 X 小於或等於 0.0E0,則函數會傳回 NULL,並報告警告對數的引數無效。如果 XNULL,則傳回 NULL

    mysql> SELECT LOG2(65536);
            -> 16
    mysql> SELECT LOG2(-100);
            -> NULL

    LOG2() 可用於找出數字需要多少位元才能儲存。此函數等同於運算式 LOG(X) / LOG(2)

  • LOG10(X)

    傳回以 10 為底的 X 對數。如果 X 小於或等於 0.0E0,則函數會傳回 NULL,並報告警告對數的引數無效。如果 XNULL,則傳回 NULL

    mysql> SELECT LOG10(2);
            -> 0.30102999566398
    mysql> SELECT LOG10(100);
            -> 2
    mysql> SELECT LOG10(-100);
            -> NULL

    LOG10(X) 等於 LOG(10,X)

  • MOD(N,M), N % M, N MOD M

    模數運算。傳回 N 除以 M 的餘數。如果 MNNULL,則傳回 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()

    傳回 π (pi) 的值。預設顯示的小數位數為 7 位,但 MySQL 在內部使用完整的雙精度值。

    由於此函數的傳回值是雙精度值,因此其確切表示法在不同的平台或實作中可能會有所不同。這也適用於任何使用 PI() 的運算式。請參閱第 13.1.4 節,「浮點類型(近似值)- FLOAT、DOUBLE」

    mysql> SELECT PI();
            -> 3.141593
    mysql> SELECT PI()+0.000000000000000000;
            -> 3.141592653589793000
  • POW(X,Y)

    傳回 XY 次方值。如果 XYNULL,則傳回 NULL

    mysql> SELECT POW(2,2);
            -> 4
    mysql> SELECT POW(2,-2);
            -> 0.25
  • POWER(X,Y)

    這是 POW() 的同義詞。

  • RADIANS(X)

    傳回從度轉換為弧度的引數 X。(請注意,π 弧度等於 180 度。)如果 XNULL,則傳回 NULL

    mysql> SELECT RADIANS(90);
            -> 1.5707963267949
  • RAND([N])

    傳回範圍 0 <= v < 1.0 內的隨機浮點數值 v。若要取得範圍 i <= R < j 內的隨機整數 R,請使用運算式 FLOOR(i + RAND() * (ji))。例如,若要取得範圍 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 BYGROUP 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 時使用此函式,則會記錄警告。

  • ROUND(X)ROUND(X,D)

    將引數 X 四捨五入到 D 個小數位數。四捨五入演算法取決於 X 的資料類型。如果未指定,D 預設為 0。D 可以是負數,使值 X 的小數點左側的 D 位數變成零。D 的最大絕對值為 30;超過 30(或 -30)的任何位數都會被截斷。如果 XDNULL,則函式傳回 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() 根據第一個引數的類型使用以下規則

    • 對於精確值數字,ROUND() 使用四捨五入遠離零四捨五入到最近的數規則:小數部分為 .5 或更大的值,如果為正數則四捨五入到下一個整數,如果為負數則四捨五入到下一個整數。(換句話說,它是四捨五入遠離零。)小數部分小於 .5 的值,如果為正數則四捨五入到下一個整數,如果為負數則四捨五入到下一個整數。

    • 對於近似值數字,結果取決於 C 程式庫。在許多系統上,這表示 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)

  • SIGN(X)

    根據 X 是負數、零或正數,傳回引數的符號,值為 -101。如果 XNULL,則傳回 NULL

    mysql> SELECT SIGN(-32);
            -> -1
    mysql> SELECT SIGN(0);
            -> 0
    mysql> SELECT SIGN(234);
            -> 1
  • SIN(X)

    傳回 X 的正弦值,其中 X 以弧度表示。如果 XNULL,則傳回 NULL

    mysql> SELECT SIN(PI());
            -> 1.2246063538224e-16
    mysql> SELECT ROUND(SIN(PI()));
            -> 0
  • SQRT(X)

    傳回非負數 X 的平方根。如果 XNULL,則函式傳回 NULL

    mysql> SELECT SQRT(4);
            -> 2
    mysql> SELECT SQRT(20);
            -> 4.4721359549996
    mysql> SELECT SQRT(-16);
            -> NULL
  • TAN(X)

    傳回 X 的正切值,其中 X 以弧度表示。如果 XNULL,則傳回 NULL

    mysql> SELECT TAN(PI());
            -> -1.2246063538224e-16
    mysql> SELECT TAN(PI()+1);
            -> 1.5574077246549
  • TRUNCATE(X,D)

    傳回數字 X,截斷為 D 個小數位數。如果 D0,則結果沒有小數點或小數部分。D 可以是負數,使值 X 的小數點左側的 D 位數變成零。如果 XDNULL,則函式傳回 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() 的描述。