#10. 搜索一个“NULL”值
<ol class="dp-sql"><li class="alt"><span><span class="keyword"><strong><font color="#006699">SELECT</font></strong></span><span> * </span></span></li><li><span class="keyword"><strong><font color="#006699">FROM</font></strong></span><span> a </span></li><li class="alt"><span class="keyword"><strong><font color="#006699">WHERE</font></strong></span><span> a.</span><span class="keyword"><strong><font color="#006699">column</font></strong></span><span> = </span><span class="op"><font color="#808080">NULL</font></span><span> </span></li></ol>
在SQL中,NULL什么也不等于,而且NULL也不等于NULL。这个查询不会返回任何结果的,实际上,当构建那个plan的时候,优化器会把这样的语句优化掉。
当搜索NULL值的时候,应该使用这样的查询:
<ol class="dp-sql"><li class="alt"><span><span class="keyword"><strong><font color="#006699">SELECT</font></strong></span><span> * </span></span></li><li><span class="keyword"><strong><font color="#006699">FROM</font></strong></span><span> a </span></li><li class="alt"><span class="keyword"><strong><font color="#006699">WHERE</font></strong></span><span> a.</span><span class="keyword"><strong><font color="#006699">column</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">IS</font></strong></span><span> </span><span class="op"><font color="#808080">NULL</font></span><span> </span></li></ol>
#9. 使用附加条件的LEFT JOIN
<ol class="dp-sql"><li class="alt"><span><span class="keyword"><strong><font color="#006699">SELECT</font></strong></span><span> * </span></span></li><li><span class="keyword"><strong><font color="#006699">FROM</font></strong></span><span> a </span></li><li class="alt"><span class="func"><font color="#ff1493">LEFT</font></span><span> </span><span class="op"><font color="#808080">JOIN</font></span><span> </span></li><li><span> b </span></li><li class="alt"><span class="keyword"><strong><font color="#006699">ON</font></strong></span><span> b.a = a.id </span></li><li><span class="keyword"><strong><font color="#006699">WHERE</font></strong></span><span> b.</span><span class="keyword"><strong><font color="#006699">column</font></strong></span><span> = </span><span class="string"><font color="#0000ff">'something'</font></span><span> </span></li></ol>
除了从a返回每个记录(至少一次),当没有真正匹配的记录的时候,用NULL值代替缺失的字段之外,LEFT JOIN和INNER JOIN都是一样的。
但是,在LEFT JOIN之后才会检查WHERE条件,所以,上面这个查询在连接之后才会检查column。就像我们刚才了解到的那样,非NULL值才可以满足相等条件,所以,在a的记录中,那些在b中没有对应的条目的记录不可避免地要被过滤掉。
从本质上来说,这个查询是一个INNER JOIN,只是效率要低一些。
为了真正地匹配满足b.column = ‘something’条件的记录(这时要返回a中的全部记录,也就是说,不过滤掉那些在b中没有对应的条目的记录),这个条件应该放在ON子句中:
<ol class="dp-sql"><li class="alt"><span><span class="keyword"><strong><font color="#006699">SELECT</font></strong></span><span> <a>本文来源gao($daima.com搞@代@#码8网^</a> * </span></span></li><li><span class="keyword"><strong><font color="#006699">FROM</font></strong></span><span> a </span></li><li class="alt"><span class="func"><font color="#ff1493">LEFT</font></span><span> </span><span class="op"><font color="#808080">JOIN</font></span><span> </span></li><li><span> b </span></li><li class="alt"><span class="keyword"><strong><font color="#006699">ON</font></strong></span><span> b.a = a.id </span></li><li><span> </span><span class="op"><font color="#808080">AND</font></span><span> b.</span><span class="keyword"><strong><font color="#006699">column</font></strong></span><span> = </span><span class="string"><font color="#0000ff">'something'</font></span><span> </span></li></ol>