SQL

SQL HAVING句の使い方【実行コード付き】

酒井 裕麻株式会社Bistro 代表取締役社長

本記事の内容

データ集計時に欠かせないSQLですが、大容量のデータを集計する際は集計コストの軽量化が重要です。
集計コストの軽量化を実現する際に、よく使用される「HAVING句」の使い方を紹介します。
HAVING句は、グループ化したデータに対して条件を設定するときに使う関数です。
この記事では、HAVING句の基本的な使い方から、WHERE句との違い、実際の活用シーンまでをわかりやすく紹介します。
SQLの集計処理を効率化し、より軽量でスマートなデータ分析に役立てていきましょう。SQL HAVING

参考記事

SQLの基本 : まずはこれだけ覚えよう【初心者向け基礎ガイド】
SQLの基本 : WHERE句を用いた数値条件指定ガイド【初心者向け基礎ガイド】

SQL HAVING句とは?

HAVING句(ハビング句)は、GROUP BYでグループ化した後の集計結果に対して条件を指定するための関数です。
例えば購入データのログに対して、合計購入金額が10,000円以上のユーザーに、データを限定したい場合について考えます。
HAVING句を使わない場合、ユーザーごとの合計購入金額を集計して、その後10,000円以上の購入が行われているユーザーに限定する処理を行う必要があります。

SQL HAVING句を使わない場合
WITH USER_PURCHASE_AMOUNT AS (
SELECT
   USER_ID
   ,  SUM(PURCHASE_AMOUNT) AS TOTAL_AMOUNT
FROM
   PURCHASE_LOG
GROUP BY
   USER_ID
)
SELECT
   USER_ID
FROM
   USER_PURCHASE_AMOUNT
WHERE
   TOTAL_AMOUNT >= 100000

一方でHAVING句を使うことで、SUM()などのGROUP BYが必要な集計関数の結果に対して、集計条件を適用することができます。
実際にHAVING句を使用したSQLの例をもとに確認しましょう。

SQL HAVING句を使う場合
SELECT
   USER_ID
   ,  SUM(PURCHASE_AMOUNT) AS TOTAL_AMOUNT
FROM
   PURCHASE_LOG
GROUP BY
   USER_ID
HAVING
   TOTAL_AMOUNT >= 100000

このようにHAVING句を使用することで、SQL自体も簡略化でき、WITH句を使用しないでもSQLを記載することができました。

SQL HAVING句のメリット

GROUP化した集計関数に対して、集計条件をかけることができるSQL HAVING句を使うことは、大容量データ集計においてメリットをもたらします。

SQLの簡略化(シンプル)

例に挙げたSQLでは、記載するSQLが短くなり、SQLをシンプルに保てています。
SQLをシンプルにすることで、SQLを誰かに渡した際に、読みやすいSQLとなり、認識齟齬が発生しにくくなります。

集計処理の軽量化

SQL HAVING句を使わない場合の処理は、以下のように記載できます。

  1. 各ユーザーの合計購入数を集計
  2. 集計結果を1度ネストに保持
  3. ネストから集計条件に合うデータを抜き出す

一方で、SQL HAVING句を使用した場合の処理は、以下のように記載できます。

  1. 各ユーザーの合計購入数を集計
  2. 結果から集計条件に合うデータを抜き出す

このようにHAVING句を使用することで集計時の処理工程が1つ少なくなることがわかりました。
処理工程が少なくなる = 集計処理が軽量化されるので、大容量の集計においては重宝されます。

大容量のデータを使用する際は、集計処理の軽量化が非常に重要な課題となります。
HAVING句を使用することでなるべく軽量化した状態での集計を行うように心がけましょう。

参照

Microsoft Ignite : COUNT (Transact-SQL) – SQL Server | Microsoft Learn
SQL以外にも様々なデータに関する知識を公開中 : Bistro Data School – 株式会社Bistro

CONTACT

データ活用のお悩み、
直接相談しませんか。

「何から始めればいいかわからない」段階でも大丈夫です。課題の整理からお手伝いします。