タイガーラック クリエイティブブログ
2026
August
27

PostgreSQLのWHERE句とHAVING句の違い

SQLでデータを絞り込むときは、WHERE句を使うことが多いと思います。
似たようなものにHAVING句がありますが、どのように使い分ければよいのでしょうか。
今回はWHERE句とHAVING句の違いについて紹介します。

※この記事はPostgreSQL 16.13で動作確認しています。

売上テーブル

売上id顧客id売上日金額
1A0012026/07/253,000
2A0012026/08/015,000
3A0012026/08/057,000
4A0022026/08/024,000
5A0022026/08/103,000
6A0032026/08/0315,000

WHERE句

WHERE句は、GROUP BYで集計する前のデータを絞り込むときに使用します。
今回は2026年8月以降の売上を顧客ごとに集計します。

SELECT
   顧客id
  ,SUM(金額) AS 合計金額
FROM 売上テーブル
WHERE 売上日 >= DATE '2026-08-01'
GROUP BY 顧客id
ORDER BY 顧客id;

結果

顧客id合計金額
A00112,000
A0027,000
A00315,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合計金額
A00115,000
A00315,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合計金額
A00112,000
A00315,000

処理の順番は以下になります。
WHERE句で8月以降の売上を抽出

顧客ごとにGROUP BY

HAVING句で合計金額が10,000円以上の顧客を抽出
WHERE句で行を絞り込んだ後にGROUP BYで集計し、HAVING句で集計後のグループを絞り込みます。

まとめ

WHERE句とHAVING句の違いは以下になります。

条件使用する句
集計前のデータを絞り込むWHERE句
集計後の結果を絞り込むHAVING句
SUMやCOUNTの結果を条件にするHAVING句

WHERE句とHAVING句は似ていますが、条件を適用するタイミングが違います。

集計前に不要なデータを除外する場合はWHERE句、集計結果に条件を付ける場合はHAVING句と覚えておくと分かりやすいと思います。

このカテゴリの最新記事

関連記事

SHOP LIST

タイガーラック株式会社

〒577-0056
大阪府東大阪市長堂1-3-14 TOKUYASU Bld.