文系出身がゼロからSQLを学んでみた 〜NULL・条件分岐・型変換編〜
はじめに
SQLを学び始めた当初、関数の種類の多さに圧倒されました。
また、その関数をなぜ使うのかなど疑問に感じる点が多くありました。
この記事では、特に初心者がハマりやすいと思ったところだけに絞ってまとめます。
具体的には、NULL・COALESCE・NULLIF・CASE・CAST の5つの概念・関数について解説します。
NULLとは
NULLは値が存在しない状態のことです。
0や空白との違いに最初はかなり混乱しました。
0→ 値はある、ゼロという数値''(空文字)→ 値はある、ただし空っぽの文字列NULL→ 値そのものがない
イメージとしては、アンケートに例えるとわかりやすいです。
- 年齢の欄に「0」と書いた → 0歳という答えがある
- 年齢の欄に何も書かなかった → 答えがそもそも存在しない(NULL)
空白ではなく存在しないという感覚が大事です。
NULLが混ざった計算
この違いが特に重要になるのが計算のときです。
SELECT 10 + NULL; # 結果: NULL
SELECT 10 + 0; # 結果: 10
SELECT 10 * NULL; # 結果: NULL
SELECT 10 * 0; # 結果: 0
NULLは「不明な値」なので、何を足しても掛けても結果がNULLになります。
「不明な値に10を足す→ 不明」となります。
また、AVG(平均)などの集計関数はNULLを無視して計算するため、NULLのユーザーが何人いても平均値には影響しません。
一見問題なさそうですが、「全員の平均を出したかったのに、未入力の人が除外されていた」という状況になることがあります。
集計結果が想定より少ない件数になっていたら、NULLが原因のことがよくあります。
NULLの比較
もう一つハマりやすいのが、NULLの比較です。
# NULLを探したいとき
SELECT * FROM users WHERE age = NULL; # 結果が返ってこない
SELECT * FROM users WHERE age IS NULL; # これが正しい
= NULL と書いても条件に一致しません。
NULLは「不明な値」なので、「不明 = 不明」が成り立ちません。
NULLかどうかを調べたいときは必ず IS NULL または IS NOT NULL を使います。
SELECT * FROM users WHERE age IS NULL; # NULLの行を取得
SELECT * FROM users WHERE age IS NOT NULL; # NULLではない行を取得
COALESCE と NULLIF
NULLをそのまま表示すると見た目が悪かったり、計算が狂ったりするので、専用の関数で対処します。
COALESCEとNULLIFはやってることが真逆なので、セットで覚えるのがおすすめです。
COALESCE
SELECT COALESCE(name, '未登録') FROM users;
nameがNULLなら'未登録'を返し、NULLでなければそのままnameを返します。
「NULLだったときの保険」のようなイメージです。
実際の場面だとこういうときに使います。
# ポイントが未設定(NULL)のユーザーは0として表示したい
SELECT name, COALESCE(points, 0) AS points FROM users;
| name | points(元データ) | 表示結果 |
|---|---|---|
| 田中 | 150 | 150 |
| 佐藤 | NULL | 0 |
| 鈴木 | 80 | 80 |
NULLのまま集計すると計算がおかしくなることがあるので、COALESCEで0に変えてから使うのがよくあるパターンです。
COALESCEは3つ以上の値を渡すこともできます。
# nicknameがNULLならnameを、それもNULLなら'名無し'を返す
SELECT COALESCE(nickname, name, '名無し') FROM users;
| nickname | name | 結果 |
|---|---|---|
| NULL | 田中 | 田中 |
| あだ名 | 田中 | あだ名 |
| NULL | NULL | 名無し |
左から順に評価して、最初にNULLでない値が返ります。
NULLIF
NULLIFはCOALESCEとは逆で、特定の値をNULLとして扱いたいときに使います。
SELECT NULLIF(score, 0) FROM tests;
scoreが0なら NULLを返し、0以外ならそのままscoreを返します。
なぜわざわざNULLに変えるのかと最初は疑問に思いましたが、以下のような場面で役立ちます。
# 0割りを防ぎたいとき
SELECT total / NULLIF(count, 0) FROM stats;
countが0のとき、そのまま割り算すると「0で割った」エラーになります。
NULLIFでcountが0のときだけNULLに変えておけば、結果がNULLになるだけでエラーを回避できます。
CASE
条件によって表示を切り替えたいときはCASEを使います。
プログラミングでいうif文に近い感覚です。
SELECT
name,
CASE
WHEN score >= 80 THEN '合格'
WHEN score >= 60 THEN '再試験'
ELSE '不合格'
END AS result
FROM tests;
この例だとscoreの値によって結果が変わります。
| name | score | result |
|---|---|---|
| 田中 | 90 | 合格 |
| 佐藤 | 65 | 再試験 |
| 鈴木 | 45 | 不合格 |
CASEは上から順に評価して、最初に当てはまったところで終わりになります。
たとえばWHENの順番を逆にするとこうなります。
# 順番が間違っている例
CASE
WHEN score >= 60 THEN '再試験' # score=90もここに引っかかる
WHEN score >= 80 THEN '合格' # ここには永遠にたどり着かない
ELSE '不合格'
END
score=90の人は「>= 60」にも当てはまるので、最初のWHENで「再試験」と判定されて終わってしまいます。
「合格」には一生たどり着けません。
条件は範囲が狭いもの(より厳しい条件)から先に書くのが鉄則です。
数値の大小で言うと、大きい数から順に書くイメージです。
CAST
データには「数値」「文字列」「日付」などの型があります。
型が合っていないと計算や比較がうまくいかないので、CASTで変換します。
なぜ数字が文字列として保存されるのか
「数字なのに文字列として入っている」という状況を最初は疑問に思いました。
よくある原因は以下のようなものです。
- Webフォームで入力されたデータをそのまま保存した
- CSVファイルからインポートしたら全部文字列になった
- 電話番号や郵便番号など「数字っぽいけど計算しない値」が混ざっている
こういったデータを計算するときは、CASTで型を明示的に変換してから使うのが確実です。
SELECT CAST('100' AS INTEGER) + CAST('23' AS INTEGER);
CASTの書き方
SELECT CAST(変換したい値 AS 変換先の型);
よく使う例はこちらです。
SELECT CAST('123' AS INTEGER); # '123'(文字列)→ 123(整数)
SELECT CAST('3.14' AS REAL); # '3.14'(文字列)→ 3.14(小数)
SELECT CAST(42 AS TEXT); # 42(整数)→ '42'(文字列)
よく使う型はこの4つです。
| 型 | 意味 | 使う場面 |
|---|---|---|
| INTEGER | 整数 | 個数・年齢など |
| REAL | 小数 | 割合・測定値など |
| TEXT | 文字列 | 数値を文字として扱いたいとき |
| DATE | 日付 | 日付の計算をしたいとき |
'abc' のように数値に変換できない文字列をCASTしようとしたとき、どうなるかはデータベースの種類によって異なり、以下のような挙動になる場合があります。
使用しているDBによって異なるため、DBの仕様を確認することが大切です。
- NULLになる
- エラーになる
- 0になる
SELECT CAST('abc' AS INTEGER); # DBによってNULL・エラー・0など挙動が違う
「なぜかNULLが混ざっている」「なぜかエラーになる」と思ったら、CAST失敗が原因のこともあるので覚えておくと役立ちます。
変換失敗してもエラーを止めたくないとき
変換に失敗したときにクエリ全体をエラーで止めたくない場合、DBによっては専用の関数が用意されています。
例)
- SQL Server → TRY_CAST
- BigQuery → SAFE_CAST
# SQL Server
SELECT TRY_CAST('abc' AS INTEGER); # 変換失敗してもエラーにならずNULLを返す
# BigQuery
SELECT SAFE_CAST('abc' AS INT64); # 同様にNULLを返す
まとめ
関数の種類が多くて最初は圧倒されましたが、NULLの扱い方を理解することがSQLの学習の転機になりました。
また「何をしたいか」を先に決めてから関数を探す習慣をつけると、整理しやすくなります。
そして、その関数を使用する意味などをしっかり理解できると、ただ関数を覚えるよりもスムーズに使うことができるようになりました。
少しずつ使えるものを増やしていくと、SQLでできることが一気に広がるため、今後も積極的に手を動かして身につけていきたいと思います。
クラスメソッドオペレーションズ株式会社について
クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイトをぜひご覧ください。
※2026年1月 アノテーション㈱から社名変更しました。






