1. 数据库中in和exists关键字的区别

    in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询。

    一直以来认为exists比in效率高的说法是不准确的。
    如果查询的两个表大小相当,那么用in和exists差别不大。

    如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:

    例如:表A(小表),表B(大表)
    1:
    select * from A where cc in (select cc from B)
    效率低,用到了A表上cc列的索引;
    select * from A where exists(select cc from B where cc=A.cc)
    效率高,用到了B表上cc列的索引。
    相反的
    2:
    select * from B where cc in (select cc from A)
    效率高,用到了B表上cc列的索引;
    select * from B where exists(select cc from A where cc=B.cc)
    效率低,用到了A表上cc列的索引。

    带in的关联子查询是多余的,因为in子句和子查询中相关的操作的功能是一样的。如:
    select staff_name from staff_member where staff_id in
    (select staff_id from staff_func where staff_member.staff_id=staff_func.staff_id);

    为非关联子查询指定exists子句是不适当的,因为这样会产生笛卡乘积。如:
    select staff_name from staff_member where staff_id
    exists (select staff_id from staff_func);

    not in 和not exists

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

    尽量不要使用not in子句。使用minus 子句都比not in 子句快,虽然使用minus子句要进行两次查询:
    select staff_name from staff_member where staff_id in (select staff_id from staff_member minus select staff_id from staff_func where func_id like '81%');

    in 与 "=" 的区别

    select name from student where name in ('zhang','wang','li','zhao');

    select name from student where name='zhang' or name='li' or name='wang' or name='zhao'

    的结果是相同的。

数据库中in和exists关键字的区别的更多相关文章

  1. 转 数据库中的 date datetime timestamp的区别

    转 数据库中的 date datetime timestamp的区别 DATETIME, DATE和TIMESTAMP类型是相关的.本文描述他们的特征,他们是如何类似的而又不同的. DATETIME类 ...

  2. nginx中root与alias关键字的区别

    前言 近段时间秋招上岸了,于是每天疯狂补各种分布式基础,每天都在痛苦与快乐中度过. 在学习 nginx 的时候,遇到配置上的问题:root 与 alias 的区别,卡了大概三个小时,记录下来警醒自己不 ...

  3. mysql中in和exists二者的区别和性能影响

    mysql查询语句in和exists二者的区别和性能影响 还记得一次面试中被人问到in 和 exists的区别,当然只是草草做答,现在来做下分析. mysql中的in语句是把外表和内表作hash 连接 ...

  4. MySQL数据库中varchar与char类型的区别

    在数据库中建表时,需要给数据定义一个数据库中的数据库类型,当需要给String类型定义一个数据库中的类型时,可以看见有两个选择,一个是varchar,另一个是char,有很多人不清楚两者的区别,包括自 ...

  5. sql server数据库中char,varchar,nvarchar字段的区别

    Char,varchar,nvarchar字段是sql server数据库中的三种字段类型.好多人在选择存储的时候不知道如何抉择,我给大家讲下这个三个字段类型的区别. Char(n)是长度为n个字节的 ...

  6. 【Java_基础】java中static与final关键字的区别

    1.static关键字 经static关键字修饰的成员被该类的所有对象所共享,任意一对象对静态变量的修改其它对象都是可见的.通常通过类名来引用static成员.类加载的连接阶段将会为静态成员变量在jv ...

  7. 数据库中Schema和Database有什么区别

    在MySQL中创建一个Schema好像就跟创建一个Database是一样的效果,在SQL Server和Orcal数据库中好像又不一样. 目前我只能理解,在mysql中 schema<==> ...

  8. Mysql数据库中CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP区别

    如图所示,mysql数据库中,当字段类型为timestamp时,如果默认值取CURRENT_TIMESTAMP,则在insert一条记录时,end_time的值自动设置为系统当前时间,如果勾选了 ON ...

  9. SQL中IN和EXISTS用法的区别

    结论 1. in()适合B表比A表数据小的情况 2. exists()适合B表比A表数据大的情况 当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用. select * fro ...

随机推荐

  1. maven加载本地jar包到repository

    maven加载本地jar到repository 这是一个常见场景,此处以本地opencv jar文件导入repository为例 1.Ubuntu下 mvn install:install-file ...

  2. JVM是如何处理异常的

    JVM处理异常 异常处理的两大组成要素是抛出异常和捕获异常.这两大要素共同实现程序控制流的非正常转移. 抛出异常可分为显式和隐式两种.显式抛异常的主体是应用程序,指的是在程序中使用throw关键字,手 ...

  3. luogu P1816 【忠诚】

    话说许多dalao都采取线段树A题可本蒟蒻不会啊, 暴力的我想出了暴力解法(快排) #include<cstdio> #include<algorithm> using nam ...

  4. 【XSY2750】Mythological V 2-sat

    题目描述 有一棵\(n\)个点的树,还有\(m\)个物品. 你要把每个物品放在树上的一个点上(两个物品可以放在同一个点). 有\(q\)个限制:\(a,b\)两个物品在路上的最短路经过\(c\). 要 ...

  5. 【AGC005F】Many Easy Problems FFT 容斥原理

    题目大意 给你一棵树,有\(n\)个点.还给你了一个整数\(k\). 设\(S\)为树上某些点的集合,定义\(f(S)\)为最小的包含\(S\)的联通子图的大小. \(n\)个点选\(k\)个点一共有 ...

  6. bzoj 2429: [HAOI2006]聪明的猴子 (最小生成树)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2429 思路:就是找最小生成树最大的一条边,最小生成树的性质,最后加入的那条边就是最大的 实现 ...

  7. IDEA调试技巧之条件断点

    调试的时候,在循环里增加条件判断,可以极大的提高效率,心情也能愉悦.以下介绍下IDEA使用条件[Condition]断点的方法 1.编写一段样例代码 /** * @author jiashubing ...

  8. 「2017 Multi-University Training Contest 1」2017多校训练1

    1001 Add More Zero(签到题) 题目链接 HDU6033 Add More Zero 找出最大的k,使得\(2^m-1\ge 10^k\). 直接取log,-1可以忽略不计. #inc ...

  9. bzoj4671: 异或图

    bzoj4671: 异或图 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 ( ...

  10. 【题解】 bzoj3693: 圆桌会议 (线段树+霍尔定理)

    bzoj3693 Solution: 显然我们可以把人和位置抽象成点,就成了一个二分图,然后就可以用霍尔定理判断是否能有解 一开始我随便YY了一个\(check\)的方法:就是每次向后一组,我们就把那 ...