在用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但结果却是:
未选定行
 想不通  想前辈们指点下 谢谢!!

解决方案 »

  1.   

    select empno from emp 
    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 ); 
      

  2.   

    当然不是互补,你想清楚,in 就是只在那select mgr from emp的集合了, not in 就是不在 select mgr from emp的集合里,
    如果select mgr from emp这个集合只有一个数据!你这样想就行了
      

  3.   

    in 就是在其中,not in就是不在其中呀
      

  4.   

    in是在其中,not in 是不在其中啊!@
    select mgr from emp 那你的empno都有了而你在显式empno肯定是空了
    那你用in就全部显式了啊 
      

  5.   

    not in 的子句中 如果有null值 也就是空值 那么这个条件就会恒为false[假如是那个经典表结构的话 king的mgr是空吧?]
    而 in则没有这样的问题建议 可能出现这种问题的时候 使用not exist来做
    select empno from emp 
    where not exist (select 1 from emp p where emp.empno = p.mgr); 
      

  6.   

    LZ 回复:
    8楼 说的很对 我知道了! 他的是正确答案 ! king 的mgr 是null! 在emp中用where 去掉 king ! 用not in 就OK 了
     谢谢你!!
     谢谢大家的回答! 
      

  7.   

    select in (“123”,null)是满足任意一个就OK。所以即使和NULL运算也没关系,
    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。