在用scott/tiger 用户下的emp 表
执行:
select empno from emp
where empno in (select mgr from emp);
显示:
ENAME EMPNO SAL
---------- ---------- ----------
JONES 7566 2975
BLAKE 7698 2850
CLARK 7782 2450
SCOTT 7788 3000
KING 7839 5000
FORD 7902 3000但执行
select empno from emp
where empno not in (select mgr from emp);
显示:
未选定行就是这里我想不通 我原先的想法就是 用 not in 应该和上面相成互补 整个 emp 表是:
ENAME EMPNO SAL
---------- ---------- ----------
SMITH 7369 800
ALLEN 7499 1600
WARD 7521 1250
JONES 7566 2975
MARTIN 7654 1250
BLAKE 7698 2850
CLARK 7782 2450
SCOTT 7788 3000
KING 7839 5000
TURNER 7844 1500
ADAMS 7876 1100ENAME EMPNO SAL
---------- ---------- ----------
JAMES 7900 950
FORD 7902 3000
MILLER 7934 1300那么执行select empno from emp
where empno not in (select mgr from emp);应该会是
ENAME EMPNO SAL
---------- ---------- ----------
SMITH 7369 800
ALLEN 7499 1600
WARD 7521 1250
MARTIN 7654 1250
TURNER 7844 1500
ADAMS 7876 1100
JAMES 7900 950
MILLER 7934 1300但结果却是:
未选定行
想不通 想前辈们指点下 谢谢!!
执行:
select empno from emp
where empno in (select mgr from emp);
显示:
ENAME EMPNO SAL
---------- ---------- ----------
JONES 7566 2975
BLAKE 7698 2850
CLARK 7782 2450
SCOTT 7788 3000
KING 7839 5000
FORD 7902 3000但执行
select empno from emp
where empno not in (select mgr from emp);
显示:
未选定行就是这里我想不通 我原先的想法就是 用 not in 应该和上面相成互补 整个 emp 表是:
ENAME EMPNO SAL
---------- ---------- ----------
SMITH 7369 800
ALLEN 7499 1600
WARD 7521 1250
JONES 7566 2975
MARTIN 7654 1250
BLAKE 7698 2850
CLARK 7782 2450
SCOTT 7788 3000
KING 7839 5000
TURNER 7844 1500
ADAMS 7876 1100ENAME EMPNO SAL
---------- ---------- ----------
JAMES 7900 950
FORD 7902 3000
MILLER 7934 1300那么执行select empno from emp
where empno not in (select mgr from emp);应该会是
ENAME EMPNO SAL
---------- ---------- ----------
SMITH 7369 800
ALLEN 7499 1600
WARD 7521 1250
MARTIN 7654 1250
TURNER 7844 1500
ADAMS 7876 1100
JAMES 7900 950
MILLER 7934 1300但结果却是:
未选定行
想不通 想前辈们指点下 谢谢!!
where empno not in (select mgr from emp); 加上别名试一试。
select a.empno from emp a
where a.empno not in (select b.mgr from emp b );
如果select mgr from emp这个集合只有一个数据!你这样想就行了
select mgr from emp 那你的empno都有了而你在显式empno肯定是空了
那你用in就全部显式了啊
而 in则没有这样的问题建议 可能出现这种问题的时候 使用not exist来做
select empno from emp
where not exist (select 1 from emp p where emp.empno = p.mgr);
8楼 说的很对 我知道了! 他的是正确答案 ! king 的mgr 是null! 在emp中用where 去掉 king ! 用not in 就OK 了
谢谢你!!
谢谢大家的回答!
select not in (“123”,null)是所有都得不满足,而此时和NULL运算返回的NULL,就覆盖了全部,所以返回的NULL。
最好写成select empno from emp emp1 where not exists (select mgr from emp emp2 where emp1.empno = emp2.mgr );8楼的exist少了个S。