今回は、データベース言語SQLの「HAVING句」を解説していきます。データベース操作の際に、ある特定の基準に合致するデータのみを抽出したいと思うことはよくあります。本記事では、そう言った場面で役立つHAVING句について解説します。また、HAVING句と似たWHERE句との違いも説明するのでぜひ参考にしてください。
HAVING句とは?
SQLの「HAVING句」は、SELECT文で使用する、抽出条件を指定するクエリです。GROUP BY句と併用する場合は、GROUP BY句でグループ化したデータに特定の条件を適用し、それを満たす結果のみを抽出します。
一方で、HAVING句と同じく抽出条件を指定するクエリである「WHERE句」はGROUP BY句との併用時、データをグループ化する前の個別のレコードに条件を適用するもので、HAVING句とは条件を適用するタイミングが異なります。このように、同じ抽出条件を指定するクエリでも、データを事前に絞り込む「WHERE句」と、データをグループ化した後に条件を適用する「HAVING句」でフィルタリング手段が異なります。
HAVING句はどのような場面で使う?
ここからは、次のようなシナリオで具体的に見ていきましょう。
あなたはある企業やお店のために、集客目的の広告を運用する担当者として仕事をしています。あなたの運用する広告はad1、ad2、ad3の3つ。これらの広告を用いての集客活動の結果、6名の顧客の購入に成功しました。その購入情報が以下の customerテーブル に保存されています。
「customer」テーブル
name | route | saved_date | price |
佐藤 | ad1 | 2023-04-01 17:29:31 | 2100 |
鈴木 | ad2 | 2023-04-05 13:10:45 | 3500 |
加藤 | ad1 | 2023-04-19 11:37:01 | 1300 |
山本 | ad3 | 2023-05-03 15:59:58 | 4200 |
伊藤 | ad1 | 2023-05-13 09:11:47 | 5000 |
松田 | ad2 | 2023-05-24 19:49:28 | 2500 |
たとえば、各広告ルート(route)ごとの購入回数が2回以上のものを知りたいとき、GROUP BY句とHAVING句を使って以下のようなクエリを作成します。
【実行コード】
SELECT
route,
COUNT(name) AS purchase_times
FROM
customer
GROUP BY
route
HAVING
COUNT(name) >= 2;
【実行結果】
route | purchase_times |
ad1 | 3 |
ad2 | 2 |
HAVING句は、GROUP BY句でのグループ化後に集計結果に対して条件を適用するためのものです。この例では、購入回数(COUNT(name))が2回以上の広告ルートのみを取得します。購入回数が1回の ad3 は取得されていません。
このように、HAVING句は主にGROUP BY句と組み合わせて使用されます。GROUP BY句の詳細や使い方に興味がある方は、以下の関連記事も参考にしてみてください。
HAVING句とWHERE句の違いは?
WHERE句とHAVING句は、どちらもデータをフィルタリングするための機能という点で共通しています。しかし、それぞれがどの段階でフィルタリングを行うかというタイミングが大きく異なります。
SQLでは「WHERE」→「GROUP BY」→「HAVING」という実行順序があります。
つまり、「WHERE」句と「HAVING」句の間にある「GROUP BY」句が関わってこない場合は同じ挙動をしますが、「GROUP BY」句を併用する場合は挙動に違いが出てきます。
GROUP BY句の概要やHAVING句とWHERE句の違いについて以下で詳しく紹介しています。
【SQL】GROUP BY句の使い方をサンプルコードで解説
WHERE句の詳しい動作や応用方法について詳しく知りたい方は、次の関連記事をお読みください。
WHEREとHAVINGは併用できる?
HAVINGとWHEREは、コマンドの実行タイミングが異なるため併用することができます。
具体的なクエリの例を理解するために、先ほど用いた customerテーブル を参照します。
「customer」テーブル
name | route | saved_date | price |
佐藤 | ad1 | 2023-04-01 17:29:31 | 2100 |
鈴木 | ad2 | 2023-04-05 13:10:45 | 3500 |
加藤 | ad1 | 2023-04-19 11:37:01 | 1300 |
山本 | ad3 | 2023-05-03 15:59:58 | 4200 |
伊藤 | ad1 | 2023-05-13 09:11:47 | 5000 |
松田 | ad2 | 2023-05-24 19:49:28 | 2500 |
ある企業が特定の広告経路(route)を通じて購入した顧客の情報について「priceが2000以上の顧客だけ」に絞り、さらにその結果の中から各広告経路で「2人以上の顧客がいるものだけ」を取得したいとします。
【実行コード】
SELECT
route,
COUNT(name) as customer_count
FROM
customer
WHERE
price >= 2000 //priceが2000以上の顧客だけ
GROUP BY
route
HAVING
COUNT(name) >= 2; //2人以上の顧客がいるものだけ
【実行結果】
route | purchase_times |
ad1 | 2 |
ad2 | 2 |
このように、WHEREとHAVINGの併用で、より詳細な条件を設定してデータを抽出できます。
まとめ
HAVING句を使用することで、大量のデータの中から特定の情報をピンポイントで抽出することができるようになります。データ分析やレポートなど、用途に合わせてHAVING句を活用してみてください。
以下では、SQLに関するさまざまな記事を取り上げています。SQLに関する疑問や興味がある方は、ぜひ併せて参考にしてみてください。
SQL関連記事
- BETWEEN
- CASE
- COUNT
- DELETE
- DISTINCT
- EXISTS
- GROUP BY
- HAVING
- IN
- INSERT
- JOIN
- LIKE
- ORDER BY
- UPDATE
- UNION/UNION ALL
- WHERE
SQLの勉強方法は?
SQLには、今回紹介したHAVING以外にも多くの構文があり、完全に習得し、自在にデータを扱えるようになるには多くの学習時間と実践の時間が必要になります。
特に、実践の時間については独学ではなかなか設けることができないものです。実践を交えてSQLを身につけたいと考えるのであれば、総合的な実践まで経験できるプログラミングスクールがおすすめです。
当サイトTECH MANIAでは、最短3か月で基礎から実践力・応用力まで身につけることのできるプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
独学でつまずいた方、一流のITエンジニアとしてスキルを高めていきたい方は必見です。
お問い合わせは以下のリンクからお進みください。