重要なポイント

Whereは集計前(group by)。Havingは集計後に使おう!

構文

having条件

select
 [別名].[カラム名1]
,[別名].[カラム名2]
,avg([別名].[カラム名3])
 from [テーブル名] [別名]
 group by [別名].[カラム名1]
,[別名].[カラム名2]
 having avg([別名].[カラム名3]) >= [集計条件];

<例題>

  • 学生マスタ(student_mst)からデータを取得すること。
  • 抽出条件(集計前)なし
  • カラム
    • 学科NO(gakka_no)
    • 性別(seibetu_ku)
    • テスト点数(test_su)の平均値を取得(平均点)すること
  • 集計単位
    • 学科NO(gakka_no)ごと
    • 性別(seibetu_ku)ごと
  • 集計後条件
    • テスト点数(test_su)の平均値を取得(平均点)が〈50〉以上
select
 sm.gakka_no
,sm.seibetu_ku
,avg(sm.test_su)
 from student_mst sm
 group by sm.gakka_no
,sm.seibetu_ku
 having avg(sm.test_su) >= 50;

追加集計条件

select
 [別名].[カラム名1]
,[別名].[カラム名2]
,avg([別名].[カラム名3])
 from [テーブル名] [別名]
 group by [別名].[カラム名1]
,[別名].[カラム名2]
 having avg([別名].[カラム名3]) >= [集計条件1]
 and avg([別名].[カラム名3]) < [集計条件2];

<例題>

  • 学生マスタ(student_mst)からデータを取得すること。
  • 抽出条件(集計前)なし
  • カラム
    • 学科NO(gakka_no)
    • 性別(seibetu_ku)
    • テスト点数(test_su)の平均値を取得(平均点)すること
  • 集計単位
    • 学科NO(gakka_no)ごと
    • 性別(seibetu_ku)ごと
  • 集計後条件
    • テスト点数(test_su)の平均値を取得(平均点)が〈50〉以上
    • かつテスト点数(test_su)の平均値を取得(平均点)が〈80〉未満
select
 sm.gakka_no
,sm.seibetu_ku
,avg(sm.test_su)
 from student_mst sm
 group by sm.gakka_no
,sm.seibetu_ku
 having avg(sm.test_su) >= 50
 and avg(sm.test_su) < 80;

条件と並び替え

select
 [別名].[カラム名1]
,[別名].[カラム名2]
,avg([別名].[カラム名3])
 from [テーブル名] [別名]
 where [別名].[カラム名4] >= [条件1]
 and [別名].[カラム名5] < [条件2]
 group by [別名].[カラム名1]
,[別名].[カラム名2]
 having avg([別名].[カラム名3]) >= [集計条件1]
 and avg([別名].[カラム名3]) < [集計条件2]
 order by avg([別名].[カラム名3]) desc;

<例題>

  • 学生マスタ(student_mst)からデータを取得すること。
  • 抽出条件(集計前)
    • 学科NO(gakka_no)が以上
    • かつ学科NO(gakka_no)が10未満
  • カラム
    • 学科NO(gakka_no)
    • 性別(seibetu_ku)
    • テスト点数(test_su)の平均値を取得(平均点)すること
  • 集計単位
    • 学科NO(gakka_no)ごと
    • 性別(seibetu_ku)ごと
  • 集計後条件
    • テスト点数(test_su)の平均値を取得(平均点)が〈50〉以上
    • かつテスト点数(test_su)の平均値を取得(平均点)が〈80〉未満
  • 並び順
    • テスト点数(test_su)の平均値を取得(平均点)を降順
select
 sm.gakka_no
,sm.seibetu_ku
,avg(sm.test_su)
 from student_mst sm
 where sm.gakka_no >= 2
 and sm.gakka_no < 10
 group by sm.gakka_no
,sm.seibetu_ku
 having avg(sm.test_su) >= 50
 and avg(sm.test_su) < 80
 order by avg(sm.test_su) desc;

記述の注意点

集計関数条件でも、「and」や「or」などを使用することが可能です。
また、ここまで学んできた構文の記述順番をしっかりと理解するようにしよう。
次からは、いよいよ「テーブル結合」です。ぐっと難易度があがってきますので、分からないことが無いように復習を忘れずに。