数据查询:连接查询

1.等值与非等值连接查询

连接查询的where子句中用来连接两个表的条件称为连接条件连接谓词

例 3.49 查询每个学生及其选修课程的情况

SELECT Student.*,SC.*  // **Student.*,SC.* 可替换为 * 
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;

在这里插入图片描述

一条SQL语句可以同时完成选择和查询。这时WHRER子句是由连接谓词选择谓词组成的复合条件

例 3.51查询选修2号课程且成绩在90分以上的所有学生的学号和姓名

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中满足连接条件的元组进行连接得到最终的结果关系

2.自身连接

连接操作不仅可以在两个表之间进行,也可以是一个表与自己进行连接,称为表的自身连接

例 3.52 查询每一门课的间接先修课(即先修课的先修课)

为Course表取两个别名,一个是First,另一个是SECOND

FIRST表(Course表)
在这里插入图片描述
SECOND表(Course表)
在这里插入图片描述

SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno=SECOND.Cno;

在这里插入图片描述

3.外连接

在通常的连接操作中,只有满足连接条件的元组才能作为结果输出。如例3.49的结果表中没有201215123和201215125两个学生的信息,原因在于他们没有选课,在SC表中没有相应的元组,导致 Student中这些元组在连接时被舍弃了。

有时想以 Student表为主体列出每个学生的基本情况及其选课情况。若某个学生没有选课,仍把 Student的悬浮元组保存在结果关系中,而在SC表的属性上填空值NULL,这时就需要使用外连接。

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON(Student.Sno=SC.Sno);

在这里插入图片描述
使用USING来去掉结果中的重复值

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC USING(Sno);

4.多表连接

连接操作除了可以是两表连接、一个表与其自身连接外,还可以是两个以上的表进行连接,后者通常称为多表连接

例 3.54 查询每个学生的学号、姓名、选修的课程名及成绩

SELECT Student.Sno,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;

在这里插入图片描述

SELECT *
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;

在这里插入图片描述

关系数据库管理系统在执行多表连接时,通常是先进行两个表的连接操作,再将其连接结果与第三个表进行连接。本例的一种可能的执行方式是,先将 Student表与SC表进行连接,得到每个学生的学号、姓名、所选课程号和相应的成绩,然后再将其与 Course表进行连接,得到最终结果。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值