外连接
在内连接操作中,只有满足连接条件中的元组才能出现在查询结果集中,但有时我们也希望得到哪些不满足连接条件的元组的信息,比如查看全部课程的被选修情况,包括有学生的课程和没有学生选的课程。如果用内连接实现(通过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