2.

HAVING句

編集

OracleのSQLのHAVING句の記事です。GROUP BY でグループ化した結果に対して条件を絞り込むために使います。WHERE句は集約前に行をフィルタしますが、HAVINGは集約後に集約結果をフィルタする違いがあります。

基本構文

SELECT カラム1, 集約関数(カラム2)
FROM テーブル
WHERE  個別行の条件
GROUP BY カラム1
HAVING 集約後の条件
ORDER BY ...;

WHERE との違い

適用タイミング使える条件
WHEREGROUP BY (個別行)カラム値の比較
HAVINGGROUP BY (集約結果)集約関数(COUNT、SUM、AVG等)の比較

使用例

注文が3件以上ある顧客

SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(*) >= 3;

合計金額が10万円以上の顧客

SELECT customer_id, SUM(price) AS total
FROM orders
GROUP BY customer_id
HAVING SUM(price) >= 100000;

WHEREとHAVINGの併用

-- 2024年の注文の中で、合計が10万円以上の顧客
SELECT customer_id, SUM(price) AS total
FROM orders
WHERE order_date >= DATE '2024-01-01'
GROUP BY customer_id
HAVING SUM(price) >= 100000
ORDER BY total DESC;

「2024年の注文だけ抽出(WHERE)」→「顧客でグループ化」→「合計が10万円以上のグループだけ表示(HAVING)」の順で処理されます。

HAVING内で使える集約関数

関数
COUNT(*)件数
COUNT(DISTINCT col)ユニーク件数
SUM(col)合計
AVG(col)平均
MIN(col) / MAX(col)最小/最大
SUM(CASE WHEN ... THEN 1 ELSE 0 END)条件付き集計

SQL処理の順序(論理)

  1. FROM — テーブル結合
  2. WHERE — 個別行のフィルタ
  3. GROUP BY — グループ化
  4. HAVING — グループのフィルタ
  5. SELECT — カラムの選択・計算
  6. ORDER BY — 並び替え
  7. LIMIT / OFFSET — 件数制限

よくあるミス

  • WHEREで集約関数を使う: WHERE COUNT(*) > 3 はエラー。HAVINGに書く
  • GROUP BY のカラム漏れ: SELECTで集約していないカラムはGROUP BYに含める必要がある(ANSI SQL)
  • HAVINGに非集約カラム単独で書く: GROUP BYに含めるかWHEREに書くのが本来正しい

関連

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. GROUP BY句
  2. HAVING句
  3. ORDER BY句