HAVING句(ハヴィングク)とは | 意味や読み方など丁寧でわかりやすい用語解説
HAVING句(ハヴィングク)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
ハビング句 (ハビングク)
英語表記
HAVING (ハヴィング)
用語解説
HAVING句は、リレーショナルデータベースを操作するための言語であるSQLにおいて、データをグループ化した結果に対して条件を指定し、さらに絞り込みを行うために使用される句である。主にGROUP BY句とセットで用いられ、集計関数(SUM, AVG, COUNT, MAX, MINなど)によって算出された値に基づいて、特定の条件を満たすグループのみを結果として抽出する役割を担う。初心者が混同しやすいWHERE句が、グループ化される前の個々の行に対して条件を適用するのに対し、HAVING句はGROUP BY句によって作成されたグループそのものを対象とする点に根本的な違いがある。データ分析やレポーティングなど、集計された情報から特定の傾向を持つデータ群を特定する際に極めて重要な機能を提供する。
HAVING句の動作を正しく理解するには、まずGROUP BY句の役割を把握しておく必要がある。GROUP BY句は、テーブル内のデータを指定した列の値に基づいてグループにまとめる機能を持つ。例えば、従業員テーブルを部署名でグループ化すれば、部署ごとのデータ集合が作られる。このグループ化されたデータに対して、部署ごとの平均給与や従業員数を算出するといった集計処理が行われる。HAVING句は、この集計処理が完了した後のグループに対して適用されるフィルタである。SQLクエリがデータベースによって処理される順序は一般的に、FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BYの順に進む。このことから、HAVING句はGROUP BY句によるグループ化と集計が行われた後、SELECT句で最終的な出力列が決定される前に評価されることがわかる。この処理順序が、HAVING句の役割とWHERE句との違いを理解する上で鍵となる。
WHERE句とHAVING句の最も明確な違いは、条件を適用する対象とタイミングである。WHERE句は、GROUP BY句でデータがグループ化される前の、テーブルに存在する個々の行を対象とする。したがって、WHERE句の条件式には、行の各列の値は使用できるが、SUMやAVGといった集計関数の結果を使用することはできない。なぜなら、WHERE句が評価される時点では、まだ集計処理が行われていないからである。一方、HAVING句はGROUP BY句によって作成されたグループを対象とする。各グループの集計結果が算出された後に評価されるため、条件式に集計関数を含めることができる。これがHAVING句の最も本質的な機能である。「単価が1000円以上の商品」のように個々のレコードの属性で絞り込む場合はWHERE句を使い、「商品カテゴリごとの平均単価が5000円以上のカテゴリ」のように集計結果で絞り込む場合はHAVING句を使う、というように明確に役割が分担されている。
具体的な使用例を挙げる。例えば、商品ごとの売上実績を管理する「sales」テーブルがあり、このテーブルから「合計販売数量が100個以上の商品コード」を抽出したい場合を考える。この要求は、商品ごとに販売数量を合計し、その合計値が100以上であるかという集計結果に対する条件であるため、HAVING句を使用する。SQLクエリは次のようになるであろう。SELECT product_code, SUM(quantity) FROM sales GROUP BY product_code HAVING SUM(quantity) >= 100; このクエリでは、まずGROUP BY product_codeによって商品コードごとにデータがグループ化され、各グループで販売数量の合計(SUM(quantity))が計算される。その後、HAVING句がその合計値と100を比較し、条件を満たすグループ(商品)のみを最終的な結果として返す。
WHERE句とHAVING句は、一つのクエリ内で同時に使用することも可能であり、それにより多段階の絞り込みが実現できる。例えば、「関東支社の売上のうち、合計販売数量が100個以上の商品コード」を抽出したい場合、次のように記述する。SELECT product_code, SUM(quantity) FROM sales WHERE branch = '関東' GROUP BY product_code HAVING SUM(quantity) >= 100; このクエリでは、まずWHERE句によって、処理対象が関東支社のデータ(行)のみに絞り込まれる。次に、その絞り込まれたデータセットに対してGROUP BY句が適用され、商品ごとにグループ化と集計が行われる。最後にHAVING句が、集計された合計販売数量に基づいてグループを絞り込む。このように、WHERE句で行レベルの事前フィルタリングを行い、HAVING句でグループレベルの事後フィルタリングを行うことで、効率的かつ的確なデータ抽出が可能となる。HAVING句を正しく使いこなすことは、複雑な集計要件に応えるSQLを記述する上で必須のスキルである。