35

这是我关于 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

4 回答 4

46

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

SELECT table1.*, table2.*
FROM table1
LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.surname IS NULL
于 2012-07-16T07:54:43.733 回答
13

您必须使用IS NULL而不是= NULL

WHERE table2.surname IS NULL

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

"is unknown""equals unknown"之间有明显的区别。您当然可以测试某事物是否未知或未知,但您无法测试某事物是否“等于”未知,因为 unknown 是unknown,而且它没有意义。

此外,由于您使用的是 MySQL,因此另一个选项是使用table2.surname <=> NULL,其中<=>是 MySQL 特定的 NULL 安全比较运算符,但尽量不要使用它并坚持使用标准 SQL 方式(IS NULL/ IS NOT NULL

于 2012-07-16T07:54:57.407 回答
4

尝试:

SELECT table1.*,table2.* 
FROM table1 
  LEFT JOIN table2 ON table1.id=table2.id 
WHERE table2.surname IS NULL
于 2012-07-16T07:54:50.417 回答
1

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

于 2013-03-05T03:08:19.500 回答