我最近开始学习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视为列以及空单元格?
一个where子句由条件表达式.不要求条件表达式由任一侧的列名组成.实际上,虽然通常一侧或两侧是列,但是包含以下内容的表达式并不罕见:
一个常见的例子是:
WHERE 1 = 1 AND . . .
Run Code Online (Sandbox Code Playgroud)
这是自动生成代码的标志.一些程序员更容易通过包含来编织条件,AND <condition>但该子句需要一个锚点.因此,1 = 1.
该WHERE子句在概念上的工作方式是为该子句生成的每一行计算该子句FROM.如果子句求值为TRUE,则该行保留在结果集中(或用于进一步处理).如果是FALSE或NULL,则过滤掉该行.
因此,NULL IS NULL计算结果为TRUE,因此保留所有行. NULL = NULL计算结果为NULL,因此不保留任何行.