今回は、データベース言語SQLの「HAVING句」を解説していきます。データベース操作の際に、ある特定の基準に合致するデータのみを抽出したいと思うことはよくあります。そんなときに役立つHAVING句の解説と、同様の役割を果たすWHERE句との違いにも触れていきます。
HAVING句とは?
SQLのHAVING句は、SELECT文中で使用され、GROUP BY句によってグループ化されたデータに対して特定の条件を適用し、条件を満たす結果のみを取得するための構文です。
対照的に、WHERE句はデータをグループ化する前の個別のレコードに条件を適用するためのものであり、HAVING句とは役割が異なります。このように、SQLには、データを事前に絞り込むための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句の詳細や使い方に興味がある方は、以下の関連記事も参考にしてみてください。
WHEREとHAVINGの違いは?
WHERE句とHAVING句は、どちらもデータをフィルタリングするための機能という点で共通しています。しかし、それぞれがどの段階でフィルタリングを行うかというタイミングが大きく異なります。
WHERE句は、データを取得する最初の段階でフィルタリングを行います。つまり、データベースからデータを読み取る前に、不要なレコードを除外します。
GROUP BY句は、次の段階として指定されたカラムに基づいてデータをグループ化します。
最後に、HAVING句はこのグループ化されたデータに対してさらなるフィルタリングを行います。特に、集計関数とともに使用されることが多いです。
この順番を理解することで、「WHERE」→「GROUP BY」→「HAVING」という具体的なコマンドの実行順序が分かるようになります。
WHERE句の詳しい動作や応用方法について詳しく知りたい方は、次の関連記事をお読みください。
WHEREとHAVINGは併用できる?
HAVINGとWHEREは、コマンドの実行タイミングが異なるため併用することができます。
具体的なクエリの例を理解するために、先ほど用いた customerテーブル を参照します。
ある企業が特定の広告経路(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 | customer_count |
---|---|
ad1 | 2 |
ad2 | 2 |
このように、WHEREとHAVINGの併用で、より詳細な条件を設定してデータを抽出できます。
まとめ
HAVING句を使用することで、大量のデータの中から特定の情報をピンポイントで抽出することができるようになります。データ分析やレポートなど、用途に合わせてHAVING句を活用してみてください。
以下では、SQLに関するさまざまな記事を取り上げています。SQLに関する疑問や興味がある方は、ぜひ併せて参考にしてみてください。
SQLの勉強方法は?
SQLには、今回紹介したHAVING以外にも多くの構文があり、完全に習得し、自在にデータを扱えるようになるには多くの学習時間と実践の時間が必要になります。
特に、実践の時間については独学ではなかなか設けることができないものです。実践を交えてSQLを身につけたいと考えるのであれば、総合的な実践まで経験できるプログラミングスクールがおすすめです。
当サイトTECH MANIAでは、最短3か月で基礎から実践力・応用力まで身につけることのできるプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
独学でつまずいた方、一流のITエンジニアとしてスキルを高めていきたい方は必見です。
お問い合わせは以下のリンクからお進みください。