こんにちは、かつコーチです。
今回は、WHERE句で条件を組み立てるときに欠かせない比較演算子(値同士の大小や一致を比べる記号)と、論理演算子(複数の条件を組み合わせる言葉)のAND・OR・NOTを解説します。
「30代の女性だけ抽出したい」「未購入か退会済みのユーザーを除外したい」といった、複数条件の絞り込みができるようになります。
比較演算子とは?
6種類の比較演算子を押さえる
比較演算子は、カラムの値と指定した値を比べて、条件に合う行だけを取り出すための記号です。
主なものは次の6つです。
| 演算子 | 意味 |
|---|---|
= | 等しい |
<> または != | 等しくない |
> | より大きい |
< | より小さい |
>= | 以上 |
<= | 以下 |
例えば、usersテーブルから年齢が20以上の人を取得するには、次のように書きます。
SELECT name, age
FROM users
WHERE age >= 20;
なぜ論理演算子が必要なのか
比較演算子だけでは「1つの条件」しか表現できません。
しかし実務では「20歳以上30歳未満」「東京か大阪に住んでいる」のように、複数の条件を組み合わせたい場面がほとんどです。
そこで使うのが、AND・OR・NOTの論理演算子です。
AND・OR・NOTの基本の書き方
AND:すべての条件を満たす行を取得する
ANDは、複数の条件をすべて満たす行だけを絞り込みます。
SELECT name, age, prefecture
FROM users
WHERE age >= 20 AND prefecture = '東京都';
このクエリは「年齢が20歳以上」かつ「都道府県が東京都」の両方を満たす行だけを返します。
片方しか満たさない行はヒットしません。
OR:いずれかの条件を満たす行を取得する
ORは、複数の条件のうちどれか1つでも満たせば行を取得します。
SELECT name, prefecture
FROM users
WHERE prefecture = '東京都' OR prefecture = '大阪府';
東京都在住の人と大阪府在住の人の両方が結果に含まれます。
NOT:条件を否定する
NOTは、条件の結果を反転させます。
SELECT name, status
FROM orders
WHERE NOT status = 'canceled';
status = 'canceled'ではない行、つまりキャンセルされていない注文だけを取得できます。
つまずきやすい設定・注意点
ANDとORを混在させるときは括弧が必須
ANDとORを一緒に使うとき、括弧をつけずに書くと意図しない結果になることがあります。
これは、SQLがANDをORより先に評価する(優先順位が高い)ためです。
❌ Before(括弧なし。意図と違う結果になる)
SELECT name, age, prefecture
FROM users
WHERE prefecture = '東京都' OR prefecture = '大阪府' AND age >= 20;
このクエリは「東京都在住(年齢問わず)」または「大阪府在住かつ20歳以上」という意味になってしまいます。
「東京都か大阪府に住んでいて、かつ20歳以上」を意図していた場合、東京都在住の未成年まで含まれてしまうバグになります。
✅ After(括弧で優先順位を明示する)
SELECT name, age, prefecture
FROM users
WHERE (prefecture = '東京都' OR prefecture = '大阪府') AND age >= 20;
私も駆け出しの頃、この括弧忘れが原因で「なぜか未成年が集計対象に混ざる」というバグを本番の集計クエリで出したことがあります。
ANDとORを混ぜるときは、意図を明確にするために必ず括弧をつける、とルール化してしまうのがおすすめです。
文字列の比較は引用符を忘れない
文字列の値を比較するときは、シングルクォート(')で囲む必要があります。
数値と混同して引用符を忘れると、エラーになったり別のカラム名として誤解釈されたりします。
-- ❌ エラーになりやすい
WHERE prefecture = 東京都
-- ✅ 正しい書き方
WHERE prefecture = '東京都'
応用・一歩先の使い方
NOT INやNOT LIKEとの組み合わせ
NOTは単独の条件だけでなく、後述するIN・LIKE・BETWEENといった演算子の前にもつけられます。
SELECT name, status
FROM orders
WHERE status NOT IN ('canceled', 'refunded');
「キャンセル」でも「返金済み」でもない注文だけを一度に除外できるため、条件が多いときはこちらのほうがANDを何個も並べるより読みやすくなります。
複数条件が増えてきたらCASE式も検討する
AND・ORの組み合わせが5つ、6つと増えてくると、WHERE句だけでは可読性が落ちてきます。
そうしたケースでは、条件分岐をCASE式で整理する方法もありますが、これは応用編として別記事で扱います。
まずはAND・OR・NOTの基本を、括弧の使い方とセットで体に覚えさせましょう。
まとめ
この記事のポイント
- 比較演算子(
=、<>、>、<、>=、<=)で1つの条件を表現できる - ANDは「すべて満たす」、ORは「いずれか満たす」、NOTは「否定」という意味
- ANDとORを混在させるときは、優先順位のズレを防ぐために括弧を必ずつける
- 文字列の比較にはシングルクォートを忘れずに
次に読むべき記事
- SQL LIKE演算子であいまい検索をする
- SQL IN・BETWEENで複数条件・範囲を指定する
- SQL WHERE句で条件を指定して絞り込む
タグ: SQL, 初心者向け, 基本文法