zoukankan      html  css  js  c++  java
  • oracle 子查询中null的问题(in 和 not in)

    先看一下员工表:

    SELECT * FROM p_emp e 



    例子:查询员工表中不是领导的员工

    按正常逻辑思维:SQL语句应该为:

    SELECT * FROM p_emp e WHERE e.empno NOT IN (SELECT mgr FROM p_emp)


    但是输出结果为空,没有返回值

    再看:

    SELECT * FROM p_emp e WHERE e.empno IN (SELECT mgr FROM p_emp)

    这里有返回值

    这里的in后面的句子可以理解为or拼接,简单举例即

    in (9566,9839,null)可以等价于mgr=9566 or mgr=9839 or mgr=null,

    not in (9566,9839,null)可以等价于not(mgr=9566 or mgr=9839 or mgr=null)或mgr!=9566 and mgr!=9839 and mgr!=null。

    为什么都是or拼接,in可以而not in不可以呢,可以把not in理解为后面的and表达式就知道了,因为mgr=null为null,也就相当于false,导致整个表达式为false,无论传何值都为false,自然无法返回数据。

    当发现not in后的子查询后面有null值时,可以在子查询里用is not null或函数过滤null值。

     所以,最后的SQL语句应该为:

    SELECT * FROM p_emp e WHERE e.empno NOT IN (SELECT mgr FROM p_emp WHERE mgr IS NOT NULL)


    这些即为员工表中不是领导的员工
  • 相关阅读:
    pam_cracklib module
    转:ubuntu svn
    fw: subversion+apache config
    转:jenkins 简介
    fw:java 10大必知技术
    FW: Linux 搭建 csvn 服务器。
    转:修改svn 端口号
    转:Ubuntu搭建jenkins
    转:vmware workstation的三种网络连接方式。
    图像处理之直方图均衡
  • 原文地址:https://www.cnblogs.com/sutao/p/7380220.html
Copyright © 2011-2022 走看看