データベースから特定のデータを取り出す際、一つの条件だけで絞り込むことは稀であり、多くの場合で複数の条件を組み合わせる必要があります。
SQLのWHERE句は、データベース操作において最も頻繁に利用される構文の一つですが、複数の条件を正しく記述するには論理演算子の理解が欠かせません。
本記事では、実務で頻出するAND、OR、INなどの演算子を用いて、SQLで複数の条件を指定する具体的な手法を詳しく紹介します。
初心者の方でも理解できるように、実行例を交えながらその仕組みを紐解いていきましょう。
WHERE句で複数条件を扱う基本:ANDとOR
複数の条件を組み合わせてデータをフィルタリングする際、基本となるのがAND演算子とOR演算子です。
これらの演算子を使い分けることで、検索対象の範囲を狭めたり、逆に広げたりすることが可能になります。
すべての条件を満たすデータを抽出するAND
AND演算子は、指定したすべての条件に合致するレコードのみを抽出したい場合に使用します。
例えば、社員テーブルから「部署が営業部」であり、かつ「勤続年数が5年以上」の人を探すといったケースに適しています。
以下に、商品の在庫管理を想定したSQL文の記述例を示します。
-- カテゴリが '家電' かつ 価格が 50,000円以上の商品を抽出
SELECT
product_name,
category,
price
FROM
products
WHERE
category = '家電'
AND price >= 50000;
product_name | category | price
-------------+----------+-------
冷蔵庫A | 家電 | 85000
洗濯機B | 家電 | 62000
このように、ANDで繋がれた条件が両方ともTRUE(真)であるデータだけが表示されます。
条件を3つ、4つと増やしていくことも可能ですが、条件を増やすほど抽出されるデータ件数は少なくなります。
いずれかの条件を満たすデータを抽出するOR
OR演算子は、指定した条件のうち少なくとも一つに合致するレコードを抽出したい場合に使用します。
「東京都に住んでいる人、または神奈川県に住んでいる人」のように、複数の選択肢のいずれかを満たすデータを集めたい時に便利です。
-- カテゴリが '食品' または '飲料' の商品を抽出
SELECT
product_name,
category
FROM
products
WHERE
category = '食品'
OR category = '飲料';
product_name | category
-------------+----------
リンゴ | 食品
オレンジ水 | 飲料
チョコレート | 食品
ORを使用すると、いずれかの条件に該当すれば結果に含まれるため、検索結果の件数は増える傾向にあります。
IN演算子を使ったスマートな複数条件指定
同じ列に対して複数のOR条件を指定する場合、IN演算子を使うことでSQL文をより簡潔に記述することができます。
例えば、5つの異なるIDを指定する場合にORを繰り返すと記述が冗長になりますが、INを使えばスッキリとまとまります。
ORの代わりにINを使うメリット
IN演算子の中に値をカンマ区切りで列挙することで、それらのいずれかに合致するデータを抽出できます。
可読性が向上するだけでなく、記述ミスを減らす効果も期待できるでしょう。
-- IDが1, 3, 5のいずれかに該当するユーザーを抽出
SELECT
user_id,
user_name
FROM
users
WHERE
user_id IN (1, 3, 5);
user_id | user_name
--------+----------
1 | 田中太郎
3 | 佐藤花子
5 | 鈴木一郎
逆に、「リストに含まれないもの」を探したい場合は、NOT INを使用することで条件を反転させることができます。
IN演算子とサブクエリの組み合わせ
IN演算子の真価は、括弧の中に別のSELECT文(サブクエリ)を記述できる点にあります。
これにより、「特定のキャンペーンに参加したユーザーだけの注文履歴を抽出する」といった高度なフィルタリングが可能になります。
-- キャンペーン対象の店舗IDに属する売上データを抽出
SELECT
sale_id,
amount
FROM
sales
WHERE
shop_id IN (SELECT shop_id FROM campaign_shops);
演算子の優先順位と括弧 () の重要性
ANDとORを組み合わせて使用する場合、演算子の優先順位に細心の注意を払う必要があります。
SQLの世界では、デフォルトでANDはORよりも先に評価されるというルールが存在します。
意図しない結果を防ぐための括弧
もし数学の計算式において足し算より掛け算が優先されるように、SQLでもANDが優先されます。
このルールを意識せずに条件を並べると、期待していた結果とは異なるデータが抽出される原因となります。
-- 誤った例:意図せず AND が先に評価される
-- 「カテゴリが家電」かつ「価格が1万以下」の人、または「在庫が0」のものをすべて抽出してしまう
SELECT * FROM products
WHERE category = '家電' AND price <= 10000 OR stock = 0;
上記の例では、家電以外のカテゴリであっても「在庫が0」であれば抽出されてしまいます。
もし「家電の中で、『価格が1万以下』または『在庫が0』のもの」を探したい場合は、以下のように括弧を使用します。
-- 正しい例:括弧を使って OR を優先させる
SELECT * FROM products
WHERE category = '家電' AND (price <= 10000 OR stock = 0);
このように、論理の塊を括弧で囲むことで、実行順序を明示的に指定することが可能です。
数値範囲や否定の条件指定
複数条件を指定するシチュエーションでは、特定の値との一致だけでなく、範囲の指定や特定の条件の除外が必要になる場面も多いです。
BETWEENによる範囲指定
「10歳以上30歳以下」のように、ある範囲内の値を条件とする場合は、BETWEEN演算子が役立ちます。
ANDを使って age >= 10 AND age <= 30 と書くのと同じ結果を得られますが、より直感的です。
-- 2026年1月中の注文を抽出
SELECT
order_id,
order_date
FROM
orders
WHERE
order_date BETWEEN '2026-01-01' AND '2026-01-31';
IS NULLによる空値の扱い
データベースには「値が入っていない」状態を示すNULLが存在します。
NULLは = NULL では判定できず、必ず IS NULL または IS NOT NULL を使用しなければなりません。
複数の条件の中で「電話番号が登録されていない顧客のみ」といったフィルタを追加する際には必須の知識です。
-- 会員ランクが 'Gold' で、かつ退会日が入っていない(現役)ユーザー
SELECT
user_name
FROM
members
WHERE
rank = 'Gold'
AND resignation_date IS NULL;
複雑な条件指定を整理するテクニック
実務でのSQLは、条件が10行以上に及ぶことも珍しくありません。
コードの可読性を保ち、後から修正しやすいクエリを書くためのポイントを整理します。
インデントと改行の徹底
WHERE句の条件ごとに改行を入れ、演算子(AND, OR)を行頭に置くスタイルが一般的です。
これにより、どの条件がどの階層にあるのかが一目で判断できるようになります。
-- 読みやすい記述スタイル
SELECT *
FROM employees
WHERE department_id = 10
AND (
salary > 500000
OR position = 'Manager'
)
AND status = 'Active';
真偽値の組み合わせ表(真理値表)
複雑な論理条件を組む際は、以下の論理評価を頭に入れておくとミスが減ります。
| 条件A | 条件B | A AND B | A OR B |
|---|---|---|---|
| TRUE | TRUE | TRUE | TRUE |
| TRUE | FALSE | FALSE | TRUE |
| FALSE | TRUE | FALSE | TRUE |
| FALSE | FALSE | FALSE | FALSE |
特にNOT演算子が加わると論理が反転するため、表を参考にしながら慎重に構築しましょう。
パフォーマンスを意識した条件の書き方
大量のデータを扱うデータベースでは、条件の書き方次第で検索スピードが劇的に変わることがあります。
複数条件を指定する際に注意すべきパフォーマンスの観点について触れておきます。
インデックスの効く条件(SARGability)
インデックスが貼られている列に対して、関数を適用したり計算を行ったりすると、インデックスが使用されず検索が遅くなることがあります。
例えば WHERE price * 1.1 > 1000 ではなく、 WHERE price > 1000 / 1.1 と記述するのが定石です。
左側にある条件の重要性
一部のデータベースエンジンでは、AND条件の左側にある条件から評価されることがあります。
最も多くのレコードを振り落とせる(件数を絞り込める)条件を先に記述することで、処理効率が上がる場合があります。
ただし、現代のクエリオプティマイザは非常に優秀であるため、基本的には可読性を優先しても問題ありません。
まとめ
SQLのWHERE句における複数条件の指定は、データの精度を高めるために不可欠なスキルです。
ANDで絞り込み、ORで選択肢を広げ、INで記述を簡略化するという使い分けをマスターしましょう。
また、複雑な条件を組み合わせる際には、括弧を使って優先順位を明確にすることがバグを防ぐ鍵となります。
適切な条件指定を身につけることで、必要なデータを瞬時に、かつ正確に取り出せるようになります。
まずはシンプルな条件から始め、徐々に実務的な複雑なクエリに挑戦してみてください。
