私はSQLを日頃業務で扱っているのですが、悩みがあります。
WHERE句の中にCOUNT()などの集計関数を書く場合に、GROUP BY句とWHERE句ではなくてHAVING句を使います。
頭ではわかっているのに、GROUP BY句とWHERE句を無心で書いている率が高いので自分なりの理解を備忘録として残します。
SQLの動く順番
SQLは書く順番通りに上から動きません。
しかし書く順は守らないと構文エラーが起きますし、動く順番を理解していないと正しく書けません。
下記の通りです。
参考:【SQL】SQLの「書く順番」と「実行される順番」を整理してみる
| 句 | 書く順番(役割) | 動く順番 |
|---|---|---|
| SELECT | 1(取得する項目を指定) | 6 |
| FROM | 2(参照するテーブルやビューを指定) | 1 |
| JOIN | 3(結合するテーブルやビューを指定) | 2 |
| WHERE | 4(絞り込み条件を指定) | 3 |
| GROUP BY | 5(どの項目で集計するか指定) | 4 |
| HAVING | 6(集計後の絞り込み条件を指定) | 5 |
| ORDER BY | 7 (並び順を指定) | 7 |
SELECT句がかなり後半なのびっくりですよね。
最初にFROM句からであることを私は「お前地元どこ?」という感覚で覚えました。
GROUP BYとWHEREは何で併用できないの?
文章だとわかりにくいので、私は図を作ってイメージしました。
実際データは縦に並びますが、便宜上で下記画像のデータを分けていくとして、考えてみます。

- 図形:丸、四角、三角
- 色:赤、青
で、全部で12個の図形があります。
WHERE句で色が青の図形だけにする
WHERE句が先に動くのは先述の通りです。
青だけに絞り込むとどうなるでしょうか?
はい、全部で6個に減りましたね。
これで各項目を集計するとします。
| 図形 | WHERE句前の集計 | WHERE句後集計 |
|---|---|---|
| 丸 | 4 | 2 |
| 四角 | 4 | 3 |
| 三角 | 4 | 1 |
| 色 | WHERE句前の集計 | WHERE句後集計 |
|---|---|---|
| 赤 | 6 | 0 |
| 青 | 6 | 6 |
もし「全体で何個あるか」を知りたい場合、先にWHERE句でデータを減らしてしまうと、本来の全体の件数が何件だったのか分からなくなってしまいますよね。
GROUP BY句とHAVING句を使うと…?
「全体を集計したあとに、青いデータだけを表示したい!」という時に活躍するのが、GROUP BY句 ⇒ HAVING句 の順番で動くコンビです。
GROUP BY句で図形ごとに集計をする
項目名が日本語なので微妙ですがコードは下記の通りです。
SELECT
"図形",
"色",
COUNT(*) AS "図形件数"
FROM
"表"
GROUP BY
"図形",
"色"
HAVING
"色" = '青';
元は4個ずつあったけど、青色に絞ることで減ったことがわかりますね!
今は簡易な図で説明したので、「だから何?」という部分もあるかもしれません。
しかし実際のデータを扱う時には何件あるのか?ユニーク化で変わったのか?などの観点を見ることが多いのでしっかりと覚えておきましょう!
オブジェクティブグループではXの投稿も平日毎日行っています!
IT 関連の小ネタや便利技から、日常のアニメ・ゲーム布教なども幅広く投稿してるので、
ご興味のある方は是非フォロー・いいねをお願いします。

