Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

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) でエラーが発生することを意味します。

    Press CTRL+C to copy
    mysql> SELECT ABS(2); -> 2 mysql> SELECT ABS(-32); -> 32

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

  • ACOS(X)

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

    Press CTRL+C to copy
    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 を返します。

    Press CTRL+C to copy
    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 である値) を返します。

    Press CTRL+C to copy
    mysql> SELECT ATAN(2); -> 1.1071487177941 mysql> SELECT ATAN(-2); -> -1.1071487177941
  • ATAN(Y,X), ATAN2(Y,X)

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

    Press CTRL+C to copy
    mysql> SELECT ATAN(-2,2); -> -0.78539816339745 mysql> SELECT ATAN2(PI(),0); -> 1.5707963267949
  • CEIL(X)

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

  • CEILING(X)

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

    Press CTRL+C to copy
    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 ビット精度で動作します。

    Press CTRL+C to copy
    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 はラジアンで指定されます。

    Press CTRL+C to copy
    mysql> SELECT COS(PI()); -> -1
  • COT(X)

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

    Press CTRL+C to copy
    mysql> SELECT COT(12); -> -1.5726734063977 mysql> SELECT COT(0); -> out-of-range error
  • CRC32(expr)

    巡回冗長検査値を計算し、32 ビット値の符号なし値を返します。 引数が NULL である場合は、結果も NULL になります。 引数は文字列であると想定され、(可能な場合は) 文字列でない場合でも文字列として処理されます。

    Press CTRL+C to copy
    mysql> SELECT CRC32('MySQL'); -> 3259397556 mysql> SELECT CRC32('mysql'); -> 2501908538
  • DEGREES(X)

    ラジアンからディグリーに変換された引数 X を返します。

    Press CTRL+C to copy
    mysql> SELECT DEGREES(PI()); -> 180 mysql> SELECT DEGREES(PI() / 2); -> 90
  • EXP(X)

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

    Press CTRL+C to copy
    mysql> SELECT EXP(2); -> 7.3890560989307 mysql> SELECT EXP(-2); -> 0.13533528323661 mysql> SELECT EXP(0); -> 1
  • FLOOR(X)

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

    Press CTRL+C to copy
    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 を返し、「対数の引数が無効です」という警告が報告されます。

    Press CTRL+C to copy
    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() 関数です。

    Press CTRL+C to copy
    mysql> SELECT LOG(2); -> 0.69314718055995 mysql> SELECT LOG(-2); -> NULL

    この関数が 2 つのパラメータで呼び出される場合は、B を底とする X の対数が返されます。 X が 0 以下である場合、または B が 1 以下である場合は、NULL が返されます。

    Press CTRL+C to copy
    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 を返し、「対数の引数が無効です」という警告が報告されます。

    Press CTRL+C to copy
    mysql> SELECT LOG2(65536); -> 16 mysql> SELECT LOG2(-100); -> NULL

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

  • LOG10(X)

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

    Press CTRL+C to copy
    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 の余りを返します。

    Press CTRL+C to copy
    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() は、小数部を持つ値でも機能し、除算後の正確な余りを返します。

    Press CTRL+C to copy
    mysql> SELECT MOD(34.5,3); -> 1.5

    MOD(N,0)NULL を返します。

  • PI()

    π (pi) の値を返します。 表示されるデフォルトの小数点以下の桁数は 7 ですが、MySQL では内部的に全倍精度値が使用されます。

    Press CTRL+C to copy
    mysql> SELECT PI(); -> 3.141593 mysql> SELECT PI()+0.000000000000000000; -> 3.141592653589793116
  • POW(X,Y)

    XY 乗の値を返します。

    Press CTRL+C to copy
    mysql> SELECT POW(2,2); -> 4 mysql> SELECT POW(2,-2); -> 0.25
  • POWER(X,Y)

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

  • RADIANS(X)

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

    Press CTRL+C to copy
    mysql> SELECT RADIANS(90); -> 1.5707963267949
  • RAND([N])

    0 <= v < 1.0 の範囲内で、ランダムな浮動小数点値 v を返します。 i <= R < j の範囲内でランダムな整数 R を取得するには、式 FLOOR(i + RAND() * (ji)) を使用します。 たとえば、7 <=R < 12 の範囲のランダム整数を取得するには、次のステートメントを使用します:

    Press CTRL+C to copy
    SELECT FLOOR(7 + (RAND() * 5));

    整数引数 N が指定されている場合は、シード値として使用されます:

    • 定数イニシャライザ引数を使用すると、ステートメントの準備時に、実行前にシードが一度初期化されます。

    • 定数以外のイニシャライザ引数 (カラム名など) を使用すると、シードは RAND() の起動ごとに値で初期化されます。

    この動作の影響の 1 つは、等しい引数値の場合、RAND(N) は毎回同じ値を返すため、カラム値の繰返し可能なシーケンスを生成することです。 次の例では、RAND(3) によって生成される値の順序は両方とも同じです。

    Press CTRL+C to copy
    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() 式が同じ行に対して複数回評価され、毎回異なる結果が返されるため、予期しない結果になる可能性があります。 行をランダムな順序で取得することを目的としている場合は、次のようなステートメントを使用できます:

    Press CTRL+C to copy
    SELECT * FROM tbl_name ORDER BY RAND();

    一連の行からランダムサンプルを選択するには、ORDER BY RAND()LIMIT を組み合せます:

    Press CTRL+C to copy
    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) を超える桁は切り捨てられます。

    Press CTRL+C to copy
    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 であると想定)。 つまり、引数が整数の場合は、結果が整数 (小数点なし) になります。

    Press CTRL+C to copy
    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 つの整数の間に小数部がある値は、最も近い偶数の整数に丸められます。

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

    Press CTRL+C to copy
    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 として返します。

    Press CTRL+C to copy
    mysql> SELECT SIGN(-32); -> -1 mysql> SELECT SIGN(0); -> 0 mysql> SELECT SIGN(234); -> 1
  • SIN(X)

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

    Press CTRL+C to copy
    mysql> SELECT SIN(PI()); -> 1.2246063538224e-16 mysql> SELECT ROUND(SIN(PI())); -> 0
  • SQRT(X)

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

    Press CTRL+C to copy
    mysql> SELECT SQRT(4); -> 2 mysql> SELECT SQRT(20); -> 4.4721359549996 mysql> SELECT SQRT(-16); -> NULL
  • TAN(X)

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

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

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

    Press CTRL+C to copy
    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() の説明を参照してください。