这是我关于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
我可以在某种程度上理解它背后的逻辑并没有给我任何结果,但必须有一种方法来获取结果吗?
感谢任何帮助。
答案 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
而不是预期的布尔值0
或1
,这正是您的查询返回空结果的原因。
“未知”和“等于未知”之间存在明显差异。您肯定可以测试某些 未知或 未知的内容,但您无法测试某些内容 “等于” 强>未知因为未知是未知,而且没有意义。
此外,由于您使用的是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。