查询/子查询何时返回NULL并且何时没有值?

时间:2010-04-27 18:15:32

标签: sql sql-server subquery

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

  2. 标量子查询总是返回NULL,否则返回NULL 找到匹配的行?我假设大多数外部标量查询也返回 如果没有找到行,则为NULL?

  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)值与任何值进行比较?

4 个答案:

答案 0 :(得分:4)

NULLYearReleased时,子查询只返回NULL,否则会有一个空的记录集,使其成为您提到的IN ()个案例。

区分两者是非常重要的,因为它们意味着完全不同的东西。 NULL表示存在SELECT的内容,尽管该值表示“缺乏价值”可以这么说。空记录集表示没有任何内容符合指定的条件。

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

alt text

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

答案 1 :(得分:2)

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

湾这不是真的。如果没有匹配的行,则根据定义结果集始终为空。标量函数的结果不是结果集,因此它将为NULL或其他值。

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

C.2。将YEAR(BirthDate)与空集进行比较是有效的。它总是会返回false。

答案 2 :(得分:2)

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)

答案 3 :(得分:0)

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

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

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

所以要单独解决您的问题:

  1. 这取决于子查询的上下文

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

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