SQLのAND条件の使い方:WHERE句の複数条件とOR併用の注意点
CONTENTS
SQLのWHERE句で複数条件を指定するとき、「ANDとORの違いは分かるけれど、実際に組み合わせると意図した結果にならない」と悩む方は少なくありません。
特に、AND と OR を同じWHERE句で使う場合、演算子の優先順位や括弧の付け方を誤ると、取得件数が増えすぎたり、本来除外すべきデータまで取得してしまったりします。
この記事では、SQLのAND条件の基本から、WHERE句で複数条件を指定する方法、ORとの違い、括弧が必要なケース、実務でありがちなミスまでを体系的に解説します。SQL初心者の方はもちろん、業務でクエリを書くエンジニアがレビュー時に確認すべきポイントも理解できます。
SQLのAND条件とは
ANDは「すべての条件を満たす行」を取得する演算子
SQLのANDは、複数の条件をすべて満たす行だけを取得するための論理演算子です。
たとえば、次のSQLは「住所が東京」かつ「年齢が30歳以上」のユーザーだけを取得します。
SELECT *
FROM users
WHERE address = '東京'
AND age >= 30;
この場合、次のような行は取得されません。
- 住所は東京だが、年齢が29歳
- 年齢は30歳以上だが、住所が大阪
- 住所も年齢も条件を満たさない
つまり、ANDは条件を追加するほど結果を絞り込む働きをします。
PostgreSQLの公式ドキュメントでも、WHERE句は真偽値として評価される条件を指定し、その条件を満たさない行を出力から除外すると説明されています。WHERE句は単に「検索条件を書く場所」ではなく、行を残すか除外するかを決めるフィルタです。
WHERE句の基本形
WHERE句の基本形は次の通りです。
SELECT 列名
FROM テーブル名
WHERE 条件;
複数条件を指定する場合は、条件同士をANDやORでつなぎます。
SELECT *
FROM products
WHERE category = 'book'
AND price >= 1000
AND stock > 0;
このSQLは、次の3条件をすべて満たす商品だけを取得します。
- カテゴリが本
- 価格が1000円以上
- 在庫が1以上
実務では、このように「必ず満たすべき条件」をANDで積み重ねていくケースが多くあります。
WHERE句で複数条件を指定する基本
ANDは条件を狭める
ANDを使うと、取得対象はどんどん狭くなります。
SELECT *
FROM employees
WHERE department = 'sales';
このSQLでは、営業部の社員を取得します。
さらに、在籍中の社員だけに絞る場合は次のように書きます。
SELECT *
FROM employees
WHERE department = 'sales'
AND status = 'active';
この時点で取得対象は「営業部の社員」から「営業部で、かつ在籍中の社員」に絞られます。
さらに役職を追加すると、より限定的になります。
SELECT *
FROM employees
WHERE department = 'sales'
AND status = 'active'
AND position = 'manager';
ANDは「条件を足すほど件数が減る」という性質を持つため、想定より件数が少ない場合は、どのAND条件が強く効いているのかを確認する必要があります。
ORは条件を広げる
一方、ORは「いずれかの条件を満たせば取得する」演算子です。
SELECT *
FROM users
WHERE address = '東京'
OR address = '大阪';
このSQLは、住所が東京または大阪のユーザーを取得します。
ANDが「共通部分」を取るのに対して、ORは「候補を増やす」イメージです。条件を追加するほど、取得件数は増えやすくなります。
ANDとORの使い分け
ANDとORの使い分けは、日本語に置き換えると分かりやすくなります。
「東京に住んでいて、30歳以上のユーザー」なら、東京かつ30歳以上なのでANDです。
WHERE address = '東京'
AND age >= 30
「東京または大阪に住んでいるユーザー」なら、東京または大阪なのでORです。
WHERE address = '東京'
OR address = '大阪'
迷ったときは、SQLを書く前に取得したい条件を日本語で書き出すのがおすすめです。
AND条件の実例
2条件をANDで指定する例
次のSQLは、商品テーブルから「公開中」かつ「在庫あり」の商品を取得します。
SELECT *
FROM products
WHERE status = 'published'
AND stock > 0;
この場合、公開中であっても在庫が0の商品は除外されます。また、在庫があっても非公開の商品は取得されません。
ECサイトや管理画面では、このように「表示対象にするための必須条件」をANDで組み合わせるケースがよくあります。
3条件以上をANDで指定する例
ANDは3つ以上の条件にも使えます。
SELECT *
FROM orders
WHERE payment_status = 'paid'
AND shipping_status = 'pending'
AND created_at >= '2026-01-01';
このSQLは、次の条件をすべて満たす注文を取得します。
- 支払い済み
- 発送待ち
- 2026年1月1日以降に作成された注文
条件が増える場合は、1行に詰め込まず、条件ごとに改行すると読みやすくなります。
悪い例は次のような書き方です。
SELECT * FROM orders WHERE payment_status = 'paid' AND shipping_status = 'pending' AND created_at >= '2026-01-01';
実行結果は同じでも、条件が増えるほど読みづらくなり、修正時のミスが起きやすくなります。
ANDでは成立しない条件に注意
同じ列に矛盾する条件を書くと0件になる
AND条件でよくあるミスが、同じ列に対して同時に成立しない条件を書いてしまうケースです。
SELECT *
FROM users
WHERE id = 1
AND id = 3;
このSQLは、「idが1であり、かつidが3である行」を探しています。
1つの行のidが同時に1と3になることはないため、結果は0件になります。
複数候補を指定したい場合はORまたはINを使う
idが1または3のユーザーを取得したい場合は、ANDではなくORを使います。
SELECT *
FROM users
WHERE id = 1
OR id = 3;
さらに、同じ列に対して複数候補を指定するなら、INを使うとより読みやすくなります。
SELECT *
FROM users
WHERE id IN (1, 3);
実務では、次のようなORの羅列はINに置き換えられるか検討するとよいでしょう。
WHERE category = 'news'
OR category = 'blog'
OR category = 'column'
INを使うと、次のように簡潔になります。
WHERE category IN ('news', 'blog', 'column')
ANDとORを併用するときの注意点
ANDはORより先に評価される
SQLでANDとORを同時に使う場合、特に注意すべきなのが演算子の優先順位です。
多くのSQLでは、ANDはORよりも先に評価されます。Microsoft SQL Serverの公式ドキュメントでも、演算子の優先順位によって評価順が決まり、ANDはORより高い優先順位として扱われています。
MySQLの公式ドキュメントでも、演算子の優先順位は高いものから低いものへ示されており、ANDがORより前に評価される順序で記載されています。
そのため、次のSQLは見た目通りに左から順番に評価されるわけではありません。
SELECT *
FROM customers
WHERE country = 'Spain'
AND customer_name LIKE 'G%'
OR customer_name LIKE 'R%';
このSQLは、次のように解釈されやすくなります。
WHERE (country = 'Spain' AND customer_name LIKE 'G%')
OR customer_name LIKE 'R%'
つまり、R%で始まる顧客は国がスペインでなくても取得されてしまう可能性があります。
括弧で意図した条件グループを明示する
「スペインの顧客で、名前がGまたはRで始まる人」を取得したいなら、ORの部分を括弧で囲む必要があります。
SELECT *
FROM customers
WHERE country = 'Spain'
AND (
customer_name LIKE 'G%'
OR customer_name LIKE 'R%'
);
このように書くことで、次の条件になります。
- 国はスペインである
- かつ、顧客名がGまたはRで始まる
Oracle Databaseの公式ドキュメントでも、括弧を使うことで演算子の優先順位を上書きでき、括弧内の式が先に評価されると説明されています。
SQLでは、括弧は「念のため」ではなく、「条件のまとまりを明示するための重要な記号」と考えるべきです。
ANDとORを併用する正しい書き方
基本形:必須条件 AND(選択条件A OR 選択条件B)
実務でよく使う安全な型は、次の形です。
WHERE 必須条件
AND (
選択条件A
OR 選択条件B
)
たとえば、公開中の記事のうち、カテゴリが「ニュース」または「コラム」の記事を取得する場合は次のように書きます。
SELECT *
FROM posts
WHERE status = 'published'
AND (
category = 'news'
OR category = 'column'
);
この書き方なら、status = 'published'が必ず適用されます。
括弧を省略すると、意図しない記事まで取得される可能性があります。
SELECT *
FROM posts
WHERE status = 'published'
AND category = 'news'
OR category = 'column';
このSQLでは、category = 'column'の条件が単独で評価され、非公開のコラム記事まで取得される可能性があります。
条件群同士をORでつなぐ場合
次のように、条件のセット同士をORでつなぐケースもあります。
SELECT *
FROM users
WHERE (
address = '東京'
AND age >= 30
)
OR (
address = '大阪'
AND age >= 40
);
これは、次の条件を意味します。
- 東京在住で30歳以上
- または、大阪在住で40歳以上
このような場合は、条件群ごとに括弧で囲むと、どの条件がセットになっているのかが明確になります。
NULLを含む複数条件の注意点
NULLは「= NULL」では判定できない
SQLの複数条件で意外と多いミスが、NULLの扱いです。
次のような書き方は正しくありません。
SELECT *
FROM users
WHERE deleted_at = NULL;
NULLを判定する場合は、IS NULLを使います。
SELECT *
FROM users
WHERE deleted_at IS NULL;
MySQLの公式ドキュメントでも、NULLを判定するにはIS NULLやIS NOT NULLを使い、=や<>などの比較演算子ではNULLを正しく判定できないと説明されています。
AND条件にNULL判定を組み合わせる例
たとえば、退会していない有効ユーザーを取得したい場合は、次のように書きます。
SELECT *
FROM users
WHERE status = 'active'
AND deleted_at IS NULL;
このSQLは、次の2条件を満たすユーザーを取得します。
- ステータスが有効
- 削除日時がNULL、つまり削除されていない
会員管理、記事管理、注文管理などでは、deleted_at IS NULLのような論理削除条件をANDで加える場面がよくあります。
実務でよくある失敗例
失敗1:括弧を省略して意図しないデータを取得する
ANDとORを混在させたときに括弧を省略すると、条件の一部だけが意図せず広がることがあります。
特に危険なのは、管理画面や集計SQLで「本来表示してはいけないデータ」が混ざるケースです。
たとえば、公開中の記事だけを対象にしたいのに、OR条件によって非公開記事が混ざると、表示不具合や集計ミスにつながります。
失敗2:ANDを使いすぎて0件になる
条件を厳しくしすぎると、結果が0件になります。
SELECT *
FROM products
WHERE category = 'book'
AND category = 'electronics';
このSQLは、1つの商品が同時に「本」と「家電」のカテゴリであることを求めています。
複数カテゴリのどれかに該当する商品を取りたいなら、次のように書くべきです。
SELECT *
FROM products
WHERE category IN ('book', 'electronics');
失敗3:条件追加後に件数確認をしない
SQLは文法的に正しくても、業務要件として正しいとは限りません。
そのため、複数条件を追加したら必ず件数を確認することが重要です。
確認の流れは次の通りです。
- まず必須条件だけで実行する
- AND条件を1つずつ追加する
- 件数が想定通りに減っているか確認する
- OR条件を追加したら、想定外のデータが混ざっていないかサンプル確認する
特にOR条件を追加した後は、件数が増えやすいため注意が必要です。
複数条件を読みやすく書くコツ
1条件1行で書く
複数条件を書くときは、1条件1行で書くと読みやすくなります。
SELECT *
FROM users
WHERE status = 'active'
AND role = 'admin'
AND last_login_at >= '2026-01-01';
条件が増えたときも、差分が分かりやすく、レビューしやすくなります。
ANDとORのまとまりをインデントで表現する
ORを含む条件は、括弧とインデントでまとまりを表現します。
SELECT *
FROM posts
WHERE status = 'published'
AND deleted_at IS NULL
AND (
category = 'news'
OR category = 'column'
);
このように書くと、次の構造が一目で分かります。
- 公開中
- 削除されていない
- カテゴリはニュースまたはコラム
SQLは自分だけが読むものではありません。チーム開発では、他のエンジニアが読んでも意図が伝わる書き方が重要です。
ORの羅列はINに置き換える
同じ列に対するORが続く場合は、INを使うと可読性が上がります。
WHERE status = 'draft'
OR status = 'published'
OR status = 'archived'
次のように書き換えられます。
WHERE status IN ('draft', 'published', 'archived')
条件が増減したときも、INの方が修正しやすくなります。
実務で使える確認チェックリスト
SQLを書く前に確認すること
SQLを書く前に、次の点を整理しておきましょう。
- 取得したいデータを日本語で説明できるか
- 必須条件と選択条件を分けられているか
- ANDで絞る条件か、ORで広げる条件か
- NULLを含む可能性がある列か
- 同じ列に複数候補を指定していないか
SQLを書いた後に確認すること
SQLを書いた後は、次の点を確認します。
- ANDとORが混在している箇所に括弧を付けているか
- 条件を追加した後、件数が想定通りに変化しているか
- 取得結果のサンプルを目視確認したか
- OR条件によって不要なデータが混ざっていないか
- NULL判定に
IS NULLまたはIS NOT NULLを使っているか
このチェックを習慣化すると、WHERE句の条件ミスは大幅に減らせます。
公式情報・参考情報
- SQLの条件指定や演算子の優先順位は、DB製品ごとに細かい仕様差があります。業務で利用しているDBに合わせて、公式ドキュメントも確認しておくと安心です。
- PostgreSQLを使っている場合は、SELECT文やWHERE句の公式ドキュメントを確認すると、WHERE句がどのように行を絞り込むかを理解できます。
- MySQLを使っている場合は、演算子の優先順位とNULLの扱いを公式ドキュメントで確認しておくと、AND/OR混在時やNULL判定のミスを防ぎやすくなります。
- SQL Serverを使っている場合は、Transact-SQLの演算子優先順位を確認することで、ANDとORの評価順を正確に把握できます。
- SQLiteでも、公式ドキュメントに演算子の優先順位が高い順に整理されており、
ANDがORより上位にあることを確認できます。
まとめ
SQLのAND条件は、WHERE句で複数条件を指定するうえで欠かせない基本です。
ANDは「すべての条件を満たす行」を取得するため、条件を追加するほど結果は絞り込まれます。一方、ORは「いずれかの条件を満たす行」を取得するため、条件を追加するほど結果が広がりやすくなります。
特に重要なのは、ANDとORを併用するときの括弧です。多くのSQLではANDがORより先に評価されるため、括弧を省略すると意図しないデータを取得してしまう可能性があります。
実務では、次の3点を意識しましょう。
- 取得条件を日本語で整理してからSQLを書く
- ANDとORが混在する場合は必ず括弧でグループ化する
- 条件追加後は件数と取得結果のサンプルを確認する
SQLは、単にデータを取得するための文法ではなく、業務ロジックを正しく表現するための重要な技術です。WHERE句の条件設計を丁寧に行えるようになると、データ抽出、管理画面開発、レポート作成、障害調査など、さまざまな開発現場で役立ちます。
こうした基礎を大切にしながら、実務で使えるSQL力を高めたい方にとって、日々の開発環境やチームのレビュー文化はとても重要です。私たちは、データベースやWebシステムの基本を大切にしながら、実務で成長していける仲間を探しています。SQLやバックエンド開発に関心があり、確かな技術を身につけながら働きたい方は、ぜひ一緒に成長していきましょう。
学んだSQLを、実務で使えるスキルにしたい方へ
本記事ではSQLの基本的な考え方や使い方を解説しましたが、
「実務で使えるレベルまで身につけたい」と感じた方も多いのではないでしょうか。
SQLは、文法を理解するだけでなく、
- どんなデータ構造で使われるのか
- どんなクエリが現場で求められるのか
を意識して学ぶことで、実践力が大きく変わります。
そうした「実務を見据えたSQL学習」を進めたい方には、
完全無料で学べるプログラミングスクール ZeroCode PLUS という選択肢もあります。
- SQLを含むWeb・データベース系スキルを体系的に学べる
- 未経験者でも実務を意識したカリキュラム
- 受講料・教材費がかからない完全無料の学習環境
- 完全オンラインでスキマ学習
※学習内容や進め方を確認するだけでもOKです