2012-07-16 80 views
32

这是我最后一个关于MySQL中表连接问题的后续问题。我需要能够从左连接表中选择NULL值。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 

我希望选择WHERE table2.surname = NULL,但这样行不通的查询

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

我可以有所了解它背后的逻辑不给我任何结果,但必须有办法抓住他们的结果?

感谢所有帮助

回答

39

比较NULL值,您必须使用IS NULL断言,这样的:

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

与问题没有直接关系,但是您必须使用'WHERE'子句,而不是连接中的'AND'子句来获取有意义的值。这让我沮丧。 – HartleySan 2018-02-18 19:56:29

4

尝试:

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

你必须使用IS NULL代替= NULL

WHERE table2.surname IS NULL 

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

“未知”“等于未知”有明显区别。你一定能测试某未知或未知的,但如果事情“等于”你不能测试未知的,因为未知的未知,一下子就没有意义。另外,由于您使用的是MySQL,所以另一种选择是使用table2.surname <=> NULL,其中<=>是一个MySQL专用的NULL安全比较运算符,但尽量不要使用它,只是坚持使用标准SQL方式(IS NULL/IS NOT NULL

1

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