PostgreSQLのWHERE句とHAVING句の違い
SQLでデータを絞り込むときは、WHERE句を使うことが多いと思います。
似たようなものにHAVING句がありますが、どのように使い分ければよいのでしょうか。
今回はWHERE句とHAVING句の違いについて紹介します。
※この記事はPostgreSQL 16.13で動作確認しています。
売上テーブル
| 売上id | 顧客id | 売上日 | 金額 |
| 1 | A001 | 2026/07/25 | 3,000 |
| 2 | A001 | 2026/08/01 | 5,000 |
| 3 | A001 | 2026/08/05 | 7,000 |
| 4 | A002 | 2026/08/02 | 4,000 |
| 5 | A002 | 2026/08/10 | 3,000 |
| 6 | A003 | 2026/08/03 | 15,000 |
WHERE句
WHERE句は、GROUP BYで集計する前のデータを絞り込むときに使用します。
今回は2026年8月以降の売上を顧客ごとに集計します。
SELECT
顧客id
,SUM(金額) AS 合計金額
FROM 売上テーブル
WHERE 売上日 >= DATE '2026-08-01'
GROUP BY 顧客id
ORDER BY 顧客id;結果
| 顧客id | 合計金額 |
| A001 | 12,000 |
| A002 | 7,000 |
| A003 | 15,000 |
7月25日の売上はWHERE句で除外されてから集計されます。
HAVING句
HAVING句は、GROUP BYで集計した後の結果を絞り込むときに使用します。
今回は合計金額が10,000円以上の顧客を取得します。
SELECT
顧客id
,SUM(金額) AS 合計金額
FROM 売上テーブル
GROUP BY 顧客id
HAVING SUM(金額) >= 10000
ORDER BY 顧客id;結果
| 顧客id | 合計金額 |
| A001 | 15,000 |
| A003 | 15,000 |
合計金額が7,000円のA002は結果から除外されました。
WHERE句とHAVING句を一緒に使う
WHERE句とHAVING句は、同じSQLで使用できます。
SELECT
顧客id
,SUM(金額) AS 合計金額
FROM 売上テーブル
WHERE 売上日 >= DATE '2026-08-01'
GROUP BY 顧客id
HAVING SUM(金額) >= 10000
ORDER BY 顧客id;結果
| 顧客id | 合計金額 |
| A001 | 12,000 |
| A003 | 15,000 |
処理の順番は以下になります。
WHERE句で8月以降の売上を抽出
↓
顧客ごとにGROUP BY
↓
HAVING句で合計金額が10,000円以上の顧客を抽出
WHERE句で行を絞り込んだ後にGROUP BYで集計し、HAVING句で集計後のグループを絞り込みます。
まとめ
WHERE句とHAVING句の違いは以下になります。
| 条件 | 使用する句 |
| 集計前のデータを絞り込む | WHERE句 |
| 集計後の結果を絞り込む | HAVING句 |
| SUMやCOUNTの結果を条件にする | HAVING句 |
WHERE句とHAVING句は似ていますが、条件を適用するタイミングが違います。
集計前に不要なデータを除外する場合はWHERE句、集計結果に条件を付ける場合はHAVING句と覚えておくと分かりやすいと思います。
このカテゴリの最新記事
2024.10.17
2024.01.12
2023.07.12
2025.01.23