ORACLE的SQL语句,错在哪了,怎么老是未选定行 200
selectempnofromempwhereempnonotin(selectmgrfromemp);...
select empno from emp where empno not in (select mgr from emp);
展开
展开全部
下面是针对本文题的分析:
1。 首先来说说Oracle中的NULL。
Oracle中的NULL代表的是无意义,或者没有值。将NULL和其他的值进行逻辑运算,运算过程中,NULL的表现更象是FALSE。
下面请看真值表:
AND NULL
OR NULL
TRUE
NULL
TRUE
FALSE
FALSE
NULL
NULL
NULL
NULL
另外,NULL和其他的值进行比较或者算术运算(<、>、=、!=、+、-、*、/),结果仍是NULL。
如果想要判定某个值是否为NULL,可以用IS NULL或者IS NOT NULL。
再来看看NOT IN。根据逻辑运算关系,我们知道,NOT (X=Y OR N=M) 等价于 X!=Y AND N!=M,那么:
SELECT
*
FROM
table1 A
WHERE
A.col1
not
in
(
20
,
50
,
NULL
)
等价于
SELECT
*
FROM
table1 A
WHERE
A.col1
!=
20
AND
A.col1
!=
50
AND
A.col1
!=
NULL
根据NULL的运算特性和真值表,该语句无论前两个判定条件是否为真,其结果一定是NULL或者FALSE。故绝对没有任何记录可以返回。
这就是为什么语句1
查不到应有结果的原因。当然,如果你用NOT IN的时候,预先在子查询里把NULL去掉的话,那就没问题了
select empno from emp where empno not in (select mgr from emp where mgr is not null);
1。 首先来说说Oracle中的NULL。
Oracle中的NULL代表的是无意义,或者没有值。将NULL和其他的值进行逻辑运算,运算过程中,NULL的表现更象是FALSE。
下面请看真值表:
AND NULL
OR NULL
TRUE
NULL
TRUE
FALSE
FALSE
NULL
NULL
NULL
NULL
另外,NULL和其他的值进行比较或者算术运算(<、>、=、!=、+、-、*、/),结果仍是NULL。
如果想要判定某个值是否为NULL,可以用IS NULL或者IS NOT NULL。
再来看看NOT IN。根据逻辑运算关系,我们知道,NOT (X=Y OR N=M) 等价于 X!=Y AND N!=M,那么:
SELECT
*
FROM
table1 A
WHERE
A.col1
not
in
(
20
,
50
,
NULL
)
等价于
SELECT
*
FROM
table1 A
WHERE
A.col1
!=
20
AND
A.col1
!=
50
AND
A.col1
!=
NULL
根据NULL的运算特性和真值表,该语句无论前两个判定条件是否为真,其结果一定是NULL或者FALSE。故绝对没有任何记录可以返回。
这就是为什么语句1
查不到应有结果的原因。当然,如果你用NOT IN的时候,预先在子查询里把NULL去掉的话,那就没问题了
select empno from emp where empno not in (select mgr from emp where mgr is not null);
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询