in/exists not in/not exists null
in/not in exists/not exists null的理解
两个测试表
create table tmp01 as
with tmp as (
select '1' as id from dual
union all
select '2' as id from dual
union all
select '3' as id from dual
union all
select null as id from dual
)
select * from tmp;
create table tmp02 as
with tmp as (
select '1' as id from dual
union all
select '2' as id from dual
union all
select null as id from dual
)
select * from tmp;
select * from tmp01 t where t.id in (select * from tmp02);
ID
in可以理解为 t.id = 1 or t.id = 2 or t.id = null
select * from tmp01 t where t.id not in (select * from tmp02);
ID
no rows
not in 可以理解为 t.id <> 1 and t.id <> 2 and t.id <> null
由于t.id <> null,为unkown,始终返回false,所以查不出值来。
解决:
select * from tmp01 t where t.id not in (select * from tmp02 where id is not null) or t.id is null;
---------------------------------------------------------------------------------------------------------------------------------
exists实际上用的也是等值判断
select * from tmp01 t where exists (select 'X' from tmp02 d where d.id = t.id);
ID
子查询中,d.id = t.id 判断出来的只有 1 ,2,null = null不可判断,null只能使用 is null,is not null.
select * from tmp01 t where not exists (select 'X' from tmp02 d where d.id = t.id);
ID
此语句查出了null和3,子查询中查出的是1,2,不在这个集合中的有null和3
再说一下 in/exists的效率问题
两个表中一个数据量小,一个数据量大,则子查询表大的用exists,表小的用in
表tmp01(小表),表tmp02(大表)
select * from tmp01 where id in (select id from tmp02)
效率低,用到了tmp01 表上id 列的索引
select * from tmp01 where exists(select id from tmp02 where id= tmp01.id)
效率高,用到了tmp02 表上id 列的索引。
select * from tmp02 where exists(select id from tmp01 where id= tmp02.cc)
效率高,使用tmp02 表上id 列的索引
select * from tmp02 where exists(select id from tmp01 where id= tmp02.cc)
效率低,用到了tmp01表上id列的索引
not in/not exists
not in内外表进行全表扫描,不使用索引
not extsts 的子查询用到表上的索引。无论表大小,用not exists 都比not in 要快。
in/exists not in/not exists null的更多相关文章
- SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)
前言 本节我们来综合比较NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL的性能,简短的内容,深入的理解,Always to review the basics. ...
- magento -- 解决magento错误:ERROR: Base table or view already exists: 1050 Table ... already exists
相信有更新magento或者,备份转移magento站点的时候可能会碰到类似这样的错误提示: Base table or view already exists: 1050 Table ... alr ...
- oracle中的exists 和not exists 用法 in与exists语句的效率问题
博文来源(oracle中的exists 和not exists 用法):http://chenshuai365-163-com.iteye.com/blog/1003247 博文来源( in与exi ...
- sql server if exists和 if not exists 的关键字用法
if exists和if not exists关键字用法 1.介绍 if not exists 即如果不存在,if exists 即如果存在 2.使用 a.判断数据库不存在时 if not ...
- oralce中exists not exists in not in对于NULL的处理
1. 先讨论 in 与 not in中存在NULL的情况, sql语句如下: 1 select 1 result1 from dual where 1 not in (2, 3); 2 3 4 s ...
- not exists、left join/is null、not in 行为
测试数据 20:25:52[test](;)> select * from t;+------+------+| id | b |+------+------+| 1 | NUL ...
- sqlserver exists和in 与exists和not in
1.exists 和 in 1.1 正常情况下exists和in的效果是一样的,如图试验 即使子查询中包含null也没有关系,依然可以正常使用 1.2 in 和 exists效率比较 先看in 由图中 ...
- if exists和if not exists关键字用法
在sql语名中,if not exists 即如果不存在,if exists 即如果存在. 下面学习下二者的用法. a,判断数据库不存在时 代码示例: if not exists(select * f ...
- SQL Server-聚焦LEFT JOIN...IS NULL AND NOT EXISTS性能分析(十七)
前言 本节我们来分析LEFT JOIN和NOT EXISTS,简短的内容,深入的理解,Always to review the basics. LEFT JOIN...IS NULL和NOT EXIS ...
随机推荐
- 用AJAX技术聚合RSS
有时候,你的Blog可能需要这样的功能: 在自己Blog上聚合并显示朋友Blog的最新文章,这样方便自己及时了解朋友的消息,另外,也方便访问者找到和本Blog相关的blog和文章. 这个功能你可以叫它 ...
- linux scp 服务器远程拷贝
一.将本机文件复制到远程服务器上 #scp /home/administrator/news.txt root@192.168.1.1:/etc/squid /home/administrator/ ...
- android activity 跳转传值问题研究
intent = new Intent(); intent.setClass(LoginActivity.this, RegActivity.class); startActivity(intent) ...
- 简单的新浪微博OAuth认证实现
System.setProperty("weibo4j.oauth.consumerKey", Weibo.CONSUMER_KEY); System.setProperty(&q ...
- 疑难杂症:NoSuchMethodError: com.opensymphony.xwork2.util.finder.UrlSet.includeClassesUrl(Lcom/opensymphony/xwork2/util/finder/ClassLoaderInterface;)
严重: Exception starting filter struts2java.lang.NoSuchMethodError: com.opensymphony.xwork2.util.finde ...
- 数据剪切命令cut和数据粘贴命令pastte
在Windows中,经常从一个文件将一段文本移动到另一个文件中.在Linux中执行这个任务的是cut和paste命令. 一.数据剪切命令cut 命令格式: cut [option] [file] 常用 ...
- html、css、js的命名规范
最佳原则 坚持制定好的代码规范. 无论团队人数多少,代码应该同出一门. 项目命名 全部采用小写方式, 以下划线分隔. 例:my_project_name 目录命名 参照项目命名规则: 有复数结构时,要 ...
- 1. windows下作为应用程序启动apache的方法
1. 具体步骤如下:(文章末尾附加:Apache 2.2.17下载路径) 步骤一 :Cmd打开命令行窗口,切换到apache安装目录下 cd C:\MAS\TRSMAS\win31\apache\b ...
- Java基础知识强化之IO流笔记73:NIO之 Channel
1. Java NIO的Channel(通道)类似 Stream(流),但又有些不同: 既可以从通道中读取数据,又可以写数据到通道.但流的读写通常是单向的. 通道可以异步地读写. 通道中的数据总是要先 ...
- iOS 画图讲解2
1.图片水印 //layer上下文只能显示在drawRect里 //当开启上下文时,绘制图形即可在viewDidLoad中实现 //位图的上下文 //UIGraphicsBeginImageConte ...