Python | DB・SQL:WHERE

Python
スポンサーリンク

概要(WHERE は「どの行だけを相手にするか」を決めるフィルター)

SQL の WHERE 句は、テーブルの中から「どの行だけを対象にするか」を決めるフィルターです。
SELECT だけでなく、UPDATE や DELETE にも必ず出てくる、とても重要な場所です。

WHERE を書かないと「全行」が対象になります。
だからこそ、WHERE を正しく書けるかどうかで、
「欲しいデータだけを安全に扱えるか」が決まります。

ここから、基本形から少しずつ条件の書き方を広げていきます。


WHERE の基本形と「条件式」の考え方

WHERE の位置と役割

SELECT 文の基本形をもう一度書きます。

SELECT 列1, 列2
FROM テーブル名
WHERE 条件;
SQL

FROM で「どのテーブルか」を決めたあと、
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;
SQL

WHERE の後ろには「真偽が決まる式(条件式)」を書きます。
各行について、その条件式が「真(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;
SQL

OR は「どちらか一方でも真なら OK」という条件です。
AND と OR を混ぜるときは、括弧でグループをはっきりさせると安全です。

WHERE (age >= 20 AND age <= 30) OR email = 'taro@example.com'
SQL

NOT で条件を反転させる

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
SQL

IN を使うと、読みやすく短く書けます。

BETWEEN で「範囲」

「20 歳以上 30 歳以下」を書くとき、
BETWEEN を使うとこう書けます。

WHERE age BETWEEN 20 AND 30;
SQL

これは「20 以上かつ 30 以下」と同じ意味です。
数値だけでなく、日付にもよく使います。

WHERE created_at BETWEEN '2025-01-01' AND '2025-01-31';
SQL

IS NULL / IS NOT NULL で「NULL 判定」

NULL(値がない状態)を判定するときは、
= NULL ではなく IS NULL を使います。

WHERE email IS NULL;
SQL

「メールアドレスが未設定のユーザー」を取りたいときなどに使います。

逆に、「NULL ではない」なら IS NOT NULL です。

WHERE email IS NOT NULL;
SQL

NULL は「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'
SQL

WHERE は「日本語の条件を、論理式に書き直したもの」です。
いきなり SQL で考えず、
一度日本語で整理してから書くと、ミスが減ります。


まとめ(WHERE を制する者が、SQL を制する)

WHERE を初心者目線でまとめると、こうなります。

WHERE は「どの行だけを対象にするか」を決めるフィルターで、SELECT / UPDATE / DELETE すべてで超重要。
比較演算子(=, <, >, <=, >=, <>)で単純な条件を書き、AND / OR / NOT で組み合わせることで、複雑な条件を表現できる。
LIKE とワイルドカード(%, _)で部分一致、IN / BETWEEN / IS NULL でよくあるパターンを簡潔に書ける。
UPDATE / DELETE では、WHERE の書き間違いが「全件更新・全件削除」につながるので、必ず同じ WHERE で先に SELECT して確認する習慣が大事。

タイトルとURLをコピーしました