文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
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)

    傳回 e(自然對數的底數)的 X 次冪的值。此函數的反函數為 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

    如果使用兩個參數呼叫,此函數會傳回 XB 為底的對數。如果 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)

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

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

    LOG2() 對於找出數字需要多少位元來儲存非常有用。此函數等效於表示式 LOG(X) / LOG(2)

  • LOG10(X)

    傳回 X 的以 10 為底的對數。如果 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.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)

  • 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() 的說明。