概要(WHERE は「どの行だけを相手にするか」を決めるフィルター)
SQL の WHERE 句は、テーブルの中から「どの行だけを対象にするか」を決めるフィルターです。
SELECT だけでなく、UPDATE や DELETE にも必ず出てくる、とても重要な場所です。
WHERE を書かないと「全行」が対象になります。
だからこそ、WHERE を正しく書けるかどうかで、
「欲しいデータだけを安全に扱えるか」が決まります。
ここから、基本形から少しずつ条件の書き方を広げていきます。
WHERE の基本形と「条件式」の考え方
WHERE の位置と役割
SELECT 文の基本形をもう一度書きます。
SELECT 列1, 列2
FROM テーブル名
WHERE 条件;
SQLFROM で「どのテーブルか」を決めたあと、
WHERE で「その中のどの行か」を決めます。
例えば、users テーブルがあるとします。
users テーブル
id | name | age | email
---+--------+-----+--------------------
1 | Taro | 25 | taro@example.com
2 | Hanako | 30 | hanako@example.com
3 | Ken | 19 | ken@example.com
この中から「20 歳以上だけ」を取りたいなら、こう書きます。
SELECT name, age
FROM users
WHERE age >= 20;
SQLWHERE の後ろには「真偽が決まる式(条件式)」を書きます。
各行について、その条件式が「真(true)」なら残り、「偽(false)」なら除外されます。
比較演算子(=, <, >, <=, >=, <>)
WHERE でよく使うのが「比較演算子」です。
WHERE age = 20 -- 20 歳ちょうど
WHERE age > 20 -- 20 歳より上
WHERE age >= 20 -- 20 歳以上
WHERE age < 20 -- 20 歳未満
WHERE age <> 20 -- 20 歳以外(!= を使う DB もある)
SQL文字列でも同じように使えます。
WHERE email = 'taro@example.com'
SQLここで大事なのは、「= は完全一致」ということです。
「含む」「前方一致」などは、後で出てくる LIKE を使います。
AND / OR / NOT で条件を組み合わせる
AND で「両方満たす」条件
例えば、「20 歳以上かつ 30 歳以下」のユーザーだけ欲しいとします。
このときは AND を使います。
SELECT name, age
FROM users
WHERE age >= 20 AND age <= 30;
SQLこの条件は、「age が 20 以上で、なおかつ 30 以下」の行だけを残します。
AND は「全部満たしているか?」というチェックです。
OR で「どちらかを満たす」条件
今度は、「20 歳未満または 30 歳より上」のユーザーだけ欲しいとします。
このときは OR を使います。
SELECT name, age
FROM users
WHERE age < 20 OR age > 30;
SQLOR は「どちらか一方でも真なら OK」という条件です。
AND と OR を混ぜるときは、括弧でグループをはっきりさせると安全です。
WHERE (age >= 20 AND age <= 30) OR email = 'taro@example.com'
SQLNOT で条件を反転させる
NOT は「条件をひっくり返す」演算子です。
WHERE NOT age >= 20
SQLこれは「age >= 20 ではない」、つまり「20 歳未満」と同じ意味になります。
複雑な条件をシンプルに書きたいときに使いますが、
最初のうちは「読みやすさ」を優先して、
NOT を使わずに書き直すのもアリです。
LIKE とワイルドカードで「部分一致」を書く
LIKE と %(任意の文字列)
文字列の「部分一致」をしたいときに使うのが LIKE です。
ワイルドカードとして % を使います。
メールアドレスが example.com を含むユーザーだけ欲しいなら、こうです。
SELECT name, email
FROM users
WHERE email LIKE '%@example.com';
SQL% は「0 文字以上の任意の文字列」を表します。
この例では、「@example.com で終わる文字列」という意味になります。
先頭一致ならこうです。
WHERE name LIKE 'Ta%'; -- Ta で始まる名前
SQL部分一致ならこうです。
WHERE email LIKE '%example%'; -- example をどこかに含む
SQL_(1 文字だけのワイルドカード)
_(アンダースコア)は「任意の 1 文字」を表します。
WHERE name LIKE '_aro'; -- 先頭 1 文字は何でもよくて、続きが aro
SQL例えば、「Taro」「Jaro」はマッチしますが、「TaroX」はマッチしません。
LIKE は便利ですが、
先頭に % を付けるとインデックスが効きにくくなり、
大きなテーブルでは遅くなることがあります。
最初は「そういう性質がある」くらいの理解で大丈夫です。
IN / BETWEEN / IS NULL でよくある条件を簡潔に書く
IN で「この中のどれか」
複数の値のどれかに一致させたいときは、IN が使えます。
SELECT name, age
FROM users
WHERE age IN (18, 20, 25);
SQLこれは、「age が 18 か 20 か 25 のどれか」の行だけを残します。
AND / OR で書くとこうなります。
WHERE age = 18 OR age = 20 OR age = 25
SQLIN を使うと、読みやすく短く書けます。
BETWEEN で「範囲」
「20 歳以上 30 歳以下」を書くとき、
BETWEEN を使うとこう書けます。
WHERE age BETWEEN 20 AND 30;
SQLこれは「20 以上かつ 30 以下」と同じ意味です。
数値だけでなく、日付にもよく使います。
WHERE created_at BETWEEN '2025-01-01' AND '2025-01-31';
SQLIS NULL / IS NOT NULL で「NULL 判定」
NULL(値がない状態)を判定するときは、
= NULL ではなく IS NULL を使います。
WHERE email IS NULL;
SQL「メールアドレスが未設定のユーザー」を取りたいときなどに使います。
逆に、「NULL ではない」なら IS NOT NULL です。
WHERE email IS NOT NULL;
SQLNULL は「0 や空文字とは違う、値が存在しない特別な状態」なので、
専用の演算子(IS NULL)が用意されています。
WHERE が UPDATE / DELETE でどれだけ重要か
UPDATE での WHERE(対象を間違えると全件更新)
UPDATE 文でも WHERE は同じように使います。
UPDATE users
SET age = 26
WHERE id = 1;
SQLこれは「id が 1 の行だけ age を 26 にする」という意味です。
もし WHERE を書き忘れると、こうなります。
UPDATE users
SET age = 26;
SQLこの場合、users テーブルの全行の age が 26 になります。
本番環境でやると、かなり致命的です。
だからこそ、実務では
「UPDATE / DELETE を打つ前に、同じ WHERE で SELECT して確認する」
という習慣がとても大事になります。
DELETE での WHERE(対象を間違えると全件削除)
DELETE も同じです。
DELETE FROM users
WHERE id = 3;
SQLこれは「id が 3 の行だけ削除」です。
WHERE を書かないと、こうなります。
DELETE FROM users;
SQLこれは「users テーブルの全行削除」です。
テーブル自体は残りますが、中身は空になります。
WHERE は「どの行を相手にするか」を決める唯一の場所なので、
UPDATE / DELETE では特に慎重に書く必要があります。
実務的な WHERE の書き方のコツ
まず SELECT で「本当にその行だけか」を確認する
UPDATE や DELETE をする前に、
必ず同じ WHERE で SELECT してみてください。
例えば、こう書くつもりなら、
UPDATE users
SET age = 26
WHERE id = 1;
SQL先にこう打ちます。
SELECT *
FROM users
WHERE id = 1;
SQL結果が「本当に変えたい行だけ」なら、UPDATE を実行してよし。
もし複数行出てきたり、0 行だったりしたら、
WHERE が間違っているので、そこで気づけます。
この「先に SELECT で確認する」癖は、
バックエンドエンジニアとしての安全装置になります。
条件を日本語で言ってから WHERE に落とす
WHERE を書く前に、一度日本語で条件を言ってみてください。
例えば、
「20 歳以上 30 歳以下で、メールアドレスに example.com を含むユーザー」
これをそのまま分解すると、
age は 20 以上
age は 30 以下
email は ‘%example.com’ を含む
となります。
SQL にするとこうです。
WHERE age >= 20
AND age <= 30
AND email LIKE '%@example.com'
SQLWHERE は「日本語の条件を、論理式に書き直したもの」です。
いきなり SQL で考えず、
一度日本語で整理してから書くと、ミスが減ります。
まとめ(WHERE を制する者が、SQL を制する)
WHERE を初心者目線でまとめると、こうなります。
WHERE は「どの行だけを対象にするか」を決めるフィルターで、SELECT / UPDATE / DELETE すべてで超重要。
比較演算子(=, <, >, <=, >=, <>)で単純な条件を書き、AND / OR / NOT で組み合わせることで、複雑な条件を表現できる。
LIKE とワイルドカード(%, _)で部分一致、IN / BETWEEN / IS NULL でよくあるパターンを簡潔に書ける。
UPDATE / DELETE では、WHERE の書き間違いが「全件更新・全件削除」につながるので、必ず同じ WHERE で先に SELECT して確認する習慣が大事。
