MySQL 8.0 リファレンスマニュアル


12.6.2 数学関数

表 12.10 「数学関数」

名前 説明
ABS() 絶対値を返します
ACOS() アークコサインを返します
ASIN() アークサインを返します
ATAN() アークタンジェントを返します
ATAN2(), ATAN() 2 つの引数のアークタンジェントを返します
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 を返します。

    結果の型は引数の型から導出されます。 これは、結果を署名付き BIGINT 値に格納できないため、ABS(-9223372036854775808) でエラーが発生することを意味します。

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

    この関数は、BIGINT 値でも安全に使用できます。

  • ACOS(X)

    X のアークコサイン (つまり、コサインが X である値) を返します。 X-1 から 1 までの範囲内にない場合は、NULL を返します。

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

    X のアークサイン (つまり、サインが X である値) を返します。 X-1 から 1 までの範囲内にない場合は、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 である値) を返します。

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

    2 つの変数 X および Y のアークタンジェントを返します。 これは、両方の引数の符号が結果の象限の判定に使用される点を除いて、Y / X のアークタンジェントの計算と同様です。

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

    CEIL()CEILING() のシノニムです。

  • CEILING(X)

    X 以上で最小の整数値を返します。

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

    引数が厳密値数値の場合は、戻り値の型も厳密値数値になります。 引数が文字列または浮動小数点の場合は、戻り値の型が浮動小数点になります。

  • CONV(N,from_base,to_base)

    数値を異なる基数間で変換します。 基数 from_base から基数 to_base に変換された数値 N の文字列表現を返します。 引数のいずれかが NULL である場合は、NULL を返します。 引数 N は整数として解釈されますが、整数または文字列として指定される場合もあります。 最小の基数は 2 で、最大の基数は 36 です。 from_base が負数の場合、N は符号付き数値とみなされます。 それ以外の場合は、N は符号なしとみなされます。 CONV() は 64 ビット精度で動作します。

    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 はラジアンで指定されます。

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

    X のコタンジェントを返します。

    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 を返します。

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

    e (自然対数の底) の X 乗の値を返します。 この関数の逆は、(単一の引数のみを使用する) LOG() または LN() です。

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

    X 以下で最大の整数値を返します。

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

    引数が厳密値数値の場合は、戻り値の型も厳密値数値になります。 引数が文字列または浮動小数点の場合は、戻り値の型が浮動小数点になります。

  • FORMAT(X,D)

    数値 X'#,###,###.##' のような書式に変換し、小数点第 D 位に丸めて、その結果を文字列として返します。 詳細は、セクション12.8「文字列関数および演算子」を参照してください。

  • HEX(N_or_S)

    この関数を使用すると、10 進数または文字列の 16 進表現を取得できます。その方法は、引数の型によって異なります。 詳細は、セクション12.8「文字列関数および演算子」で、この関数の説明を参照してください。

  • LN(X)

    X の自然対数 (つまり、X の底 e の対数) を返します。 X が 0.0 E0 以下の場合、この関数は NULL を返し、「対数の引数が無効です」という警告が報告されます。

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

    この関数は LOG(X) のシノニムです。 この関数の逆は、EXP() 関数です。

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

    1 つのパラメータで呼び出される場合、この関数は X の自然対数を返します。 X が 0.0 E0 以下の場合、この関数は NULL を返し、「対数の引数が無効です」という警告が報告されます。

    この関数 (単一の引数で呼び出された場合) の逆は、EXP() 関数です。

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

    この関数が 2 つのパラメータで呼び出される場合は、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)

    X の底 2 の対数を返します。 X が 0.0 E0 以下の場合、この関数は NULL を返し、「対数の引数が無効です」という警告が報告されます。

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

    LOG2() は、格納に必要なビット数を調べる際に役立ちます。 この関数は式 LOG(X) / LOG(2) と同等です。

  • LOG10(X)

    X の底 10 の対数を返します。 X が 0.0 E0 以下の場合、この関数は 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

    モジュロ演算。 M で除算された N の余りを返します。

    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 では内部的に全倍精度値が使用されます。

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

    XY 乗の値を返します。

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

    これは POW() のシノニムです。

  • RADIANS(X)

    ディグリーからラジアンに変換された引数 X を返します。 (ラジアンは 180 度になります。)

    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() の起動ごとに値で初期化されます。

    この動作の影響の 1 つは、等しい引数値の場合、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() は定数値ではなく、インデックスの最適化に使用できません。 詳細は、セクション8.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_formatSTATEMENT に設定されているときに、この関数を使用すると、警告のログが記録されます。

  • ROUND(X), ROUND(X,D)

    引数 XD 小数点に丸めます。 丸めアルゴリズムは、X のデータ型に依存します。 D が指定されていない場合は、デフォルトで 0 に設定されます。 D を負の数に指定すると、値 X の小数点左側の D 桁をゼロにすることができます。 D の最大絶対値は 30 です。30 (または -30) を超える桁は切り捨てられます。

    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

    戻り値の型は、最初の引数と同じです (integer、double または decimal であると想定)。 つまり、引数が整数の場合は、結果が整数 (小数点なし) になります。

    mysql> SELECT ROUND(150.000,2), ROUND(150,2);
    +------------------+--------------+
    | ROUND(150.000,2) | ROUND(150,2) |
    +------------------+--------------+
    |           150.00 |          150 |
    +------------------+--------------+

    ROUND() では、第 1 引数の型に応じて次のルールが使用されます。

    • 真値の数字の場合、ROUND() では四捨五入または切り捨て (切り上げ) ルールが使用されます。0.5 以上の小数部を持つ値は、正の場合は次の整数に切り上げられ、負の場合は次の整数に切り下げられます。 (つまり、ゼロから遠い方に丸められます。) 0.5 未満の小数部を持つ値は、正の場合は次の整数に切り下げられ、負の場合は次の整数に切り上げられます。

    • 近似値の数字の場合、結果は C ライブラリによって異なります。 多くのシステムでは、これは ROUND()「最も近い偶数に丸める」ルールを使用することを意味: 2 つの整数の間に小数部がある値は、最も近い偶数の整数に丸められます。

    次の例では、正確な値の丸めと近似値の丸めの相違点を示します。

    mysql> SELECT ROUND(2.5), ROUND(25E-1);
    +------------+--------------+
    | ROUND(2.5) | ROUND(25E-1) |
    +------------+--------------+
    | 3          |            2 |
    +------------+--------------+

    詳細は、セクション12.25「高精度計算」を参照してください。

    MySQL 8.0.21 以降では、ROUND() (および TRUNCATE()) によって返されるデータ型は、次に示すルールに従って決定されます:

    • 最初の引数が任意の整数型の場合、戻り型は常に BIGINT です。

    • 最初の引数が浮動小数点型または非数値型の場合、戻り型は常に DOUBLE です。

    • 最初の引数が DECIMAL 値の場合、戻り型も DECIMAL です。

    • 戻り値の型属性も最初の引数からコピーされますが、DECIMAL の場合は、2 番目の引数が定数値の場合を除きます。

      小数点以下の桁数が引数の位取りより小さい場合は、結果の位取りと精度が適宜調整されます。

      また、ROUND() (TRUNCATE() 関数ではありません) の場合、精度は、有効桁数を増やす端数処理に対応するために 1 箇所まで拡張されます。 2 番目の引数が負の場合、戻り値の型は、対応する精度でスケールが 0 になるように調整されます。 たとえば、ROUND(99.999, 2)100.00 を返します。最初の引数は DECIMAL(5, 3) で、戻り値の型は DECIMAL(5, 2) です。

      2 番目の引数が負の場合、戻り値の型はスケール 0 および対応する精度を持ち、ROUND(99.999, -1)100 (DECIMAL(3, 0)) を返します。

  • SIGN(X)

    X が負、ゼロ、または正のいずれであるのかに応じて、引数の符号を -10、または 1 として返します。

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

    X のサインを返します。X はラジアンで指定されます。

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

    負ではない数字 X の平方根を返します。

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

    X のタンジェントを返します。X はラジアンで指定されます。

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

    D 小数点に切り捨てて、数字 X を返します。 D0 の場合は、結果に小数点または小数部が含まれません。 D を負の数に指定すると、値 X の小数点左側の D 桁をゼロにすることができます。

    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

    すべての数字は、ゼロ方向に丸められます。

    MySQL 8.0.21 以降では、TRUNCATE() によって返されるデータ型は、ROUND() 関数の戻り型を決定するものと同じルールに従います。詳細は、ROUND() の説明を参照してください。


関連キーワード:  関数, ROUND, RAND, 整数, 小数点, LOG, 数値, 空間, TRUNCATE, リファレンス