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) 值与没有值进行比较?
仅当
区分两者的含义非常重要,因为它们的含义完全不同。
编辑:已更新以显示示例结果
前两个查询只是为了显示两个表中的内容。如果将子查询替换为
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。该集将不是
c.2。将
SQL中有几种类型的子查询,您获得哪种子查询(以及所得到的行为)取决于上下文。例如,如果在大多数表达式上下文中使用
对于标量子查询:
如果子查询不返回任何行,则标量子查询的结果为
如果子查询返回多行,则为错误。
如果子查询返回一行,则结果是该行的查询(仅)列的值。
对于表子查询:
如果子查询不返回任何行,则结果为空值集,因此,例如
否则,结果是所有行的查询列的集合。
因此要单独解决您的问题:
这取决于子查询的上下文
是的,如果没有行,则标量子查询始终返回
找到
在
因此,没有行意味着没有要匹配的值。但是请注意,由于
列值本身是
比较集。
左操作数与每个值之间的比较
右边的值集。集合中的空值将导致
"未知",而不是true或false,因此
仅返回true(如果存在与某些非null值匹配的结果)
集合)或未知(因为该值可能与null匹配或不匹配)。