SAK 図書館
MySQL 編13 - 数値関数、余り、四捨五入、切り捨て、切り上げ、数値書式
■絶対値
・abs() 関数は、絶対値を返す。
select abs(-123);
+-----------+
| abs(-123) |
+-----------+
| 123 |
+-----------+
select key1, abs(data1) from testm;
■余り
・mod() 関数は、余りを返す。
select mod(123, 10);
+--------------+
| mod(123, 10) |
+--------------+
| 3 |
+--------------+
select key1, mod(data1, 10) from testm;
■四捨五入
・round() 関数は、四捨五入結果を返す。
【注意】round(10.345, 2) の結果は 10.35 になるはすが、10.34 が返って
くる。MySQL のバグ? round は信用できないものを感じた。
truncate(10.345 + .005, 2) を使用する方が無難かもしれない。
【追加情報】Banker's Rounding と呼ばれる規則で丸められているとのこと。
原則四捨五入だが、5 の時は、偶数側を選ぶとのことです。
select round(10.345, 2);
+------------------+
| round(10.345, 2) |
+------------------+
| 10.34 | **** おかしい!!
+------------------+
select truncate(10.345 + .005, 2);
+----------------------------+
| truncate(10.345 + .005, 2) |
+----------------------------+
| 10.35 |
+----------------------------+
select round(10.346, 2);
+------------------+
| round(10.346, 2) |
+------------------+
| 10.35 |
+------------------+
select key1, round(data1, 2) from testm;
■切り捨て
・truncate() 関数は、切り捨て結果を返す。
select truncate(10.349, 2);
+---------------------+
| truncate(10.349, 2) |
+---------------------+
| 10.34 |
+---------------------+
select key1, truncate(data1, 2) from testm;
■切り上げ
・truncate() に +9 すれば良いでしょう。
この例では、小数第 1 位を切り上げたと同じ結果になります。
select truncate(10.345 + .9, 0);
+--------------------------+
| truncate(10.345 + .9, 0) |
+--------------------------+
| 11 |
+--------------------------+
未満切り上げの場合は、+99... など工夫します。
次の例は、固定小数部 6 桁を小数部 2 桁未満で切り上げしています。
select truncate(10.345678 + .009999, 2);
+----------------------------------+
| truncate(10.345678 + .009999, 2) |
+----------------------------------+
| 10.35 |
+----------------------------------+
■以上で最小の整数
・ceil() 関数は、引数に対して、それ以上で、最小の整数値を返す。
マイナス値に対しては、四捨五入のように動作しないので注意のこと。
select
ceil(10.345), ceil(-10.345),
truncate(10.345 + .9, 0) t1, truncate(-10.345 + .9, 0) t2 -- 小数第一位切り上げ
;
+--------------+---------------+----+----+
| ceil(10.345) | ceil(-10.345) | t1 | t2 |
+--------------+---------------+----+----+
| 11 | -10 | 11 | -9 |
+--------------+---------------+----+----+
■以下で最大の整数
・floor() 関数は、引数に対して、それ以下で、最小の整数値を返す。
マイナス値に対しては、四捨五入のように動作しないので注意のこと。
select
floor(10.345), floor(-10.345),
truncate(10.345, 0) t1, truncate(-10.345, 0) t2
;
+---------------+----------------+----+-----+
| floor(10.345) | floor(-10.345) | t1 | t2 |
+---------------+----------------+----+-----+
| 10 | -11 | 10 | -10 |
+---------------+----------------+----+-----+
■スクエアルート
・sqrt() 関数は、平方根を返す。
select sqrt(2.0);
sqrt
-----------------
1.4142135623731
■べき乗
・pow() 関数は、べき乗を返す。
この例では、2^8 が返る。
select pow(2, 8);
+------------+
| pow(2, 8) |
+------------+
| 256.000000 |
+------------+
■数値から文字列へ変換 (数値フォーマット、書式変換)
・文字列としての結合は concat() を使用する。
select concat(123456, 789012);
+------------------------+
| concat(123456, 789012) |
+------------------------+
| 123456789012 |
+------------------------+
select concat('123456', 789012);
+--------------------------+
| concat('123456', 789012) |
+--------------------------+
| 123456789012 |
+--------------------------+
select concat('123456', '789012');
+----------------------------+
| concat('123456', '789012') |
+----------------------------+
| 123456789012 |
+----------------------------+
・三桁毎にカンマを付けるには、次のようにする。
select format(123456, 0);
+-------------------+
| format(123456, 0) |
+-------------------+
| 123,456 |
+-------------------+
select format(123456, 2);
+-------------------+
| format(123456, 2) |
+-------------------+
| 123,456.00 |
+-------------------+
■文字列から数値へ変換
・勝手にやるみたいです。
select '0123' + 100;
+--------------+
| '0123' + 100 |
+--------------+
| 223 |
+--------------+
select '0123' + '100';
+----------------+
| '0123' + '100' |
+----------------+
| 223 |
+----------------+
■型変換
・cast() 関数は、ANSI 規程の変換関数です。
select cast(concat('123', '456') as signed);
+--------------------------------------+
| cast(concat('123', '456') as signed) |
+--------------------------------------+
| 123456 |
+--------------------------------------+
select cast(concat('-123', '456') as unsigned);
+-----------------------------------------+
| cast(concat('-123', '456') as unsigned) |
+-----------------------------------------+
| 18446744073709428160 |
+-----------------------------------------+
select cast(123 + 100 as char);
+-------------------------+
| cast(123 + 100 as char) |
+-------------------------+
| 223 |
+-------------------------+
■MySQL 編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■SQL 基礎編資料
■SQL 基礎実地編資料
■SQL チューニング編資料
■Oracle PL/SQL 編資料