数据库作业6:GROUP BY语句、连接查询
本文可分为以下几个部分
一、GROUP BY子句
WHERE子句与HAVING短语的区别在于作用对象不同。WHERE子句作用于基本表或试图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。
[例3.48]查询平均成绩大于等于90分的学生学号和平均成绩。
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;
因为表中平均分均低于90分,为实验测试,将数据平均分90改为87;
测试成功!
为区别WHERE和HAVING语句,现将HAVING语句改为WHERE语句。
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=87
GROUP BY Sno;
SELECT * FROM SC;
WHERE子句不能作用在组,“聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。”
二、连接查询
-
若一个查询同时涉及两个以上的表,则称之为连接查询。
-
连接查询包括等值连接查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询和复合条件连接查询。
1、等值与非等值连接查询
连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词,其一般格式为:

[<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2>
此外连接谓词还可以使用下面形式:
[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>
- 当连接运算符为=时,称为等值连接。使用其他运算符称为非等值连接。
[例3.49]查询每个学生及其选修课程的情况。
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno;--将Student与SC中同一学生的元组连接起来
SELECT * FROM Student;
SELECT * FROM SC;
等值连接实现后,思考应该如何实现笛卡尔积??
- 尝试删除WHERE条件语句:
SELECT Student.*,SC.*
FROM Student,SC
--WHERE Student.Sno=SC.Sno;--将Student与SC中同一学生的元组连接起来
SELECT * FROM Student;
SELECT * FROM SC;
[例3.50]对例3.49用自然连接完成。
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno
SELECT * FROM Student;
SELECT * FROM SC;
本例中,由于Sname,Ssex,Sage,Sdept,Cno和Grade属性列在Student表与SC表中是唯一的,因此引用时可以去掉表名前缀:而Sno在两个表都出现了,因此引用时必须加上表名前缀。
- 此处如果使用*效果同样:
[例3.51]查询选修2号课程且成绩在90分以上的所有学生的学号和姓名。
因选修2号课程的学生成绩都没有在90分以上,因此更改数据为86;
SELECT Student.Sno,Sname
FROM Student,SC
WHERE Student.Sno=SC.Sno AND
SC.Cno='2' AND SC.Grade>86;
SELECT * FROM SC;
SELECT * FROM Student;
- 去掉AND后结果如下:
2、自身连接
- 连接操作不仅可以在两个表中进行,也可以是一个表与其自己进行连接,称为表的自身连接。
[例3.52]查询每一门课的间接先修课(即先修课的先修课)
为此,要为Course表取两个别名,一个是FIRST,另一个是SECOND。
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno=SECOND.Cno;
SELECT * FROM Course;
TSQL中,会显示NULL值;
3、外连接
[例3.53]
- 左外连接
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno);
- 右外连接
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student RIGHT OUTER JOIN SC ON (Student.Sno=SC.Sno);
4、多表连接
- 连接操作除了可以是两表连接、一个表与其自身连接外,还可以是两个以上的表进行连接,后者通常称为多表连接。
[例3.54]查询每个学生的学号、姓名、选修的课程名及成绩。
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;
此处尝试改为:*
- 关系数据库管理系统在执行多表连接时,通常是先进行两个表的连接操作,再将其连接结果与第三个表进行连接。
至此,本次实验中所有实验内容均已完成!!
- 在等值连接中,若去掉WHERE条件判断,查询结果为笛卡尔积;
- 在例3.52中TSQL和标准SQL查询结果并不相同,TSQL会包含NULL值;
- 多表连接可以看作将表两两相连后再次两两相连,例如三表相连时就是将两表连接后的结果再与第三个表相连;
- 在查询时候可以加上"SELECT * FROM <表名1>"来查看原表,方便判断查询操作是否成功!
以上为本次实验全部内容,感谢阅读^ ^