HAVING句とは?
GROUP BY句によってテーブルをグループ分けをした際に、グループに対して条件を指定したい場合に使います。条件指定といえば「WHERE句」を思い浮かべるかと思いますが、レコードに対してのみ条件指定ができないため、グループに対する条件指定は今回説明する「HAVING句」を使用します。
HAVING句の使い方
基本構文
では、早速HAVING句の使い方を解説します。まずHAVING句の基本構文は下記の通りです。
SELECT <列名1>, <列名2>, <列名3>,・・・
FROM <テーブル名>
GROUP BY <列名1>, <列名2>, <列名3>,・・・
HAVING <グループの値に対する条件>
HAVING句を置く位置は、GROUP BY句の後ろである必要があります。
DBMSでの実行順序もGROUP BY句の後になります。
・上記構文にての実行順序は下記の通り
FROM ▶ WHERE ▶ GROUP BY ▶ HAVING ▶ SELECT
使い方
上記のSHOHINテーブルを使って説明していきます。
例えば、商品分類でグループ化したものに対して、
「行数が2行」という条件を指定すると下記の通りになります。
SELECT category , COUNT(*)
FROM SHOHIN
GROUP BY category
HAVING COUNT(*) = 2;
実行結果は、、、
+——————+———————+
|category…….| COUNT………. |
+——————+———————+
|衣類…………..|………………. 2|
|事務用品……..|………………..2|
+——————+———————+
行数が3行の「食品」が実行結果から除外されていることが確認できます。
HAVING句を使う例をもう1つ挙げてみましょう。
同じ「商品分類」でグループ化を行い、今度は「商品単価の平均が300円以上」を確認してみます。
SELECT category , AVG(unit_price)
FROM SHOHIN
GROUP BY category
HAVING AVG(unit_price) >= 300;
実行結果は、、、
+——————+———————+
|category…….| AVG……........ |
+——————+———————+
|衣類…………..|……….....1030|
|事務用品……..|………….…365|
+——————+———————+
販売原価の平均が300円未満の食品が結果から消えていることが確認できます。
HAVING句よりもWHERE句を使用した方が良い条件
ここまでHAVING句の使い方を説明してきましたが、HAVING句でもWHERE句でも使用できる条件があります。それは集約キーに対する条件になります。テーブルの列で集約キーとして使用しているものは、HAVING句でも使用することができます。
下記の2つのパターンは同じ結果を返します。
・HAVING句を使用した場合
SELECT category , COUNT(*)
FROM SHOHIN
GROUP BY category
HAVING category = ‘衣類’;
・WHERE句を使用した場合
SELECT category , COUNT(*)
FROM SHOHIN
WHERE category = ‘衣類’
GROUP BY category;
どちらも実行結果は、、
+——————+———————+
|category…….| COUNT………. |
+——————+———————+
|衣類…………..|………………. 2|
+——————+———————+
になります。
条件を書く場所が「WHERE」か「HAVING」かの違いだけで、条件の内容は同じ且つ、返す結果も同じ。つまりどちらを使用してもよいと思われがちですが、それぞれの本来の役割を考えると
・HAVING句はグループに対して条件を指定
・WHERE句は行に対して条件を指定
と書くようにした方が、読みやすいコードになるかと思われます。
あとは、WHERE句とHAVING句の実行速度の違いもあり、一般的にはWHERE句を使用した方が実行速度は速く、結果が返ってくる時間も短くなります。
まとめ
いかがでしたでしょうか?
今回はHAVING句の基本的な使い方について解説しました。
テーブルをグループ化して、条件を指定したい際は使用してみてください。