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

Avi*_*war 3 sql oracle

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

SELECT * 
FROM Employees  
WHERE NULL IS NULL;
Run Code Online (Sandbox Code Playgroud)

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

SELECT * 
FROM Employees 
WHERE NULL = NULL; 
Run Code Online (Sandbox Code Playgroud)

没有选择行.

好吧,我知道除了IS NULL和IS NOT NULL之外,我无法使用运算符比较NULL值.但为什么它应该产生结果而不是错误.有人能解释一下这个吗?Oracle是否将NULL视为列以及空单元格?

Ell*_*sch 5

NULL is NULL总是,总是。 此外,您不会针对任一查询中的任何列进行测试(因此您只能得到所有内容或什么也得不到)。trueNULL = NULL false


Gor*_*off 5

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

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

一个常见的例子是:

WHERE 1 = 1 AND . . .
Run Code Online (Sandbox Code Playgroud)

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

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

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