【SQL】HAVING句

■ はじめに

SQL の HAVING句 について扱う

目次

【1】HAVING句
【2】サンプル
【3】使用上の注意
 1)パフォーマンスについて
 2)WHERE/GROUP BY/HAVINGの処理順に注意

【1】HAVING句

* WHERE句では 集計関数を用いることができないため、代わりに HAVING句を使う
 => グループ分けしたレコードから、
  さらに特定の条件に合致したレコードを引き出す際に使用

【2】サンプル

使い方イメージ

SELECT
  Sum(売上.売上額) AS 総売上額
  , 商品.商品名 
FROM
  商品, 売上 
GROUP BY
  商品.商品ID 
HAVING
  SUM(売上.売上額) >= 6000000; 

【3】使用上の注意

1)パフォーマンスについて

 * パフォーマンスがよろしくないので、極力、WHERE文に任せる
  => 詳細は、以下の記事の「HAVINGの使用は、極力避ける」を参照のこと

https://dk521123.hatenablog.com/entry/2012/05/05/003504

2)WHERE/GROUP BY/HAVINGの処理順に注意

 * HAVING句には集約後にしか判定できない条件を記述するようにする

【4】詳細

 * DBは、WHERE/GROUP BY/HAVINGを以下の順序で処理する

1)処理順序

 [1] WHEREの条件に合致した行を抽出する
 <= ここで出来る限りデータ行を少なくした方がいい
 [2] GROUP BYに従いグループ分けして集約する
 [3] HAVINGの条件に合致した集約行を抽出する
  => WHEREには集約前に判定できる条件を全て記述し、
   HAVINGには集約後にしか判定できない条件
  (下記のような平均点??以上とか)を記述する

例:合格者で平均90点以上の受験者

SELECT
  c.ID, c.Name, e.Score
FROM
  Candidate c
INNER JOIN
  Exam e
ON
  c.ID = e.candidateID
WHERE
  c.Grade = 'Pass'
GROUP BY
  e.ID
HAVING
  avg(e.Score) > 90
;

参考文献

http://itpro.nikkeibp.co.jp/article/lecture/20061211/256508/?ST=selfup&P=2

関連記事

GROUP BY句
https://dk521123.hatenablog.com/entry/2010/07/17/052306
パフォーマンスの良いSQLを記述 ~検索条件編~
https://dk521123.hatenablog.com/entry/2012/05/05/003504