MYSQL Left Join如何选择NULL值?

时间:2012-07-16 07:53:15

标签: mysql sql join

这是我关于MySQL中表联接的上一个问题的后续问题

我需要能够从左连接表中选择NULL值。

这是我的加入:

table1.id | table1.name | table2.id | table2.surname
        1 |        John |         1 |            Doe
        2 |     Michael |         2 |       Anderson
        3 |        Anna |      NULL |           NULL
        4 |         Sue |      NULL |           NULL

我想要select WHERE table2.surname = NULL,但像这样的查询不起作用:

SELECT table1.*,table2.*
FROM table1
LEFT JOIN table2
    ON table1.id=table2.id
WHERE table2.surname=NULL

我可以在某种程度上理解它背后的逻辑并没有给我任何结果,但必须有一种方法来获取结果吗?

感谢任何帮助。

4 个答案:

答案 0 :(得分:42)

要比较NULL值,您必须使用IS NULL谓词,如下所示:

SELECT table1.*, table2.*
FROM table1
LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.surname IS NULL

答案 1 :(得分:13)

您必须使用IS NULL代替= NULL

WHERE table2.surname IS NULL

您不能简单地执行= NULL的原因是因为NULL基本上是“未知”且不能 相等 不等于 任何东西(甚至不是它自己),所以试图将它与某些东西进行比较就好像它应该是完全匹配一样只会返回NULL而不是预期的布尔值01,这正是您的查询返回空结果的原因。

“未知”“等于未知”之间存在明显差异。您肯定可以测试某些 未知或 未知的内容,但您无法测试某些内容 “等于” 未知因为未知是未知,而且没有意义。

此外,由于您使用的是MySQL,另一种选择是使用table2.surname <=> NULL,其中<=>是特定于MySQL的NULL-Safe比较运算符,但尽量不要使用它而只是坚持使用使用标准SQL方式(IS NULL / IS NOT NULL

答案 2 :(得分:4)

尝试:

SELECT table1.*,table2.* 
FROM table1 
  LEFT JOIN table2 ON table1.id=table2.id 
WHERE table2.surname IS NULL

答案 3 :(得分:1)

根据MySQL specification,您应该使用“IS NULL”而不是“= NULL”。 它说“(NULL = NULL)等于NULL”。但是当NULL用作布尔值时,NULL等于False。