本文共 743 字,大约阅读时间需要 2 分钟。
外连接是查询优化中的搅屎棍,在查询优化器的实现过程中,很多时间都消耗在和外连接做斗争。我们从《第4课:谓词下推》和《第5课:连接顺序交换规则》可以看出,外连接的出现对提高优化器的实现难度“功不可没”。例如,对约束条件进行下推(谓词下推)时,如果连接操作是外连接,那么有些约束条件下推就可能会受到阻碍。在连接顺序交换时,内连接的表之间的连接顺序交换比较灵活,而外连接不能随意地交换连接表的顺序。因此,如果能将外连接转换成内连接,查询优化的过程就会大大地简化。
在介绍怎样才能消除一个外连接之前,让我们先来看一下内连接和外连接的区别。例如,两个表 STUDENT 和 SCORE 的数据如下,其中有一个学生 lisi 没有成绩。
postgres=# SELECT * FROM STUDENT; sno | sname | ssex-----+----------+------ 1 | zhangsan | 1 2 | lisi | 1(2 rows)postgres=# SELECT * FROM SCORE; sno | cno | degree-----+-----+-------- 1 | 1 | 36(1 row)
如果要查询学生的姓名和成绩,可以对 STUDENT 和 SCORE 做连接。从查询结果可以看出,内连接只显示了有成绩的学生,而外连接则对没有成绩的学生补了 NULL 值,也就是说这个外连接是不能转换成内连接的。
postgres=# SELECT * FROM STUDENT LEFT JOIN SCORE ON STUDENT.sn
转载地址:http://uoyni.baihongyu.com/