MySQL:使用IN子句

时间:2014-02-23 23:54:48

标签: mysql

您好我在使用IN语句时遇到了一些问题。我举了一个例子来证明。

这是一个名为Person的表,其中initials是主键:

 initials      firstName     surname       age
 --------------------------------------------------
     BT          Bill        Thomson       15 
     JS          Jack         Smith        10 
     KM          Katie        Miller       2 
     KW          Keiran      Williams      18 
     LB          Lauren       Bell         6 
     LS           Lucy       Stevens       7 

所以,如果我有这样的查询:      SELECT * FROM Person WHERE firstName NOT IN('Bill'); 我按预期得到了没有Bill的所有行。

但是,如果我写:

SELECT * FROM Person WHERE firstName NOT IN(NULL);

OR

SELECT * FROM Person WHERE firstName IN (NULL);
它告诉我什么,只是一个空集。有人可以向我解释原因吗? 因为我有一个表,我需要做这样的事情,它有NULL值,这是我的问题的一部分。

4 个答案:

答案 0 :(得分:2)

使用谓词is not nullis null

SELECT * FROM Person WHERE firstName is not null; 

SELECT * FROM Person WHERE firstName is null;

如果您有其他条件,请使用or子句:

SELECT * FROM Person WHERE firstName is null or firstName in('Bill');

答案 1 :(得分:2)

来自IN()运营商的文档:

  
      
  • expr IN (value,...)

         

    ...

         

    为符合SQL标准,IN不仅返回NULL左侧的表达式为NULL,而且如果列表中未找到匹配项,则返回NULL列表中的表达式是expr NOT IN (value,...)

  •   
  • expr IN (NULL)

         

    这与NOT(expr IN(value,...))

  • 相同   

这意味着,NULL会产生FALSE。在布尔上下文中,这是expr IN (NULL)。这解释了为什么NOT(NULL)没有给你任何结果。

此外,NOT(expr IN (NULL))(如NULL中)也会在布尔上下文中产生FALSE(因此expr NOT IN (NULL)。这解释了为什么{{1}}没有给你任何结果。

答案 2 :(得分:1)

正确的语法为IS NOT NULL / IS NULL,因此请按以下方式进行更改

SELECT * FROM Person WHERE firstName IS NOT NULL;

OR

SELECT * FROM Person WHERE firstName IS NULL;

您可以阅读Documentation here

答案 3 :(得分:1)

你似乎在寻找一些直觉而不是规则。

NULL的关键方面是它并不意味着“哦,我有一个等于NULL的值”。不,这意味着:“我有一个未知的价值”。

所以,当你说:

SELECT * FROM Person WHERE firstName NOT IN (NULL);

你是说:firstName是不在包含未知值的值列表中?好吧,SQL不知道。该值未知。它可能firstname相同。它可能是different。所以,结果是NULL。请注意,当列表中包含其他非匹配值时,这将返回NULL(基本上等于false)。当匹配值在列表中时,它将返回false。

当你说:

SELECT * FROM Person WHERE firstName IN (NULL);

逻辑几乎相同。 “firstName是否包含未知值的值列表?”好吧,SQL不知道,所以结果是NULL。请注意,当列表中包含其他非匹配值时,这将返回NULL(基本上等于false)。当匹配值在列表中时,它将返回true,如:

SELECT * FROM Person WHERE firstName IN (firstname, NULL);