我最近开始学习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视为列以及空单元格?
答案 0 :(得分:5)
where
子句由条件表达式组成。不要求条件表达式由任一侧的列名组成。实际上,虽然通常一侧或两侧是列,但是包含以下内容的表达式并不罕见:
一个常见的例子是:
WHERE 1 = 1 AND . . .
这是自动生成代码的标志。一些程序员更容易通过包含AND <condition>
来编织条件,但该子句需要一个锚点。因此,1 = 1
。
WHERE
子句概念的工作方式是为FROM
生成的每一行计算子句。如果子句的计算结果为TRUE
,则该行将保留在结果集中(或用于进一步处理)。如果是FALSE
或NULL
,则会过滤掉该行。
因此,NULL IS NULL
的计算结果为TRUE,因此保留所有行。 NULL = NULL
的计算结果为NULL,因此不会保留任何行。
答案 1 :(得分:3)
NULL is NULL
始终 true
,NULL = NULL
始终 false
。此外,您不会对任一查询中的任何列进行测试(因此您只会得到所有内容或者什么都没有。)