SQLの条件抽出構文としてWHEREがありますが、GROUP BYを用いてCOUNT,SUMなどの集計関数で算出した値をWHEREで絞り込むと意図した値になりません。GROUP BYで集計した結果にたいして条件指定で絞り込みたい場合はHAVING句を利用しないと適切に条件を抽出することができません。
SQLを始めたばかりの方や、慣れていない方はなぜ条件通りに抽出できないのか?HAVING句を知らないと悩むポイントです。強引に違う方法(WITH句やテーブル化など)を用いれば対応ができますが、非効率です。
そこで、本記事では、SQLのWHEREとHAVINGの違いを解説することで、なぜGROUP BY利用後にWHEREを利用すると適切な値が抽出されないのか?HAVINGがどういう仕組みなのかを解説いたします。
SQLのWHERE句とHAVING句で抽出した値の違い
例えば下記のような商品にたいして売上金額のみが書かれているデータがあるとします。商品数はAからCの3通りですが、売上金額が違うので5個のデータになっています。
PRODUCT | SALES |
---|---|
A | 100 |
B | 200 |
B | 300 |
C | 400 |
C | 500 |
このデータから商品毎の売上合計金額が500円以上のデータを抽出したいとします。WHERE句を用いたSQL文は下記。
SELECT 商品、SUM(SALES) AS SUMsales
FROM テーブルA
WHERE SALES >= 500
GROUP BY ALL
結果はCの500のみが抽出されます。今回のお題は「商品毎の売上合計金額」を抽出したいので、結果がことなります。
PRODUCT | SALES |
---|---|
C | 500 |
では、HAVING句を使ってかいてみます。
SELECT 商品、SUM(SALES) AS SUMsales
FROM テーブルA
GROUP BY ALL
HAVING SALES >= 500
結果です。
PRODUCT | SALES |
---|---|
B | 500 |
C | 900 |
商品毎に合計金額が集計された値にたいして、条件を絞り込んだ結果が抽出されました。
WHEREとHAVINGの書く順番に注意
WHEREはGROUP BYの前に実行される条件です。SQL構文もGROUP BYの上に書きます。一方、HAVINGは集計後のデータにたいして条件抽出します。GROUP BYの下にHAVINGと記載し、SQL構文の位置も違いいます。
まとめ
SQLのWHERE句とHAVING句の違いについて解説しました。