多表连接查询笔记之二 -- 外连接

本文介绍了数据库查询中的外连接概念,包括左外连接和右外连接,并提供了多个查询示例,如查询所有学生的选课情况、无人选修的课程、计算机系未选课的学生等,阐述了外连接在多表查询中的应用及其与内连接的区别。

外连接
在内连接操作中,只有满足连接条件中的元组才能出现在查询结果集中,但有时我们也希望得到哪些不满足连接条件的元组的信息,比如查看全部课程的被选修情况,包括有学生的课程和没有学生选的课程。如果用内连接实现(通过SC表和Course表的内连接),则只能找到有学生选课的课程,因为内连接的结果首先是要满足连接条件sc.cno = course.cno,因此查询不出来。这样就需要使用外连接来实现。

 

外连接是只限制一张表中的数据必须满足连接条件,而另一种表中的数据可以不满足连接条件。


分类:外连接分为左外连接和右外连接两种。
语法:ANSI方式的外连接语法格式为:from 表1 left|right [outer] join 表2  on <连接条件>
       左外连接:left[outer] join 称为左外连接,含义是限制表2中的数据必须满足连接条件,但不管表1中的数据是否满足连接条件,均输出表1中的数据。
     右外连接:right[outer] join 称为右外连接。含义是限制表1中的数据必须满足连接条件,而不管表 2中的数据是否满足连接条件,均输出表2中的数据。


外连接例子:
1)查询全体学生的选课情况,包括选修了课程的学生和没有选修课程的学生,列出学号,姓名,课程号,成绩
SELECT student.`sno`,sname,cno,grade FROM student LEFT[OUTER] JOIN sc ON student.`sno` = sc.`sno`;(左外连接)
SELECT student.`sno`,sname,cno,grade FROM student RIGHT[OUTER] JOIN sc ON student.`sno` = sc.`sno`(右外连接)
在多表查询的时候最好把具体的表名加到字段的前面  格式为表名.列明  否则容易出现错误

不加表名的出现以下错误
SELECT sno,sname,cno,grade FROM student LEFT JOIN sc ON student.`sno` = sc.`sno`;
Column 'sno' in field list is ambiguous(模棱两可的)

2)查询没有人选的课程的课程名
select cname form coures c left join sc on c.cno = sc.cno where sc.cno is null

3)查询计算机系没选课的学生,列出姓名和性别信息
select sname,sex from student s left join sc on s.sno = sc.sno where dept = '计算机系' and sc.sno is null

4)统计计算机系每个学生的选课门数,包括没选课的学生。
select s.sno as 学号,count(sc.cno) as 选课门数 from student s left join sc on s.sno = sc.sno where dept='计算机系'
group by s.sno

5)查询信息管理系选课门数少于3门的学生的学号和选课门数,包括没选课的学生查询结果按选课门数升序排序。
select s.sno as 学号,count(sc.cno) as 选课门数 from student s left join sc on s.sno = sc.sno
where dept = '信息管理系' group by s.sno having count(sc.cno) < 3 order by count(sc.cno) ASC

内连接和外连接的主要区别

 

如果表A与表B进行内连接,结果为两个表中满足连接条件的记录集,也就是图中的记录集C部分。
如果表A与表B进行左外连接,则连接后的结果集为记录集A + 记录集C
如果表A与表B进行右外连接,则连接后的结果集为记录集B + 记录集C


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值