【问题标题】:MYSQL Left Join how do I select NULL values?MYSQL Left Join 如何选择 NULL 值?
【发布时间】: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

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

感谢任何帮助。

【问题讨论】:

    标签: mysql sql join


    【解决方案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。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-17
          相关资源
          最近更新 更多