SQLの集計関数を利用後に、条件抽出したい場合はHAVING句を使います。WHERE句ですと抽出することができません。HAVING句は触れる方が少ないので、存在を知らない方もいると思います。WHERE句で条件抽出できるはずなのにできない。なんでかな~と調べていたらHAVING句を使う必要があって初めて知るパターンです。
本記事では、図解とサンプルデータを用いながらHAVING句とWHERE句の違いについて解説いたします。
SQLのHAVING句とWHERE句の違い
SQL処理順が影響!集計関数GROUP BYの前がWHERE句で後がHAVING句
SQLはコード記載の順番で処理されておらず、下記順番で処理されています。この処理順番を意識してSQL文を書く必要があります。
集計関数GROUP BYの前にあるのがWHEREで後ろにあるのがHAVING
WHERE:集計(GROUP BY)される前にSQL処理されるので、集計後の値で絞り込むことができない。
HAVING:集計(GROUP BY)後にSQL処理されるので、集計後の値を絞り込める
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
サンプルデータでWHERE句とHAVING句の違いを解説
SQL構文例に使うサンプルファイル
下記データを例にコードをご紹介いたします。
■商品情報ファイル1
カテゴリ | 商品名 | 原価 | 個数 | 在庫金額 | 販売開始日 | 販売終了日 |
---|---|---|---|---|---|---|
1 | カビキラー | 1158 | 1 | 1158 | 2025/01/20 | 2025/03/20 |
HAVING句を利用したSQLサンプル例と解説
カテゴリが1のものを対象に在庫金額合計を求め、金額合計が5,000円以上のものを集計するSQL文が下記。SQL文が処理される順番をコードに振りました。(#から右の文章)
select
商品名,sum(在庫金額) as 合計金額
from 商品情報ファイル #処理順1:利用テーブル
where カテゴリ = '1' #処理順2:抽出条件
group by 1 #処理順3:集計関数
having #処理順4:集計後の条件処理
合計金額 >5000
上記SQL文を実行すると下記のような集計結果がでてきます。group byで集計された値にたいして、havingを用いて5,000円以上の商品を抽出しています。
商品名 | 合計金額 |
---|---|
カビキラー | 10,000 |
石鹸 | 7,000 |
上記SQLでWHERE句利用のサンプル例と解説
上記HAVING句をあえてWHERE句で書くと下記イメージです。下記の場合は抽出条件WHERE句のところにand 在庫金額 >5000と書きました。
処理順を見ると、where カテゴリ = ‘1’ and 在庫金額 >5000の後に集計関数group byが来るので、集計前の値で絞り込まれます。※WHERE句は1,000円が含まれません。
HAVING句の場合(5,000円以上抽出)
・1,000円
・6,000円
・8,000円
結果:15,000円
WHERE句の場合(5,000円以上抽出)
・1,000円
・6,000円
・8,000円
結果:14,000円
select
商品名,sum(在庫金額) as 合計金額
from 商品情報ファイル #処理順1:利用テーブル
where カテゴリ = '1' and 在庫金額 >5000 #処理順2:抽出条件
group by 1 #処理順3:集計関数