nullジマ

HAVING

HAVINGはGROUP BYで作られたグループに条件を適用します。WHEREが行を絞るなら、HAVINGはグループを絞ります。 グループに条件を付ける

基本文法

SELECT group_column, COUNT(*)
FROM table_name
GROUP BY group_column
HAVING COUNT(*) >= 2;

例題

社員が2名以上の部署

部署ごとに人数を集計し、HAVINGで2名以上の部署だけを残します。

SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id
HAVING COUNT(*) >= 2;

平均給与が5,000,000以上の部署

AVG()の結果に条件を付けます。

SELECT department_id,
  COUNT(*) AS employee_count,
  AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) >= 5000000
ORDER BY avg_salary DESC;

WHEREとHAVINGを組み合わせる

先にWHEREで行を絞り、GROUP BYで集計し、HAVINGでグループを絞ります。

SELECT department_id, COUNT(*) AS employee_count, SUM(salary) AS total_salary
FROM employees
WHERE hire_date >= '2020-01-01'
GROUP BY department_id
HAVING COUNT(*) >= 2
ORDER BY total_salary DESC;

知っておくと便利なこと

  • WHEREは個別の行、HAVINGは集計したグループを絞り込みます。
  • WHEREに集計関数を直接書くことはできません。
  • 主な処理順序はFROM、WHERE、GROUP BY、HAVING、SELECT、ORDER BYです。

練習問題