WHERE子句为null?不明白

时间:2012-03-02 21:30:36

标签: mysql

以下查询是正确的。它返回行paulrick,因为它们具有子行的最高评级。通过以下链接为我解决了这个问题。我无法理解查询。我理解加入,我不明白的是t2.rating is null

http://sqlfiddle.com/#!2/97e60/2

select t1.* from mytable t1
    left join mytable t2
    on t1.parentid = t2.parentid and t1.rating < t2.rating
    join mytable parents
    on parents.id = t1.parentid
    where t2.rating is null AND parents.name like '%mike%'

t1.rating < t2.rating获得子行的最高评分值,我知道t2.rating is null表示t2.rating是false但我不知道它在查询中做了什么?我删除了它,并添加了其他结果。那么它究竟是为了消除不正确的结果呢?

3 个答案:

答案 0 :(得分:1)

因为您有left join(而不是join),即使来自t1的行没有匹配,您也会从t2获得行。指定t2.rating is null只表示您只会获得评分为空的t2行。

null的任何比较都是错误的,即使双方都是null。 where子句中的t2.rating is null与join子句中的t1.rating < t2.rating的组合意味着您永远不会t2获取任何行,因为这些条件永远不会同时是true

答案 1 :(得分:1)

以下是解释:

1 /当你执行LEFT JOIN时,对于左表(t1)中的每一行,你得到至少一个结果。

2 /如果通过ON子句,t1行不能匹配任何t2行,则会得到一个NULL t2行(与t2相同的列,但填充NULL值)。

3 /所以,WHERE t2.rating IS NULL实际上过滤了表t1,并且只保留那些ON子句永远不能匹配的行

4 /读取ON子句,这些过滤的行是没有其他行具有更高等级的行:如果t1行不是最高等级,则t2中的行将具有更高的等级;这一行与ON子句匹配,t2.rating不会为NULL!

5 /因此,过滤后的行与您要查找的内容完全匹配:最高评级行

我希望这能为你澄清事情!

答案 2 :(得分:0)

您无法将空值与“is null”或“is not null”之外的任何值进行比较。我认为this link最能描述它。