順番に読み進めながら学べます

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 以外」のような実務でよくある複合条件を、各演算子で組み立てていきます。

演習に入る前に、staffテーブルの列定義データのサンプルを確認しておきます。

PRAGMA table_info(staff);で列名・型・主キーを確認してください。

SELECT * FROM staff LIMIT 5;で先頭 5 行のデータをプレビューしてください。

SQL エディタ

クエリを実行してください

AND・OR・NOT — 論理演算子で条件を組み立てる

1 つのWHERE複数の条件を組み合わせるのが論理演算子です。3 種類あります。

- AND(かつ): 両方の条件が TRUE のときだけ TRUE

- OR(または): どちらかの条件が TRUE なら TRUE

- NOT(〜でない): 直後の条件を否定する(TRUE → FALSE / FALSE → TRUE)

書き方はWHERE 条件1 AND 条件2WHERE 条件1 OR 条件2WHERE NOT (条件)のようにキーワードを挟むだけです。AND / ORは何個でも連結でき、NOTは 1 つの条件の前に置きます。

条件 A条件 BA AND BA OR B
TrueTrueTrueTrue
TrueFalseFalseTrue
FalseTrueFalseTrue
FalseFalseFalseFalse

AND は両方が TRUE のときだけ TRUE、OR はどちらかが TRUE なら TRUEが基本ルールです。NULL を含む比較が混じった場合の挙動は次々回の3 値論理で扱いますが、本記事ではまず 2 値(TRUE / FALSE)の世界で組み立てを覚えます。

論理演算子の優先順位
NOT(最優先)AND(中)OR(最後)次に強い次に強い
NOT が最も強く結合し、次に AND、最後に OR の順で評価されます。混在するときは括弧で評価順を明示することで、優先順位を意識せずに意図どおりの評価を行えます。
-- 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';

賞与査定の対象として「Tokyo 在住かつ給料 5,000,000 以上の社員」を抽出したい、という要件を想定します。(正しく実行できれば解説が表示されます)

staffテーブルからnamecitysalaryの 3 列を取り出してください。

cityが'Tokyo'かつsalaryが 5,000,000 以上の行に絞り込んでください。

③ 結果が 3 行(David Sato 6,800,000 / Grace Suzuki 5,500,000 / Jack Tanaka 5,900,000)になることを確認してください。

SQL エディタ

クエリを実行してください

「関東(Tokyo)または関西(Osaka)拠点の社員にお知らせを送りたい」という要件を想定します。

staffテーブルからnamecityの 2 列を取り出してください。

cityが'Tokyo'または'Osaka'の行に絞り込んでください(ORを使ってください)。

③ 結果が 6 行(Alice Tokyo / Bob Osaka / David Tokyo / Frank Osaka / Grace Tokyo / Jack Tokyo)になることを確認してください。

SQL エディタ

クエリを実行してください

演算子の優先順位 — AND は OR より強く結合する

AND と OR を混ぜて使うときに必ず知っておきたいのが、ANDはORより優先順位が高いというルールです。A OR B AND Cと書くとA OR (B AND C)と解釈され、左から書いた順には評価されません。

意図と違う結果になりやすいので、AND と OR を混ぜるときは必ず括弧で評価順を明示します。括弧は SQL 上の意味を変えるだけでなく、読み手に意図を伝える役割も持つので、たとえ括弧なしでも同じ意味になる場合でも付けておきましょう。

括弧の有無で結果が変わる例
括弧なし(意図とズレる)括弧あり(意図どおり)city = 'Tokyo'OR city = 'Osaka'AND salary >= 5000000(city = 'Tokyo' OR city = 'Osaka')AND salary >= 5000000Tokyo OR(Osaka AND 高給)と解釈される(Tokyo OR Osaka)AND 高給と評価される結果: 6 行(Alice Tokyo 4500k 含む)結果: 5 行(Alice Tokyo 4500k 除外)
「Tokyo OR Osaka の高給社員」を意図したクエリ。括弧の位置で意味が変わり、結果も変わります。

`AND`は`OR`より先に評価される

A OR B AND CA OR (B AND C)と解釈されます。AND が OR より結合度が高いためで、書いた順に左から評価されません。

例: WHERE city = 'Tokyo' OR city = 'Osaka' AND salary >= 5000000city = 'Tokyo' OR (city = 'Osaka' AND salary >= 5000000)の意味になり、Tokyo の社員は salary に関係なく全員残ります(Tokyo の Alice 4,500,000 も含まれてしまう)。「Tokyo か Osaka のうち高給」を意図しているなら、必ず(city = 'Tokyo' OR city = 'Osaka') AND salary >= 5000000括弧で評価順を明示します。

「Tokyo か Osaka に住む社員のうち、給料 5,000,000 以上」を抽出したい、という要件を想定します。括弧あり / なしで結果がどう変わるかを 1 つのコンソールで並べて確認します。

staffテーブルからnamecitysalaryの 3 列を取り出してください。

② まず括弧ありで意図どおりに書いてください((city = 'Tokyo' OR city = 'Osaka') AND salary >= 5000000)。

③ 続けてわざと括弧を外して書いてください(city = 'Tokyo' OR city = 'Osaka' AND salary >= 5000000)。

④ 1 つ目は 5 行、2 つ目は 6 行(Alice Tokyo 4,500,000 が増える)になり、結果が変わることを確認してください。

SQL エディタ

クエリを実行してください

「Kyoto 拠点を除いた全社員リストを作成したい」という要件を想定します。

staffテーブルからnamecityの 2 列を取り出してください。

cityが'Kyoto'でない行に絞り込んでください(NOT (条件)を使ってください)。

③ 結果が 8 行(Carol と Iris の 2 名が除外される)になることを確認してください。

SQL エディタ

クエリを実行してください
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1次の WHERE 条件WHERE city = 'Tokyo' OR city = 'Osaka' AND salary >= 5000000はどう解釈されますか。

Q2WHERE NOT (city = 'Tokyo')と同じ結果を返す書き方はどれですか。

Q3次のうち、WHERE A AND B OR Cと同じ意味になる括弧の付け方はどれですか。