数据库实验【6】 | 连接查询

本文介绍了如何使用SQL进行多表查询,包括通过公共属性实现的内连接、自然连接以及外连接。示例展示了查询学生选课情况、查找课程的间接先修课以及优化查询性能的方法。还探讨了外连接的应用,展示如何获取未匹配项的NULL值。同时,提到了在查询中如何避免重复元素并选择合适的连接类型以提高查询效率。
摘要由CSDN通过智能技术生成

[例3.49]查询每个学生及其选修课程的情况
学生信息存储在Student表中,学生选课情况存放在SC表中,所以本査询实际上涉及Student与SC两个表。这两个表之间的联系是通过公共属性Sno实现的。

select *
from Student,SC
where Student.Sno = SC.Sno;

在这里插入图片描述
[例3.50] 对[例3.49]用自然连接完成
去除表中的重复元素

select Student.Sno , Sname , Ssex , Sage , Sdept , Cno , Grade 
from Student , SC 
where Student.SNo = SC.Sno;

在这里插入图片描述
当属性列在查询的所有表里面是唯一的就可以省略表名前缀,否则必须加上表名前缀。
本例中,由于 Sname, Ssex, Sage, Sdept,Cno 和 Grade 属性列在 Student 表与 SC 表中是唯一的,因此引用时可以去掉表名前缀;而Sno在两个表都出现了,因此引用时须加上表名前綴。

[例3.51] 査询选修2号课程且成绩在80分(包含80分)以上的所有学生的学号和姓名

select Student.Sno , Sname 
from Student , SC 
where Student.Sno = SC.Sno AND SC.Cno ='2' AND SC.Grade >=80;

在这里插入图片描述
该査询的一种优化(高效)的执行过程是,先从SC中挑选出Cno=2并且Grade>=90的元组形成一个中间关系,再和Student中满足连接条件的元组进行连接得到最终的结果关系。
优化查询语句代码如下:

select Student.Sno , Sname 
	from Student 
	where Student.Sno = 
		(
			select SC.Sno from SC 
			where SC.Cno = '2'
			AND SC.Grade >= 90
		);

[例3.52] 査询每一门课的间接先修课(即先修课的先修课).
在Course表中只有每门课的直接先修课信息,而没有先修课的先修课。要得到这个信息,必须先对一门课找到其先修课,再按此先修课的课程号査找它的先修课程。这就要将Course表与其自身连接

select First.Cno,Second.Cpno
from Course First,Course Second
where First.Cpno=Second.Cno;

在这里插入图片描述

[例 3.53] 在我们常用的连接操作中,满足条件的元组才可以作为结果进行输出,不满足条件的就会被舍弃。如果我们想让元组不被舍弃,并且输出为NULL值。我们就要用到外连接
接下来对例【3.49】修改,输出被舍弃的和没被舍弃的结果:

select Student.Sno , Sname , Ssex , Sage , Sdept , Cno , Grade 
	from Student left outer join SC 
	on(Student.Sno = SC.Sno);

在这里插入图片描述
[例3.54] 査询每个学生的学号、姓名、选修的课程名及成绩

	select Student.Sno,Sname,SC.Cno,Grade
	from Student,SC,Course
	where Student.Sno=SC.Sno AND SC.Cno=Course.Cno;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值