《数据库查询优化器的艺术》答疑---外连接优化的解释

来源:互联网 发布:openwrt golang 编辑:程序博客网 时间:2024/05/18 01:55

我最近购买了您的《数据库查询优化艺术》一书,内容很丰富,但几个问题想请教下:
  该书的第35页,关于空值拒绝分为两种情况:
  第一种,我理解为是where后面的关于右表的过滤条件。
  第二种,说是外连接的提供空值的一侧(可能是左侧的外表也可能是右侧的内表)为另一侧的每行只返回一行。如果该每件为真,则不存在提供空值的行,并且外连接等价于内连接。关于这一条有两个问题想请教下:
1. 可能是左侧的外表也可能是右侧的内表,这是指left join或者right join吗,如果是这样,但是我看书上写,基本是把right join改成了left join.如果不是这个意思,那这是指什么呢?
2. 这个第二种空值拒绝的情况是指on条件里的吗(我看本书的305页,mysql说是on条件),那这样是指on后面的什么样的条件呢,是指后面提到的两个表的join key是主外键关联的情况吗,可以举例说明一下吗?另外,这里的提供空值的一侧为另一侧的每行只返回一行,是什么意思?如果是主外键关系的话,那外键本身不是除了引用另一侧主键的值之外,也可以有null,如果这样的话,换成inner join,不是也会丢失一行关于外表的nul的行吗。
期待您的回复,谢谢!

答复朋友:
1 感谢支持
2 首先,空值拒绝,是适用于外连接.
3 所谓内表/外表和左表/右表,是相对的. 如
3.1 select * form t1 left join t2; t2是内表/右表
3.2 select * form t1 right join t2; t1是内表/右表
4 “把right join改成了left join”是工程实现的一种方式。左外连接可以变为右外连接,右外连接也可以变为左外连接; 但如果把右外连接变为左外连接,则对于左外和右外连接的处理代码就简洁的保持一致了,不用重复再写一遍。
5 书中的个第二种空值拒绝的情况其实是第一种的一个特例。
6 “这个第二种空值拒绝的情况是指on条件里的吗”
---不是。书中305页有个带有背景色的为“where t2.b<5”. 务必注意,“条件”可以出现在join-on的on字句,也可以出现在where子句中。
7 理解了以上这些,可能便于您理解外连接的优化了。

0 0
原创粉丝点击