へっぽこブログ

【SQL】HAVING句とは? 使い方をわかりやすく解説!

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句の基本的な使い方について解説しました。
テーブルをグループ化して、条件を指定したい際は使用してみてください。

モバイルバージョンを終了