【SQL】WHERE句とHAVING句の使い分けで、データ抽出をもっと効率的に!
SQLにおけるWHERE句とHAVING句の違い
WHERE句
WHERE句は、SELECT句で指定されたテーブルからデータを取得する際に、個々のレコードに対して条件を指定します。つまり、WHERE句で指定された条件を満たすレコードのみが抽出されます。
例:
SELECT * FROM employees WHERE department = 'Sales' AND salary > 100000;
この例では、department
列がSales
で、salary
列が100,000円より大きい従業員のレコードのみが抽出されます。
HAVING句
HAVING句は、GROUP BY句でグループ化されたデータに対して、グループ全体の条件を指定します。つまり、HAVING句で指定された条件を満たすグループのみが抽出されます。
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 100000;
この例では、各部門の平均給与が100,000円より大きい部門のみが抽出されます。
WHERE句とHAVING句の主な違い
項目 | WHERE句 | HAVING句 |
---|---|---|
適用対象 | 個々のレコード | グループ化されたデータ |
タイミング | データ抽出前 | グループ化後 |
使用できる関数 | 集計関数を含む全ての関数 | 集計関数のみ |
- WHERE句は、個々のレコードに対して条件を指定する。
- HAVING句は、グループ化されたデータに対して条件を指定する。
- WHERE句とHAVING句は、組み合わせて使用することもできる。
WHERE句とHAVING句の比較
-- WHERE句
SELECT *
FROM employees
WHERE department = 'Sales'
AND salary > 100000;
-- HAVING句
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 100000;
-- WHERE句
| id | name | department | salary |
|---|---|---|---|
| 1 | John Doe | Sales | 120000 |
| 2 | Jane Doe | Sales | 110000 |
-- HAVING句
| department | average_salary |
|---|---|
| Sales | 115000 |
WHERE句とHAVING句の組み合わせ
SELECT department, AVG(salary) AS average_salary
FROM employees
WHERE department IN ('Sales', 'Marketing')
GROUP BY department
HAVING AVG(salary) > 100000;
結果:
| department | average_salary |
|---|---|
| Sales | 115000 |
- 特定の部門の従業員のうち、給与が最高額の従業員のみを抽出したい場合:
SELECT *
FROM employees
WHERE department = 'Sales'
ORDER BY salary DESC
LIMIT 1;
- 各部門の従業員数と平均給与を抽出したい場合:
SELECT department, COUNT(*) AS employee_count, AVG(salary) AS average_salary
FROM employees
GROUP BY department;
WHERE句とHAVING句は、それぞれ異なる役割を持つため、状況に合わせて使い分けることが重要です。
WHERE句とHAVING句の使い分け
条件の種類
- WHERE句は、比較演算子、論理演算子、IN演算子など、様々な条件を指定できます。
- HAVING句は、集計関数を含む条件のみを指定できます。
処理のタイミング
- WHERE句は、データ抽出前に処理されます。
- HAVING句は、グループ化後に処理されます。
目的
- WHERE句は、特定のレコードを抽出するために使用されます。
- HAVING句は、グループ化されたデータの集計結果に基づいて、グループを抽出するために使用されます。
SELECT *
FROM employees
WHERE department = 'Sales'
AND salary > 100000;
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 100000;
WHERE句とHAVING句以外にも、データ抽出条件を指定する方法があります。
- CASE式: 特定の条件に基づいて、異なる値を返す式です。
- EXISTS演算子: サブクエリが存在するかどうかをチェックする演算子です。
sql where-clause having