介绍多表查询等复杂SQL语句。
关系数据库的查询结果都是一个结果表(也是关系)
集聚函数
基本语法
- 统计元组个数
- COUNT(*)
- 统计一列中值的个数
- COUNT([DISTINCT|ALL]<列名>)
- 计算一列值的总和(此列必须为数值型)
- SUM([DISTINCT|ALL]<列名>)
- 计算一列值的平均值(此列必须为数值型)
- AVG([DISTINCT|ALL]<列名>)
- 求一列中的最大值和最小值
- MAX([DISTINCT|ALL]<列名>)
- MIN([DISTINCT|ALL]<列名>)
例子
-
查询选修1号课程的学生最高分数
-
SELECTMAX(Grade) FROM SC WHERE Cno='1';
-
-
查询学生201215012选修课程的总学分数
-
SELECT SUM(Ccredit) FROM SC,Course WHERE Sno='201215012' AND SC.Cno=Course.Cno;
-
GROUP BY 子句
细化聚集函数的作用对象
- 如果未对查询结果分组,聚集函数将作用于整个查询结果
- 对查询结果分组后,聚集函数将分别作用于每个组
- 按指定的一列或多列值分组,值相等的为一组
HAVING
短语与WHERE
子句的区别:
- 作用对象不同
WHERE
子句作用于基表或视图,从中选择满足条件的元组HAVING
短语作用于组,从中选择满足条件的组WHERE
子句不能使用聚合函数!
例子
-
求各个课程号及相应的选课人数
SELECT Cno, COUNT(Sno) FROM SC GROUP BY Cno;
-
查询选修了3门以上课程的学生学号
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) >3;
-
查询平均成绩大于等于90分的学生学号和平均成绩
SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade)>=90;
这里只能使用
HAVING
,不能使用WHERE
。
ORDER BY子句
- 可以按一个或多个属性列排序
- 优先级逐渐降低
- 升序:ASC;
- 降序:DESC;
- 缺省值为升序
- 对于空值,排序时显示的次序由具体系统实现来决定
例子
-
查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列
SELECT Sno, Grade FROM SC WHERE Cno= ' 3 ' ORDER BY Grade DESC;
-
查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列
SELECT * FROM Student ORDER BY Sdept, Sage DESC;
连接查询
-
连接查询:同时涉及两个以上的表的查询
-
连接条件或连接谓词:用来连接两个表的条件