Q1次の WHERE 条件WHERE city = 'Tokyo' OR city = 'Osaka' AND salary >= 5000000はどう解釈されますか。
WHERE 詳細 ① — AND・OR・NOT で複数条件を組み立てる
この記事は、基礎から複雑なSQL,SQLチューニングまでSQLの実践的なスキルを1からマスターする「SQL入門講座の一部」です。
WHEREのAND/OR/NOTの真偽値表、ANDがORより優先される順位、括弧で評価順を明示する書き方を、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と同じ意味になる括弧の付け方はどれですか。