【SQL】集計結果の絞り込みはHAVING句!WHEREとの違いも解説

SQL 集計結果の絞り込みはHAVING句!WHEREとの違いも解説

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個のデータになっています。

PRODUCTSALES
A100
B200
B300
C400
C500

このデータから商品毎の売上合計金額が500円以上のデータを抽出したいとします。WHERE句を用いたSQL文は下記。

SELECT 商品、SUM(SALES) AS SUMsales
FROM テーブルA
WHERE SALES >= 500
GROUP BY ALL

結果はCの500のみが抽出されます。今回のお題は「商品毎の売上合計金額」を抽出したいので、結果がことなります。

PRODUCTSALES
C500

では、HAVING句を使ってかいてみます。

SELECT 商品、SUM(SALES) AS SUMsales
FROM テーブルA
GROUP BY ALL
HAVING SALES >= 500

結果です。

PRODUCTSALES
B500
C900

商品毎に合計金額が集計された値にたいして、条件を絞り込んだ結果が抽出されました。

WHEREとHAVINGの書く順番に注意

WHEREはGROUP BYの前に実行される条件です。SQL構文もGROUP BYの上に書きます。一方、HAVINGは集計後のデータにたいして条件抽出します。GROUP BYの下にHAVINGと記載し、SQL構文の位置も違いいます。

まとめ

SQLのWHERE句とHAVING句の違いについて解説しました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

著者:ブロガー2つ(につ)

■サイト設立目的
人海戦術の時代からテクノロジー活用による自動化促進の時代に変化。テクノロジー活用を促進するための情報共有やテクノロジー支援を行います。

目次