如果查询/子查询没有找到任何匹配的行,则它返回NULL或根本没有值,因此甚至不是NULL值。基于 查询/子查询返回NULL的标准是什么,何时不返回任何结果,甚至不返回NULL值?
标量子查询总是返回NULL,否则返回NULL 找到匹配的行?我假设大多数外部标量查询也返回 如果没有找到行,则为NULL?
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)
值与任何值进行比较?
答案 0 :(得分:4)
当NULL
为YearReleased
时,子查询只返回NULL
,否则会有一个空的记录集,使其成为您提到的IN ()
个案例。
区分两者是非常重要的,因为它们意味着完全不同的东西。 NULL
表示存在SELECT
的内容,尽管该值表示“缺乏价值”可以这么说。空记录集表示没有任何内容符合指定的条件。
编辑:已更新以显示示例结果
前两个查询只是为了显示两个表中的内容。第三个查询是您的查询,第四个查询只显示如果用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。
否则,结果将是所有行的查询列的集合。
所以要单独解决您的问题:
这取决于子查询的上下文
是的,如果没有行,则标量子查询始终返回NULL
找到
在IN
操作的上下文中,它是一个表子查询,并且
因此,没有行意味着没有要匹配的值。但是请注意,由于
IN
的语义,如果您的查询返回查询所在的行
列值本身是NULL
,则您将有一个NULL
比较集。 IN
操作实际上是相等的OR
左操作数与每个值之间的比较
右边的值集。集合中的空值将导致
“未知”,而不是对或错,因此IN
操作可以
仅返回true(如果存在与某个非null值匹配的
集合)或未知(因为该值可能匹配null,也可能不匹配)。