
データベースの世界は、まるで迷宮のようだ。SQLのWHERE
句に複数の条件を指定することは、その迷宮を抜け出すための鍵となる。しかし、この鍵を使いこなすためには、いくつかの重要なポイントを理解する必要がある。本記事では、SQLのWHERE
句における複数条件の使い方について、多角的な視点から詳しく解説する。
1. 基本的な複数条件の指定方法
SQLのWHERE
句で複数の条件を指定する最も基本的な方法は、AND
やOR
を使うことだ。例えば、以下のようなクエリを考えてみよう。
SELECT * FROM employees
WHERE department = 'Sales' AND salary > 50000;
このクエリは、「Sales部門に所属し、かつ給与が50,000を超える従業員」を検索する。AND
を使うことで、複数の条件を同時に満たすレコードを抽出できる。
2. AND
とOR
の優先順位
AND
とOR
を組み合わせる場合、優先順位に注意が必要だ。AND
はOR
よりも優先順位が高いため、以下のようなクエリでは意図しない結果が得られることがある。
SELECT * FROM employees
WHERE department = 'Sales' OR department = 'Marketing' AND salary > 50000;
このクエリは、「Sales部門に所属する従業員」または「Marketing部門に所属し、かつ給与が50,000を超える従業員」を検索する。もし「Sales部門に所属し、かつ給与が50,000を超える従業員」を検索したい場合は、括弧を使って優先順位を明示する必要がある。
SELECT * FROM employees
WHERE (department = 'Sales' OR department = 'Marketing') AND salary > 50000;
3. IN
を使った複数条件の指定
IN
を使うと、特定のカラムが複数の値のいずれかに一致するかどうかを簡単にチェックできる。例えば、以下のクエリは「Sales部門またはMarketing部門に所属する従業員」を検索する。
SELECT * FROM employees
WHERE department IN ('Sales', 'Marketing');
IN
を使うことで、OR
を繰り返し書く手間を省けるだけでなく、クエリの可読性も向上する。
4. BETWEEN
を使った範囲指定
BETWEEN
を使うと、特定の範囲内の値を簡単に指定できる。例えば、以下のクエリは「給与が40,000から60,000の間の従業員」を検索する。
SELECT * FROM employees
WHERE salary BETWEEN 40000 AND 60000;
BETWEEN
は、数値だけでなく日付や文字列にも適用できるため、非常に便利だ。
5. LIKE
を使ったパターンマッチング
LIKE
を使うと、特定のパターンに一致する文字列を検索できる。例えば、以下のクエリは「名字が’Smi’で始まる従業員」を検索する。
SELECT * FROM employees
WHERE last_name LIKE 'Smi%';
%
は任意の文字列に一致するワイルドカードで、_
は任意の1文字に一致するワイルドカードだ。LIKE
を使うことで、柔軟な検索が可能になる。
6. NOT
を使った否定条件
NOT
を使うと、特定の条件を満たさないレコードを検索できる。例えば、以下のクエリは「Sales部門に所属していない従業員」を検索する。
SELECT * FROM employees
WHERE NOT department = 'Sales';
NOT
は、IN
やBETWEEN
、LIKE
などと組み合わせて使うこともできる。
7. サブクエリを使った複雑な条件
サブクエリを使うと、より複雑な条件を指定できる。例えば、以下のクエリは「給与が平均給与を超える従業員」を検索する。
SELECT * FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
サブクエリを使うことで、動的な条件を指定できるため、非常に強力だ。
8. EXISTS
を使った存在チェック
EXISTS
を使うと、サブクエリが少なくとも1つの行を返すかどうかをチェックできる。例えば、以下のクエリは「少なくとも1つの注文を持っている顧客」を検索する。
SELECT * FROM customers
WHERE EXISTS (SELECT 1 FROM orders WHERE orders.customer_id = customers.id);
EXISTS
は、関連するテーブルの存在をチェックする際に非常に便利だ。
9. CASE
を使った条件分岐
CASE
を使うと、条件に応じて異なる値を返すことができる。例えば、以下のクエリは「給与に応じて従業員のランクを付ける」。
SELECT name, salary,
CASE
WHEN salary > 70000 THEN 'High'
WHEN salary BETWEEN 50000 AND 70000 THEN 'Medium'
ELSE 'Low'
END AS salary_rank
FROM employees;
CASE
を使うことで、複雑な条件分岐をSQL内で行える。
10. パフォーマンスの考慮
複数の条件を指定する際には、パフォーマンスにも注意を払う必要がある。特に、インデックスが効かない条件を多用すると、クエリの実行速度が遅くなる可能性がある。例えば、LIKE
やOR
を使った条件は、インデックスが効きにくいため、注意が必要だ。
関連Q&A
Q1: AND
とOR
の優先順位はどうなっていますか?
A1: AND
はOR
よりも優先順位が高いです。そのため、AND
とOR
を組み合わせる場合は、括弧を使って優先順位を明示することをお勧めします。
Q2: IN
とOR
のどちらを使うべきですか?
A2: 複数の値に対して同じカラムを比較する場合は、IN
を使う方が可読性が高く、パフォーマンスも良い場合が多いです。
Q3: BETWEEN
は日付にも使えますか?
A3: はい、BETWEEN
は日付にも使えます。例えば、WHERE date BETWEEN '2023-01-01' AND '2023-12-31'
のように指定できます。
Q4: LIKE
のワイルドカードにはどのようなものがありますか?
A4: LIKE
のワイルドカードには、%
(任意の文字列)と_
(任意の1文字)があります。
Q5: サブクエリを使う際の注意点は何ですか?
A5: サブクエリを使う際は、パフォーマンスに注意が必要です。特に、サブクエリが大量のデータを返す場合、クエリの実行速度が遅くなる可能性があります。