ウェブエンジニア問題集
第3章

WHERE・ORDER BY・LIMITとNULLの扱い

8
この章の目次開く

SELECT で列を選べるようになったら、次は「どの行を取得するか」を指定します。 実務のSQLでは、ほとんどの場合 WHEREORDER BYLIMIT を組み合わせます。

この章では、行の絞り込み、並び替え、件数制限、そしてSQL初学者がつまずきやすい NULL の扱いを整理します。

学習者学習者

WHERE deleted_at = NULL って書いたら結果が返ってこなかった…。NULLって普通の値じゃないの?

WHEREで行を絞り込む

WHERE は、条件に合う行だけを取得するために使います。

SELECT id, name, email
FROM users
WHERE is_active = true;
sql

比較演算子を使うと、数値や日付で絞り込めます。

SELECT id, total_amount
FROM orders
WHERE total_amount >= 5000;
sql

代表的な比較演算子は次の通りです。

演算子意味
=等しいstatus = 'paid'
<> / !=等しくないstatus <> 'cancelled'
>より大きいprice > 1000
>=以上price >= 1000
<より小さいcreated_at < '2026-01-01'
<=以下stock <= 0
WHERE は「取得対象にする行」を決める条件です。

ANDとOR

複数の条件を組み合わせるには、ANDOR を使います。

SELECT id, name
FROM users
WHERE is_active = true
  AND role = 'admin';
sql

AND はすべての条件を満たす行、OR はどれか1つでも満たす行を返します。

SELECT id, name
FROM users
WHERE role = 'admin'
   OR role = 'editor';
sql

ANDOR を混ぜる場合は、必ず括弧で意図を明確にしましょう。

SELECT id, name
FROM users
WHERE is_active = true
  AND (role = 'admin' OR role = 'editor');
sql

括弧を省略すると、読み手が条件のまとまりを誤解しやすくなります。

IN・BETWEEN・LIKE

複数の候補のどれかに一致するかを見たいときは IN を使います。

SELECT id, name
FROM users
WHERE role IN ('admin', 'editor', 'author');
sql

範囲を指定するには BETWEEN を使えます。

SELECT id, ordered_at
FROM orders
WHERE ordered_at BETWEEN '2026-01-01' AND '2026-01-31';
sql

文字列の部分一致には LIKE を使います。

SELECT id, name
FROM users
WHERE name LIKE '田中%';
sql
パターン意味
'田中%'田中で始まる
'%太郎'太郎で終わる
'%shop%'shopを含む
先生先生

NULLの比較は = NULL じゃなくて IS NULL。SQLの中でも特につまずきやすいところだけど、「NULLは値じゃなくて状態」と覚えればスッキリするよ。

NULLは「値がない」状態

NULL は、空文字 '' や数値の 0 とは違います。 NULL は「値が存在しない」「不明」「未設定」を表す特別な状態です。

-- 間違い
SELECT id, name
FROM users
WHERE deleted_at = NULL;
sql

NULL かどうかを判定するには IS NULL を使います。

SELECT id, name
FROM users
WHERE deleted_at IS NULL;
sql

NULL ではない行を取りたい場合は IS NOT NULL です。

SELECT id, name
FROM users
WHERE deleted_at IS NOT NULL;
sql
NULL= では比較せず、IS NULL / IS NOT NULL で判定します。

COALESCEでNULLを置き換える

COALESCE は、最初に NULL ではない値を返す関数です。 表示用の値を補完したいときに使います。

一般的には「コアレス」と読まれます。意味は合体する・1つにまとまると言った意味です。

合体する

SQLでは COALESCE(値1, 値2, ...) の形で書きます。

たとえば、ユーザー名として nickname を優先し、未設定なら name を表示したい場合に使えます。

SELECT
  name,
  COALESCE(nickname, name) AS display_name
FROM users;
sql

この例では、nickname がある場合はニックネームを使い、NULL の場合は name を使います。 COALESCE には3つ以上の値も渡せます。 左から順番に見て、最初に NULL ではない値が採用されます。

全てがnullの場合は

SELECT
  id,
  COALESCE(nickname, name, '名無し') AS display_name
FROM users;
sql

この場合は、nickname があればそれを使い、なければ name、それも NULL なら '名無し' を使います。

数値列では、未設定を表示上だけ 0 にしたい場面でよく使います。

SELECT
  id,
  COALESCE(points, 0) AS points
FROM users;
sql

集計や表示で NULL をそのまま扱うと分かりにくい場合は、COALESCE で明示的に置き換えると読みやすくなります。 ただし、COALESCE(points, 0) は検索結果として 0 を表示しているだけで、テーブルに保存されている NULL が自動で 0 に変わるわけではありません。

COALESCE は、表示や計算で扱いやすい代替値を作るための関数です。元データの NULL を更新するものではありません。
学習者学習者

LIKEで %keyword% を使ってるんだけど、データが増えたら遅くなりますか?

先生先生

前方一致の keyword% ならインデックスが使えるけど、%keyword% は全行スキャンになりがち。数万件超えるなら全文検索エンジンの導入も検討しよう。

WHERE・ORDER BY・LIMITを組み合わせることで、必要なデータだけを効率よく絞り込めます

ORDER BYで並び替える

ORDER BY は、結果の並び順を指定します。

SELECT id, name, created_at
FROM users
ORDER BY created_at DESC;
sql
指定意味
ASC昇順。小さい順、古い順、AからZ
DESC降順。大きい順、新しい順、ZからA

複数条件で並べ替えることもできます。

SELECT id, name, role, created_at
FROM users
ORDER BY role ASC, created_at DESC;
sql

この場合、まず role の昇順で並べ、同じ role の中では created_at の新しい順に並べます。

LIMITで件数を制限する

LIMIT は、返す件数を制限します。

SELECT id, name
FROM users
ORDER BY created_at DESC
LIMIT 10;
sql

ORDER BY なしで LIMIT だけ使うと、どの10件が返るかが安定しないことがあります。

ページネーションでは OFFSET と組み合わせることもあります。

SELECT id, name
FROM users
ORDER BY id ASC
LIMIT 20 OFFSET 40;
sql

これは「41件目から20件」を取得するSQLです。 ただし、大量データでは OFFSET が重くなることがあるため、実務ではIDや日時を使ったカーソル型ページネーションも検討します。

よくあるハマりどころ

OR条件で範囲が広がりすぎる

-- 意図と違う結果になりやすい
WHERE is_active = true
  AND role = 'admin'
  OR role = 'editor'
sql

この書き方だと、role = 'editor' の行は is_activefalse でも対象になる可能性があります。 次のように括弧で条件のまとまりを明示します。

WHERE is_active = true
  AND (role = 'admin' OR role = 'editor')
sql

NULLを0や空文字と同じ扱いにする

NULL0'' は別物です。 未入力、数値としてゼロ、空文字は意味が違います。 設計時点で、どの状態を許すのかを決めておきましょう。

ちゃんと使うためのポイント

  • WHERE で行を絞り込む
  • ANDOR を混ぜるときは括弧を使う
  • NULLIS NULL / IS NOT NULL で判定する
  • COALESCE で表示用の代替値を作れる
  • ORDER BY で並び順を決める
  • LIMITORDER BY と組み合わせる

次の章では、複数のテーブルをつなぐ JOIN を学びます。

SQLクイズに挑戦するこの章で学んだSQLの知識を、4択クイズでアウトプットして定着させよう