■ はじめに
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