【SQL】HAVING句、ちゃんと使いこなせてる?

【SQL】HAVING句、ちゃんと使いこなせてる?

どうも、hosigakiです!
今日はHAVING句の使い方について紹介します!

そもそもHAVING句って何?

HAVING句とは、

GROUP BY句と組み合わせて使う、実行結果を絞るための構文のことです。

まずは実際の利用例を見てみましょう!

HAVING句の使い方(入門編)

以下のpurchasesテーブルから、合計購入数が2個以上のproductごと、合計購入数を算出するとします。

idproductuser_idgenderagepurchased_at
1干し柿10男性302022-1-1
2干し柿ジュース10男性302022-1-1
3柿まんじゅう10男性302022-1-1
4干し柿11女性322022-1-3
5柿まんじゅう11女性322022-1-3
6干し柿12男性402022-1-4
purchasesテーブル

まずは、単純にproduct別の合計購入数を算出してみましょう。
以下は、クエリとその実行結果です。

SELECT
    product,
    COUNT(product) AS n_of_products
FROM
    purchases
GROUP BY
    product
productn_of_products
干し柿3
干し柿ジュース1
柿まんじゅう2
実行結果

ここで、上記クエリにHAVING句を追加することで、合計購入数が2個以上のproductのみに絞ることができます!
以下は、HAVING句を追加したクエリとその実行結果です。

SELECT
    product,
    COUNT(product) AS n_of_products
FROM
    purchases
GROUP BY
    product
HAVING
    COUNT(product) >= 2
productn_of_products
干し柿3
柿まんじゅう2
HAVING句を加えたクエリの実行結果

先ほどの実行結果から、n_of_productsが1の「柿ジュース」のレコードが除外されましたね!

このように、HAVING句はGROUP BY句と組み合わせて使うことで、実行結果を絞ることができるんです!

HAVING句の使い方(発展編)

idproductuser_idgenderagepurchased_at
1干し柿10男性302022-1-1
2干し柿ジュース10男性302022-1-1
3柿まんじゅう10男性302022-1-1
4干し柿11女性322022-1-3
5柿まんじゅう11女性322022-1-3
6干し柿12男性402022-1-4
purchasesテーブル

先ほどは、上記のpurchasesテーブルから、
合計購入数が2個以上のproductごとの、合計購入数 を算出しましたね!

次は、
合計購入数が2個以上のproductごとの(合計購入数ではなく、)最年長購入者の年齢
を算出してみましょう!

クエリと実行結果は以下になります。
先ほどのクエリと比べると、「COUNT(product)」が「MAX(age)」に変わっています。

SELECT
    product,
    MAX(age) AS max_age
FROM
    purchases
GROUP BY
    product
HAVING
    COUNT(product) >= 2
productmax_age
干し柿40
柿まんじゅう32
SELECT句の2行目をMAX(age)に書き換えたクエリの実行結果

ここでは、次のような順で処理が行われています。

  1. purchasesテーブルのレコードをproduct別にグルーピング。
  2. 各グループ中、グループ内でのproductの合計数が2個以上のグループのみに絞る
  3. 残ったグループ内で、ageの最大値を算出

これで、合計購入数が2個以上のproductごとの最年長購入者の年齢 を算出できましたね!

もうお分かりのように、HAVING句とSELECT句の記載を必ずしも合わせる必要はありません。

HAVING句はあくまで「GROUP BY句でグルーピングされたレコードを絞るための構文」であり、絞った後にSELECT句で何を書くかは自由

ということを覚えておくと、分析の幅が広がります!

HAVING句のより詳細な情報は、BigQueryの公式リファレンス に記載されているので、興味がある方はご参考ください!

ここまで読んでくださりありがとうございました!
また次の記事でお会いしましょう(^^)/

-SQL
-, ,