Q1次のうち、SELECT ROUND(3.84); の結果として正しいものはどれですか。
関数 ③ — 数学関数(ROUND / FLOOR / CEILING)と COALESCE
SQL の関数記事 3 本目です。ROUND / FLOOR / CEILING / POWER の数学関数と、NULL でない最初の値を返す COALESCE を、CSV の社員・テストスコアデータで動かしながら学べます。
本記事で使うデータ — staff と test_score
関数記事の最後は 数学関数 と COALESCE です。数学関数では salary 列のような数値の 四捨五入・切り捨て・切り上げ・べき乗 を、COALESCE では NULL を別の値に置き換える 書き方を扱います。
本記事では 2 つの CSV を使い分けます。前半の数学関数は前回までと同じ staff テーブル(社員 10 名)、後半の COALESCE は新たに test_score テーブル(学生 8 名 / テスト 1〜3 回 / NULL を含む)を読み込みます。test_score の score_1 / score_2 / score_3 には欠席のため未受験のセルが NULL として入っており、「最初に受験できたテストの点数を最終評価とする」のような実務シナリオで COALESCE の使い方を学びます。
数学関数 — ROUND / FLOOR / CEILING / POWER
数値を整える代表的な関数は次の 4 つです。
- ROUND(x, n): 小数点以下 n 桁で 四捨五入。n を省略すると整数に丸める
- FLOOR(x): 切り捨て(負の無限大方向に丸める)
- CEILING(x) または CEIL(x): 切り上げ(正の無限大方向に丸める)
- POWER(x, y): べき乗(x の y 乗)
-- 1) ROUND: 四捨五入
SELECT ROUND(3.14); -- 3 (整数)
SELECT ROUND(3.14, 1); -- 3.1 (小数点以下 1 桁)
-- 2) FLOOR: 切り捨て
SELECT FLOOR(3.84); -- 3
-- ※ CEILING は MySQL / PostgreSQL / Oracle / SQL Server で SELECT CEILING(3.14); → 4 を返す
-- 3) POWER: べき乗
SELECT POWER(3, 4); -- 81 (3 の 4 乗)
SELECT POWER(2, 10); -- 1024
-- 4) 列を使った例 — 月給を四捨五入
SELECT name, salary, ROUND(salary / 12.0) AS monthly
FROM staff;
| 入力 | ROUND (四捨五入) | FLOOR (切り捨て) | CEILING (切り上げ / 本講座のコンソールでは未対応) |
|---|---|---|---|
| 3.14 | 3 | 3 | 4 |
| 3.84 | 4 | 3 | 4 |
| 3.50 | 4 | 3 | 4 |
| -3.14 | -3 | -4 (負方向) | -3 |
COALESCE — NULL でない最初の値を返す
`COALESCE(値1, 値2, 値3, ...)` は、引数を左から順に評価し、最初の NULL でない値 を返す関数です。すべて NULL なら NULL を返します。「メインの列に値があればそれを、なければ予備の列を、それも無ければデフォルト値を」という NULL の代替値 を取り出すパターンで使います。
本記事では test_score テーブルを題材にします。student_id ごとに score_1 / score_2 / score_3(1 回目〜3 回目のテスト点数)が並び、欠席で未受験の回は NULL になっています。COALESCE で (score_1, score_2, score_3, 0) を渡すと、初めて受験できたテストの点数 を「最終評価点」として取り出せます。0 を末尾に置けば「全部欠席なら 0 点扱い」になります。
-- 1) リテラルでの確認
SELECT COALESCE(NULL, NULL, 'C'); -- 'C'
SELECT COALESCE(NULL, NULL, NULL); -- NULL
-- 2) test_score テーブルで最終評価点を取り出す
SELECT student_id, name, score_1, score_2, score_3,
COALESCE(score_1, score_2, score_3) AS first_score
FROM test_score;
-- 3) デフォルト値で「全部欠席なら 0 点」にする
SELECT student_id, name,
COALESCE(score_1, score_2, score_3, 0) AS final_score
FROM test_score;
2 引数版は IFNULL でも書ける
「NULL ならデフォルト値、そうでなければ元の値」のような 2 引数だけの NULL 置換 なら、IFNULL(列, デフォルト) でも同じ意味になります(本講座のコンソール / MySQL の両方でサポート)。たとえば COALESCE(email, '未登録') と IFNULL(email, '未登録') は完全に同じ結果です。
3 引数以上が必要なときは COALESCE を使います。COALESCE は SQL 標準なので、PostgreSQL / Oracle / SQL Server などでも同じ書き方が通用し、移植性が高い選択になります。
理解度チェック
まずは1問ずつ答えてみましょう。
Q2SELECT FLOOR(3.84), CEILING(3.14); の結果として正しいものはどれですか。
Q3SELECT COALESCE(NULL, NULL, 'C', 'D'); の結果として正しいものはどれですか。