SQLのGROUP BYとHAVINGについて

こんにちは、さるまりんです。

GROUP BYHAVING、SQLを書くときになんとなく使ってきてしまってました。
この機会にどんな役割なのか改めてみてみたいと思います。

GRUOP BY

GROUP BYは何をしてくれるのでしょうか?
同じ値を持つレコードをグループにしてくれます。
COUNTSUMAVGなどの集計のための関数と一緒に使うことがよくあります。

こんな感じです。

SELECT department, COUNT(*)
FROM employees
GROUP BY department;

上のSQLでは部署ごとの社員数をカウントしています。

HAVING

では、HAVINGはどのように使うでしょう。こちらはGROUP BYのあとに条件をかけるときに使います。
集計にフィルターをかけるイメージですね。

SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) > 10;

上のSQLで10人より多い部署だけを抽出しています。

WHEREとの違いは?

WHEREも条件でデータを絞り込むものです。
何が違うのでしょう?
絞り込みのタイミングです。WHEREは全体に対して絞り込みを行い、HAVINGは集計後のグループに対して絞り込みを行います。

-- WHERE:個々の行に効く(集計前)
SELECT department, COUNT(*) 
FROM employees 
WHERE salary > 5000 
GROUP BY department;

-- HAVING:集計後のグループに効く
SELECT department, COUNT(*) 
FROM employees 
GROUP BY department 
HAVING COUNT(*) > 10;

流れはこんな感じです。

[データ]

[WHERE]

[GROUP BY]

[HAVING]

[結果]

GROUP BYを忘れてHAVINGだけを使ってしまったり、HAVINGじゃなくてWHEREで集計条件をつけてエラーになったり。

個々の行に条件をかけたい → WHERE
グループに条件をかけたい → HAVING

で覚えておけば大丈夫。
なんとなくではなくちゃんと使えます。

基本的なことも振り返るの大切ですね。

読んでくださってありがとうございました。
それではまた!