使用集函数
SELECT COUNT(*) AS Expr1 FROM student
SELECT COUNT(DISTINCT Sno) AS Expr1 FROM SC

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 查询学生总人数。

例27 查询选修了课程的学生人数。
注:前者是正确的,后者是没有加DISTINCT修饰的情况。



例28计算1号课程的学生平均成绩。

例29 查询学习1号课程的学生最高分数。

五、对查询结果分组
GROUP BY子句可以将查询结果表的各行按一列或多列值分组,值相等的为一组。
对查询结果分组的目的是为了细化集函数的作用对象。如果未对查询结果分组,集函数将作用于整个查询结果,即整个查询结果只有一个函数值。否则,集函数将作用于每一个组,即每一组都有一个函数值。
例30 查询各个课程号与相应的选课人数。

例31 查询选修了2门以上课程的学生的学号。

WHERE子句与HAVING短语的区别在于作用对象不同。WHERE子句作用于基本表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。
先用GROUP BY子句按Sno分组,再用集函数COUNT对每一组计数。HAVING短语指定选择组的条件,只有满足条件(即元组个数>3,表示此学生选修的课超过3门)的组才会被选出来。