目录:1.分组
2.分组举例
3.分组过滤
4.分组过滤举例
1.分组(SQL语言的亮点之一)
(1)定义:SQL可以将检索到的元组按照某一条件进行分类,具有相同条件值的元组划到一个组或一个集合中,同时处理多个组或集合的聚集运算
(2)语法
Select 列名 | expr | agfunc(列名) [[, 列名 | expr | agfunc(列名) ] ... ]
From 表名1, [, 表名2 ... ]
[Where 检索条件]
[Group by 分组条件];
(3)分组条件
列名1,列名2,...
2.举例
(1)求每一个学生的平均成绩
Select S#, Avg( Score )
From SC
Group by S#;
(2)求每一门课程的平均成绩
Select C#, Avg ( Score )
From SC
Group by C#;
(3)求不及格课程超过两门的同学的学号
3.分组过滤
(1)定义:在分组的基础上,将满足条件的集合(分组)留下,不满足条件的剔除
(2)Having 子句(分组过滤子句):没有 Group by 子句,就不能有 Having 子句
(3)语法格式
Select 列名 | expr | agfunc(列名) [[, 列名 | expr | agfunc(列名) ] ... ]
From 表名1, [, 表名2 ... ]
[Where 检索条件]
[Group by 分组条件 [ Having 分组过滤条件] ];
4.举例
(1)求不合格课程超过两门的同学的学号
Select S#
From SC
Where Score < 60
Group by S# Having Count(*) > 2;
(2)求有十人以上不及格的课程号
Select C#
From SC
Where Score < 60
Group by C# Having Count(*) > 10;
(3)求有两门以上不及格课程同学的学号及其平均成绩
Where Score < 60 是不对的,没有录入大于 60 分课程的成绩
正确做法:先找出有两门课程不及格的同学的学号,再对他们的课程成绩做平均值
Select S#, Avg(Score)
From SC
Where S# in ( Select S# From SC Where Score < 60 Group by S# Having Count(*) > 2 )
Group by S#;