使用集函数
SELECT
COUNT
(
*
)
AS
Expr1
FROM
student
SELECT
COUNT
(
DISTINCT
Sno)
AS
Expr1
FROM
SC
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
SELECT
COUNT
(Sno)
AS
Expr1
FROM
SC
SELECT
AVG
(Grade)
FROM
SC
WHERE
Sno
=
'
1
'
SELECT
MAX
(Grade)
FROM
SC
WHERE
Sno
=
'
1
'
SELECT
Cno,
Count
(Sno)
AS
Expr1
FROM
SC
GROUP
BY
Cno
SELECT
Sno
FROM
SC
GROUP
BY
Sno
HAVING
(
COUNT
(
*
)
>
2
)
SQL提供了许多集函数,主要包括:
例26 查询学生总人数。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
例27 查询选修了课程的学生人数。
注:前者是正确的,后者是没有加DISTINCT修饰的情况。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
例28计算1号课程的学生平均成绩。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
例29 查询学习1号课程的学生最高分数。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
五、对查询结果分组
GROUP BY子句可以将查询结果表的各行按一列或多列值分组,值相等的为一组。
对查询结果分组的目的是为了细化集函数的作用对象。如果未对查询结果分组,集函数将作用于整个查询结果,即整个查询结果只有一个函数值。否则,集函数将作用于每一个组,即每一组都有一个函数值。
例30 查询各个课程号与相应的选课人数。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
例31 查询选修了2门以上课程的学生的学号。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
WHERE子句与HAVING短语的区别在于作用对象不同。WHERE子句作用于基本表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。
先用 GROUP BY 子句按 Sno 分组,再用集函数 COUNT 对每一组计数。 HAVING 短语指定选择组的条件,只有满足条件(即元组个数 >3 ,表示此学生选修的课超过 3 门)的组才会被选出来。