SQLってテキストやテーブルだけじゃないんだ。実際のデータベースでは、価格、数量、スコア、パーセント、座標みたいな、つまり数字をよく扱うよ。想像してみて:
- 割引を計算して、合計金額を整数に丸めたいとき。
- 偶数/奇数の学生データを出したいとき。
- スコアの分析をして、分散の平方根を知りたいとき。
- または、スコア計算の式でべき乗を使いたいとき。
SQLなら、外部のプログラミング言語を使わなくても、こういうの全部クエリの中でできるんだ。組み込みの数学関数を使えばOK。今日は特によく使う6つを紹介するね:
ROUND()— 丸めCEIL()— 切り上げFLOOR()— 切り捨てMOD()— 割り算の余りPOWER()— べき乗SQRT()— 平方根
* 数字の丸め:ROUND()、CEIL()、FLOOR()*
小数(例えば4.67891)を扱うとき、結果を丸めたいことがよくあるよね。例えば平均点や注文の合計金額、割引率とかを計算するとき、小数点以下が多すぎると見た目が悪いし、混乱のもとになることも。
ROUND() — 数学的なルールで丸める
ROUND(数値 [, 桁数])
数値— 丸めたい数字。桁数(オプション) — 小数点以下に残す桁数。
例:
SELECT ROUND(4.67); -- 5
SELECT ROUND(4.6789, 2); -- 4.68
ROUND()は普通の数学の丸めと同じ:4.5 → 5、4.49 → 4。
お金やスコアをキレイに表示したいときに超便利:4.33333 → 4.33。
CEIL() — 切り上げて一番近い整数にする
SELECT CEIL(4.1); -- 5
- すでに整数なら、そのまま。
- 必ず元の値以上の整数を返す。
例えば、商品をページに分けて表示したいときに便利:21個の商品を1ページ10個で表示 → 3ページ必要。
FLOOR() — 切り捨て
SELECT FLOOR(4.9); -- 4
- 元の値以下の整数を返す。
値がどの「階」や「段」にいるかを知りたいときに使うよ。
比較:
| 値 | ROUND() | CEIL() | FLOOR() |
|---|---|---|---|
| 4.4 | 4 | 5 | 4 |
| 4.6 | 5 | 5 | 4 |
| -4.6 | -5 | -4 | -5 |
* 割り算の余り:MOD()*
余りって何に使うの?例えば:
- 数字が偶数かどうかチェックしたいとき。
- 行をパターンでグループ分けしたいとき(例:3チームに分ける)。
- 繰り返しのサイクルを作りたいとき(例:「5つごとに」)。
構文:
MOD(被除数, 除数)
例:
SELECT MOD(17, 5); -- 2 (3*5 +2)
SELECT MOD(10, 3); -- 1 (3*3 +1)
注意:余りの符号は最初の引数(被除数)の符号に依存するよ。
使い方:
SELECT student_id,
CASE WHEN MOD(student_id, 2) = 0 THEN '偶数' ELSE '奇数' END AS parity
FROM students;
* べき乗:POWER()*
ただ掛け算するだけじゃなくて、数式を使いたいとき:
- パーセント計算:
base * POWER(1 + rate, years) - 円の面積:
π * r^2 - 機械学習の式の重み付け
構文:
POWER(基数, 指数)
例:
SELECT POWER(2, 3); -- 8
SELECT POWER(5, 2); -- 25
SELECT POWER(9, 0.5); -- 3 (平方根)
この関数は整数も小数もマイナスもOK。
平方根:SQRT()
平方根を計算したいとき、特に統計(例えば標準偏差)でSQRT()が役立つよ。
SELECT SQRT(25); -- 5
SELECT SQRT(2); -- ~1.4142
マイナスの数を渡すとエラーになる。そうなりそうなときはABS()を使おう:
SELECT SQRT(ABS(-25)); -- 5
実用シナリオ
シナリオ1:注文合計金額の丸め
SELECT order_id, ROUND(total_price, 0) AS total_rounded
FROM orders;
シナリオ2:ページ数の計算
SELECT CEIL(COUNT(*) / 10.0) AS pages_needed
FROM products;
シナリオ3:学生を3グループに分ける
SELECT student_id,
MOD(student_id, 3) AS group_number
FROM students;
シナリオ4:平均二乗根
SELECT SQRT(AVG(POWER(score, 2))) AS root_mean_square
FROM grades;
よくあるミスとアドバイス
ROUND()は2つ目の引数も取れるよ。小数第2位まで丸めたいときは忘れずに。
MOD()はマイナスの数だと予想外の結果になることがある。
POWER()やSQRT()は小数も扱えるから、必要ならCAST()を使ってね。
SQRT()にマイナスが入らないように注意。入ると実行時エラーになるよ。
GO TO FULL VERSION