关于sql:查询/子查询什么时候返回NULL,什么时候根本没有值?

When does a query/subquery return a NULL and when no value at all?

  • 如果查询/子查询找不到任何匹配的行,则它要么返回NULL要么根本没有值,因此甚至没有NULL值。基于
    查询/子查询返回什么标准,什么时候不返回任何结果,甚至不返回NULL值?

  • 标量子查询始终返回NULL,如果没有
    找到匹配的行?我假设最外面的标量查询也返回
    如果找不到行,则为NULL?

  • 1
    2
    3
    SELECT FirstName, LastName, YEAR(BirthDate)
    FROM Persons
    WHERE YEAR(BirthDate) IN (SELECT YearReleased FROM Albums);
    • 如果子查询没有找到结果,则是外部的WHERE子句
      查询翻译成WHERE YEAR(BirthDate) IN (null);

    • 如果将WHERE子句转换为WHERE YEAR(BirthDate) IN();,那不应该是一个错误条件,因为如何将YEAR(BirthDate)值与没有值进行比较?


  • 仅当YearReleasedNULL时子查询才返回NULL,否则将有一个空的记录集,使其成为您提到的IN ()情况。

    区分两者的含义非常重要,因为它们的含义完全不同。 NULL表示有某些内容需要SELECT,尽管该值表示可以说是"缺乏价值"。空的记录集表示没有选择符合指定条件的任何内容。

    编辑:已更新以显示示例结果

    alt

    前两个查询只是为了显示两个表中的内容。如果将子查询替换为NULL,则第三个查询是您的查询,第四个查询仅显示它产生等效的结果(无行)。最后一个查询只是为了表明子查询本身仅返回NULL s的大列表。


    1
    2
    3
    4
    SELECT FirstName, LastName, YEAR(BirthDate)
    FROM Persons a
    LEFT JOIN (SELECT YearReleased FROM Albums) b ON YEAR(b.YearReleased) = YEAR(a.BirthDate)
    WHERE YEAR(b.YearReleased) = YEAR(a.BirthDate)


    a。如果没有匹配的行,则结果集将始终为空。 NULL值没有任何特殊处理。

    b。这不是真的。如果没有匹配的行,那么根据定义,结果集始终为空。标量函数的结果不是结果集,因此它将为NULL或另一个值。

    c.1。如果子查询不返回任何行,则" IN"表达式将始终返回false。该集将不是NULL

    c.2。将YEAR(BirthDate)与一个空集进行比较是有效的。它将始终返回false。


    SQL中有几种类型的子查询,您获得哪种子查询(以及所得到的行为)取决于上下文。例如,如果在大多数表达式上下文中使用(subquery)语法作为操作数,则这是标量子查询。另一方面,作为IN运算符的右操作数,它是一个表子查询。

    对于标量子查询:
    如果子查询不返回任何行,则标量子查询的结果为NULL
    如果子查询返回多行,则为错误。
    如果子查询返回一行,则结果是该行的查询(仅)列的值。

    对于表子查询:
    如果子查询不返回任何行,则结果为空值集,因此,例如IN操作将始终返回false。
    否则,结果是所有行的查询列的集合。

    因此要单独解决您的问题:

  • 这取决于子查询的上下文

  • 是的,如果没有行,则标量子查询始终返回NULL
    找到

  • IN操作的上下文中,它是一个表子查询,并且
    因此,没有行意味着没有要匹配的值。但是请注意,由于
    IN的语义,如果您的查询返回查询所在的行
    列值本身是NULL,您将在其中输入NULL
    比较集。 IN操作实际上是等式的OR
    左操作数与每个值之间的比较
    右边的值集。集合中的空值将导致
    "未知",而不是true或false,因此IN操作可以
    仅返回true(如果存在与某些非null值匹配的结果)
    集合)或未知(因为该值可能与null匹配或不匹配)。