グループ単位で集計した結果の条件指定(HAVING)
「HAVING」を使うと、「GROUP BY」で集計した結果に対して条件の指定ができます。
目次
1. はじめに
まずは、Shouhinの内容を確認してください。
SELECT * FROM Shouhin;
shouhin_id | name | name_kana | category_id | price |
---|---|---|---|---|
1 | アスパラガス | あすぱらがす | 1 | 256 |
2 | かぼちゃ | かぼちゃ | 1 | 300 |
3 | キャベツ | きゃべつ | 1 | 128 |
・ ・ ・ |
Shouhinの全データ(全行)が取得されました。
「GROUP BY」の例で使用するのは、「category_id」です。
「category_id」は、1が野菜、2が果物、空(NULL)が未定の商品ということを意味しています。
このデータに対して、「GROUP BY」で集計した結果に「HAVING」を使い条件指定をしていきます。
2. HAVINGの使い方
「HAVING」を使うと、「GROUP BY」で集計した結果に対して条件を指定することができます。
構文
グループ化対象列名,
集約関数
FROM
Shouhin
GROUP BY
グループ化対象列名
HAVING
条件
条件は、集約関数の集計結果に対して指定する場合がほとんどです。
商品カテゴリ別平均価格のうち、その平均価格が300円以上の商品カテゴリを取得してみます。
確認のため、最初に、全商品カテゴリ別の平均価格だけを取得してみましょう。
(まだHAVINGは使っていません。)
SELECT
category_id,
AVG( price )
FROM
Shouhin
GROUP BY
category_id
category_id | AVG( price ) |
---|---|
3500.0000 | |
1 | 186.8000 |
2 | 524.6000 |
結果、商品カテゴリごと(category_id=nullは未定商品、1は野菜、2は果物)の平均価格が取得できました。
次に、「HAVING」を使って、上の平均価格表のうち300円以上の商品カテゴリに絞ってみます。
SELECT
category_id,
AVG( price )
FROM
Shouhin
GROUP BY
category_id
HAVING
AVG( price ) >= 300
category_id | AVG( price ) |
---|---|
3500.0000 | |
2 | 524.6000 |
「GROUP BY category_id」の集計結果に対して「HAVING」を使い、条件「AVG( price ) >= 300」を指定することで、平均価格が300円以上の商品カテゴリのみに絞り込まれました。
平均価格が300円以上の商品カテゴリは、「未定の商品と、果物」ということがわかります。
ポイントとしては、SELECT句にある集約関数の記述(この場合、「AVG( price )」)をそのまま「HAVING」の条件の記述に使う事です。
「AVG( price )」は、「GROUP BY category_id」によって集計される「商品カテゴリごとの平均価格を知っている」ので、その平均価格(AVG( price ))に対して「HAVING」を使って何かしらの条件を指定するというイメージです。
3. まとめ
「HAVING」の使い方について見てきました。
「HAVING」は「GROUP BY」の集計結果に対して、条件を指定し行を絞り込むことができます。
「HAVING」に指定する条件は、SELECT句にある集約関数の記述をそのまま使います。
次は、「重複を排除する(DISTINCT)」についてです。