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

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

演習に入る前に、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 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括弧で評価順を明示 します。

「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 と同じ意味になる括弧の付け方はどれですか。