AND/OR/NOTで複合条件
AND/OR/NOTで複合条件 とは
AND/OR/NOTを組み合わせて、複雑な条件でデータを絞り込みます。本レッスンでは、AND/OR/NOTで複合条件 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ重要か
実務の検索条件は単一の条件で済むことの方が稀です。「東京在住で 30 代の顧客」「在庫が 10 以下で価格が 1000 円以上の商品」「未承認かつ最終ログインが 30 日以上前のユーザー」、こうした「かつ」「または」「ではない」の組み合わせを表現するのが論理演算子です。AND、OR、NOT を正しく組み合わせる力は、絞り込み画面の品質をそのまま決めます。
論理演算は中学校の集合論と同じ世界です。複雑な条件であっても、A と B の集合をベン図でイメージできれば、SQL でも自然と書けるようになります。
構文の全体像
SQL クエリ
SELECT ...
FROM ...
WHERE cond1 AND cond2 OR cond3;優先順位は NOT > AND > OR です。括弧を付けずに書くと、(cond1 AND cond2) OR cond3 と解釈されます。意図を明示するために、括弧で囲む癖を付けましょう。
処理の流れ
AND は両方が TRUE のときだけ TRUE、OR はどちらか一方が TRUE なら TRUE、NOT は TRUE と FALSE を反転します。NULL が絡むと「不明」が伝播するので、後述の三値論理に注意します。
代表例
例 1 は、AND で二つの条件を満たす行だけを取り出すケースです。
SQL クエリ
SELECT id, name, city, age
FROM customers
WHERE city = '東京' AND age >= 30;このクエリは「東京在住、かつ 30 歳以上」という両方を満たす顧客だけを返します。AND の左右はどちらも単独で有効な条件式です。
例 2 は、OR でいずれかを満たす行を取り出すケースです。
SQL クエリ
SELECT id, name, city
FROM customers
WHERE city = '東京' OR city = '大阪';これは IN ('東京', '大阪') と等価です。OR は同じ列に対して複数の値を受け入れるときに使いますが、その用途なら IN のほうが読みやすいことが多いです。
例 3 は、AND と OR を組み合わせるケースです。
SQL クエリ
SELECT id, name, city, age
FROM customers
WHERE (city = '東京' OR city = '大阪')
AND age >= 30;括弧で OR の範囲を明示しているのがポイントです。括弧を外すと city = '東京' OR (city = '大阪' AND age >= 30) と解釈され、東京の若い顧客まで含まれてしまいます。
NOT の使い方
SQL クエリ
SELECT id, name
FROM customers
WHERE NOT (city = '東京');これは city <> '東京' と等価です。NOT IN, NOT LIKE, NOT BETWEEN のように、他の述語と組み合わせて使うことの方が多いです。
三値論理に注意
SQL の真理値は TRUE, FALSE, NULL (不明) の三つです。NULL を含む条件式は NULL のまま伝播することが多く、たとえば
WHERE age = NULLもWHERE age <> NULLもどちらもヒットしません。NULL の判定は必ずIS NULLまたはIS NOT NULLを使います。
NOT (a = b)とa <> bは、NULL が絡むと結果が変わることがあります。設計時に NULL を許す列なのか、デフォルト値で埋める列なのかを決めておくと、複合条件のバグを減らせます。
括弧の作法
複合条件は、見た目で意図が伝わるかどうかが品質を決めます。次のように書くと、レビューでも読みやすくなります。
SQL クエリ
SELECT id, name
FROM customers
WHERE (city = '東京' OR city = '大阪')
AND (age BETWEEN 30 AND 40)
AND (email LIKE '%@gmail.com');3 行に分けて AND を冒頭に揃えると、各条件が独立して見えます。GitHub の Pull Request でレビューしてもらうときも、差分が読みやすくなります。
ベン図でイメージする
論理演算は集合の重なりとして考えるとミスを減らせます。「AND は重なった部分」「OR は合わせた全体」「NOT は外側」のように、頭の中で図を描けば、複雑な条件でも組み立てが楽になります。条件が三つ以上になるときは、紙やホワイトボードに簡単なベン図を描いてから SQL に落とすと、レビュアーにも伝わりやすいクエリが書けます。
まとめ
- AND は両方 TRUE、OR はどちらか TRUE、NOT は反転
- 優先順位は NOT > AND > OR。括弧で意図を明示する
- 同じ列に対する OR は IN で書き換えると読みやすい
- NULL を含む条件は三値論理で挙動が変わる。NULL 判定は IS NULL を使う
- 複合条件はインデント・改行を揃えるとレビューが楽になる
- 条件が複雑になったらベン図でイメージしてから SQL に落とす
次のレッスン
次は ORDER BYでソート です。ORDER BY句を使って、SQLでデータをソートする方法を実践的に学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- AND OR NOT の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. AND OR NOT とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
テーブル構造
schema.sql
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
city VARCHAR(30) NOT NULL,
age INT NOT NULL,
total_purchase INT NOT NULL
);
INSERT INTO customers (id, name, city, age, total_purchase) VALUES
(1, '田中 太郎', '東京', 28, 50000),
(2, '山田 花子', '大阪', 35, 120000),
(3, '佐藤 一郎', '東京', 42, 80000),
(4, '鈴木 次郎', '名古屋', 31, 30000),
(5, '田村 三郎', '東京', 25, 200000),
(6, '高橋 美咲', '大阪', 38, 150000),
(7, '伊藤 健太', '札幌', 29, 45000),
(8, '渡辺 由美', '東京', 45, 90000);期待される出力
| id | name | city | age |
|---|---|---|---|
| 2 | 山田 花子 | 大阪 | 35 |
| 3 | 佐藤 一郎 | 東京 | 42 |
| 6 | 高橋 美咲 | 大阪 | 38 |
| 8 | 渡辺 由美 | 東京 | 45 |