前面介绍了多表内连接。下面将介绍多表外连接。使用内连接的时候,会发现一个问题,他会过滤掉不匹配的行。比如可能存在折中情况,有两张表。一张是学生信息表,包括学号,姓名等信息,另一张表是考试成绩表。当需要显示所有学生的考试信息时,如果其中某个学生并没有参加考试,那么内连接就不会显示出该学生的信息。但事实上可能我们需要纪录所有的学生情况,即使没参加考试,那么该学生也应该被显示并纪录下来。所以我们可以使用外连接,外连接可以显示出所有匹配和不匹配的记录,比如使用左外连接,那么就会显示出所有左表的记录,如果右表没有与之对应的行,那么右表在显示该行的记录时为空。还有右外连接,与左外连接相反。全外连接就是显示左右两张表中所有匹配与不匹配的记录。接下来是通过相关练习来进行学习:
相关练习的数据库请参看:http://www.sqlzoo.cn/4.htm
练习题地址:http://www.sqlzoo.cn/4.htm
数据库和练习题在一个页面上。
练习题答案及分析:
1a. 一个议员被开除出党,看看他是谁.
SELECT name FROM msp WHERE party IS NULL
这里用到了判断非空的条件。NULL是不能用=来判断的,因为NULL值不参与任何计算和比较,所以需要使用专门的语句IS NULL 或IS NOT NULL
1b. 列出所有政党和领导者.
SELECT name, leader FROM party
1c. 列出所有有领导者的政党.
SELECT name, leader FROM party
WHERE leader IS NOT NULL
1d. 列出至少有一个议员的政党.
SELECT DISTINCT party.name FROM msp, party
WHERE party=code
下面是外连接相关的练习
2a. 列出所有议员的名字和他所属政党的名称(如果有的话). 确保议员Canavan MSP, Dennis不被漏掉.
SELECT msp.name, party.name
FROM msp LEFT JOIN party ON party=code
ORDER BY msp.name
可以看到和内连接的语法差不多,只是在连接表上加上LEFT关键字,这个表示左外连接。左表是MSP,右表是PARTY
2b. 列出包含议员的政党,包含每个政党的议员人数.
SELECT party.name, COUNT(msp.name)
FROM msp, party
WHERE msp.party=party.code
GROUP BY party.name
这道题并没有使用外连接,而是使用的内连接
2c. 列出所有政党和每个政党议员人数.包含那些没有议员的政党.
SELECT party.name, COUNT(msp.name)
FROM party LEFT JOIN msp ON party.code=msp.party
GROUP BY party.name