SELECT * FROM Employees WHERE NULL为NULL; SELECT * FROM Employees WHERE NULL = NULL;

时间:2015-03-16 01:12:58

标签: sql oracle

我最近开始学习oracle和sql。 在学习的过程中,我遇到了一些问题,我的朋友在接受采访时被问到了。

SELECT * 
FROM Employees  
WHERE NULL IS NULL;

此查询产生Employees表中的所有行。 至于我已经理解Oracle在列中搜索数据,那么,NULL,它在这里被视为列名吗? 当我说Oracle在列中搜索数据时,我是否正确? 为什么Oracle会在此查询中提供所有行? 在WHERE子句中,条件的左侧是否必须是COLUMN NAME? 不应该抛出错误吗?

SELECT * 
FROM Employees 
WHERE NULL = NULL; 

选择NO ROWS。

嗯,我明白我不能使用除IS NULL和IS NOT NULL之外的运算符来比较NULL值。 但为什么它应该产生结果而不是错误。 有人能解释一下这个吗? Oracle是否将NULL视为列以及空单元格?

2 个答案:

答案 0 :(得分:5)

where子句由条件表达式组成。不要求条件表达式由任一侧的列名组成。实际上,虽然通常一侧或两侧是列,但是包含以下内容的表达式并不罕见:

  • 子查询
  • 参数
  • 常数
  • 标量函数

一个常见的例子是:

WHERE 1 = 1 AND . . .

这是自动生成代码的标志。一些程序员更容易通过包含AND <condition>来编织条件,但该子句需要一个锚点。因此,1 = 1

WHERE子句概念的工作方式是为FROM生成的每一行计算子句。如果子句的计算结果为TRUE,则该行将保留在结果集中(或用于进一步处理)。如果是FALSENULL,则会过滤掉该行。

因此,NULL IS NULL的计算结果为TRUE,因此保留所有行。 NULL = NULL的计算结果为NULL,因此不会保留任何行。

答案 1 :(得分:3)

NULL is NULL 始终 trueNULL = NULL 始终 false。此外,您不会对任一查询中的任何列进行测试(因此您只会得到所有内容或者什么都没有。)