MYSQL Left Join 如何选择 NULL 值?

Posted

技术标签:

【中文标题】MYSQL Left Join 如何选择 NULL 值?【英文标题】:MYSQL Left Join how do I select NULL values? 【发布时间】:2012-07-15 01:19:33 【问题描述】:

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

我可以理解它背后的逻辑没有给我任何结果,但必须有一种方法来获取它们的结果?

感谢任何帮助。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

与问题没有直接关系,但您必须使用WHERE 子句,而不是连接中的AND 子句,才能取回有意义的值。那让我绊倒了。【参考方案2】:

尝试:

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

【讨论】:

【参考方案3】:

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

WHERE table2.surname IS NULL

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

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于MYSQL Left Join 如何选择 NULL 值?的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL LEFT JOIN 将所有数据返回为 NULL

在 MYSQL 中执行 LEFT OUTER JOIN 时插入零而不是 NULL

带有 LEFT JOIN 和 GROUP BY 的 COUNT(*) 在 MySQL 中包含 NULL

嵌套 CONCAT 中的 LEFT JOIN 和 IS NULL 仅返回 NULL

MYSQL多表查询问题,left join的使用问题求教

Mysql 多表关联查询 Left join 查询?