什么叫空值拒绝呢?请看下面用例
可以看到,外连接中,从表的表连接列,tb2.id出现了null,因为tb2中并没有id=5的情况
点击(此处)折叠或打开
- select * from tb1 left join tb2 on tb1.id=tb2.id where tb2.id>1;
- select * from tb1 inner join tb2 on tb1.id=tb2.id where tb2.id>1;
从结果上看,两者一致
按照之前对空值拒绝的理解,第一个语句的where条件中有从表tb2的选择条件,且依据这个选择条件筛选得到的最终结果集中,不存在tb2.id为null的数据行,
所以第一个语句应该是被优化器转换成了内连接;
查看第一个语句的trace,部分结果如下
可以看到外连接已经转换成了内连接
当然,这个cond-->tb2.id可以换成其他的列,比如说tb2.col1>0
如比较复杂的cond,就需要特别注意 or 的情况
当tb1.col1>0的条件为true,tb2.col1>0为false时,无法满足空值拒绝了,所以最终这个语句只能采用left join进行连接
PS:如书中描述空值拒绝的条件可以出现在where和on上面
试验:
trace信息
并没有将外连接转换为内连接,应该是条件写的并不完整,所以在前面的理解和总结中,并没有加上on,只是单独写了where
点击(此处)折叠或打开
- select tb1.id, tb2.id from tb1 left join tb2 on tb1.id=tb2.id where tb1.col1>0 or tb2.col1>0
点击(此处)折叠或打开
- select tb1.id, tb2.id from tb1 left join tb2 on tb1.id=tb2.id and tb2.col1>0;