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

    这里的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值。

    正如所看到的,not in出现了不期望的结果集,存在逻辑错误。如果看一下上述两个select 语句的执行计划,也会不同,后者使用了hash_aj,所以,请尽量不要使用not in(它会调用子查询),而尽量使用not exists(它会调用关联子查询)。如果子查询中返回的任意一条记录含有空值,则查询将不返回任何记录。如果子查询字段有非空限制,这时可以使用not in,并且可以通过提示让它用hasg_aj或merge_aj连接。

    如果查询语句使用了not in,那么对内外表都进行全表扫描,没有用到索引;而not exists的子查询依然能用到表上的索引。所以无论哪个表大,用not exists都比not in 要快。

  • 相关阅读:
    搭建JavaWeb服务器
    Python网络爬虫相关基础概念
    Python网络爬虫 《http和https协议》
    jupyter环境安装
    js 解密,混淆,逆向
    selenium
    2、JNI说明
    1、Java快速入门
    4、基于JZ2440之编写测试代码处理(处理图片识别人脸)
    3、在编译过程中出现no space left on device
  • 原文地址:https://www.cnblogs.com/zxf330301/p/10217362.html
Copyright © 2011-2022 走看看