Q1次の WHERE 条件 WHERE city = 'Tokyo' OR city = 'Osaka' AND salary >= 5000000 はどう解釈されますか。
WHERE 詳細 ① — AND・OR・NOT で複数条件を組み立てる
WHERE 詳細の 1 本目です。AND / OR / NOT の真偽値表、演算子の優先順位、括弧で評価順を明示する書き方まで、CSV の社員データでブラウザで実行しながら学べます。
本記事で使うデータ — staff テーブル
本記事から WHERE の絞り込みパターンを 3 本にわたって深掘り します。1 本目は 複数条件を組み立てる ための論理演算子 — AND(かつ)/ OR(または)/ NOT(〜でない)— と、それらを混ぜたときの 演算子の優先順位 と 括弧 の使い方を扱います。
題材は CSV から自動ロードする staff テーブル(10 行)で、name / city / salary / birthday の各列を持ちます。「Tokyo かつ高給」「Tokyo または Osaka」「Kyoto 以外」のような実務でよくある複合条件を、各演算子で組み立てていきます。
AND・OR・NOT — 論理演算子で条件を組み立てる
1 つの WHERE で 複数の条件を組み合わせる のが論理演算子です。3 種類あります。
- `AND`(かつ): 両方の条件が TRUE のときだけ TRUE
- `OR`(または): どちらかの条件が TRUE なら TRUE
- `NOT`(〜でない): 直後の条件を否定する(TRUE → FALSE / FALSE → TRUE)
書き方は WHERE 条件1 AND 条件2、WHERE 条件1 OR 条件2、WHERE NOT (条件) のようにキーワードを挟むだけです。AND / OR は何個でも連結でき、NOT は 1 つの条件の前に置きます。
| 条件 A | 条件 B | A AND B | A OR B |
|---|---|---|---|
| True | True | True | True |
| True | False | False | True |
| False | True | False | True |
| False | False | False | False |
AND は両方が TRUE のときだけ TRUE、OR はどちらかが TRUE なら TRUE が基本ルールです。NULL を含む比較が混じった場合の挙動は次々回の 3 値論理 で扱いますが、本記事ではまず 2 値(TRUE / FALSE)の世界で組み立てを覚えます。
-- 1) AND: 両方を満たす(Tokyo かつ高給)
SELECT name, city, salary FROM staff
WHERE city = 'Tokyo' AND salary >= 5000000;
-- 2) OR: どちらかを満たす(Tokyo または Osaka)
SELECT name, city FROM staff
WHERE city = 'Tokyo' OR city = 'Osaka';
-- 3) NOT: 条件の否定(Kyoto 以外)
SELECT name, city FROM staff
WHERE NOT (city = 'Kyoto');
-- NOT は != や <> でも書ける
SELECT name, city FROM staff
WHERE city != 'Kyoto';
演算子の優先順位 — AND は OR より強く結合する
AND と OR を 混ぜて 使うときに必ず知っておきたいのが、`AND` は `OR` より優先順位が高い というルールです。A OR B AND C と書くと `A OR (B AND C)` と解釈され、左から書いた順には評価されません。
意図と違う結果になりやすいので、AND と OR を混ぜるときは 必ず括弧で評価順を明示 します。括弧は SQL 上の意味を変えるだけでなく、読み手に意図を伝える 役割も持つので、たとえ括弧なしでも同じ意味になる場合でも付けておきましょう。
`AND` は `OR` より先に評価される
A OR B AND C は `A OR (B AND C)` と解釈されます。AND が OR より結合度が高いためで、書いた順に左から評価されません。
例: WHERE city = 'Tokyo' OR city = 'Osaka' AND salary >= 5000000 は `city = 'Tokyo' OR (city = 'Osaka' AND salary >= 5000000)` の意味になり、Tokyo の社員は salary に関係なく全員残ります(Tokyo の Alice 4,500,000 も含まれてしまう)。「Tokyo か Osaka のうち高給」を意図しているなら、必ず (city = 'Tokyo' OR city = 'Osaka') AND salary >= 5000000 と 括弧で評価順を明示 します。
理解度チェック
まずは1問ずつ答えてみましょう。
Q2WHERE NOT (city = 'Tokyo') と同じ結果を返す書き方はどれですか。
Q3次のうち、WHERE A AND B OR C と同じ意味になる括弧の付け方はどれですか。