第08课:消除外连接

外连接是查询优化中的搅屎棍,在查询优化器的实现过程中,很多时间都消耗在和外连接做斗争。我们从《第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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值