数据库作业6:GROUP BY子句、连接查询

数据库作业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;

在这里插入图片描述
此处尝试改为*
在这里插入图片描述

  • 关系数据库管理系统在执行多表连接时,通常是先进行两个表的连接操作,再将其连接结果与第三个表进行连接。

至此,本次实验中所有实验内容均已完成!!

  1. 在等值连接中,若去掉WHERE条件判断,查询结果为笛卡尔积;
  2. 在例3.52中TSQL和标准SQL查询结果并不相同,TSQL会包含NULL值;
  3. 多表连接可以看作将表两两相连后再次两两相连,例如三表相连时就是将两表连接后的结果再与第三个表相连;
  4. 在查询时候可以加上"SELECT * FROM <表名1>"来查看原表,方便判断查询操作是否成功!

以上为本次实验全部内容,感谢阅读^ ^

猜你喜欢

转载自blog.csdn.net/qq_51776413/article/details/115438499
今日推荐