こんにちは、さるまりんです。
GROUP BY
とHAVING
、SQLを書くときになんとなく使ってきてしまってました。
この機会にどんな役割なのか改めてみてみたいと思います。
GRUOP BY
GROUP BY
は何をしてくれるのでしょうか?
同じ値を持つレコードをグループにしてくれます。
COUNT
やSUM
、AVG
などの集計のための関数と一緒に使うことがよくあります。
こんな感じです。
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
で覚えておけば大丈夫。
なんとなくではなくちゃんと使えます。
基本的なことも振り返るの大切ですね。
読んでくださってありがとうございました。
それではまた!