一、 IN和EXISTS比较

在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行查询。此时就会用到IN和EXISTS。
例如:查询departments表中存在的部门的人数。

1、 使用IN

SQL> set timing on
SQL> select employees.department_id,count(*)
  2  from employees
  3  where employees.department_id in (
  4  select department_id from departments)
  5  group by department_id;

DEPARTMENT_ID COUNT(*)
------------- ----------
  10       1
  20       2
  30       6
  40       1
  50      45
  60       5
  70       1
  80      34
  90       3
 100       6
 110       2

11 rows selected.

Elapsed: 00:00:00.09

2、 使用EXISTS

SQL> select department_id,count(*)
  2  from employees
  3  where exists(
  4  select 1 from departments where departments.department_id=employees.department_id)
  5  group by employees.department_id;

DEPARTMENT_ID COUNT(*)
------------- ----------
  10       1
  20       2
  30       6
  40       1
  50      45
  60       5
  70       1
  80      34
  90       3
 100       6
 110       2

11 rows selected.

Elapsed: 00:00:00.01

总结:
IN:确定给定的值是否与子查询或列表中的值相匹配。使用IN时,子查询先产生结果集,然后主查询再去结果集中寻找符合要求的字段列表,符合要求的输出,反之则不输出。
EXISTS:给定一个子查询,检测行的存在。它不返回列表的值,只返回一个True或False。其运行方式是先运行主查询一次,再去子查询中查找与其对应的结果,如果子查询返回True则输出,反之则不输出。再根据主查询中的每一行去子查询中查询。
由于IN操作符需要进行确切地比较,而EXISTS只需要验证存不存在,所以使用IN将会比使用EXISTS花费更多的成本,因此能使用EXISTS替代IN的地方,应该尽量使用EXISTS。另外,尽量使用NOT EXISTS替代NOT IN,使用EXISTS替代DISTINCT。

二、表连接和EXISTS比较

例如:获取部门名为Finance的员工信息

1、 使用EXISTS

SQL> select employee_id,first_name,salary,department_id
  2  from employees
  3  where exists(
  4  select 1 from departments where departments.department_id=employees.department_id
  5  and department_name='Finance');

EMPLOYEE_ID FIRST_NAME     SALARY DEPARTMENT_ID
----------- -------------------- ---------- -------------
108 Nancy      12008      100
109 Daniel       9000      100
110 John       8200      100
111 Ismael       7700      100
112 Jose Manuel       7800      100
113 Luis       6900      100

6 rows selected.

Elapsed: 00:00:00.02

2、 使用表连接

SQL> select employee_id,first_name,salary,employees.department_id
  2  from employees,departments
  3  where employees.department_id=departments.department_id
  4  and department_name='Finance';

EMPLOYEE_ID FIRST_NAME     SALARY DEPARTMENT_ID
----------- -------------------- ---------- -------------
108 Nancy      12008      100
109 Daniel       9000      100
110 John       8200      100
111 Ismael       7700      100
112 Jose Manuel       7800      100
113 Luis       6900      100

6 rows selected.

Elapsed: 00:00:00.00

从两条SQL语句的执行时间来看,使用连接查询的效率要比使用EXISTS的效率高。当两张表的数据量不大时,使用二者之一就可以,当其中一张表的数据量巨大,或者两张表的数据量都很大的时候,则最好使用连接查询的方式。

【SQL】IN、EXISTS和表连接三者的效率比较相关推荐

  1. SQL版本:多表连接查询(两张表为例)

    SQL版本:    数据准备: #创建一个数据库company CREATE DATABASE IF NOT EXISTS company;#创建部门表 CREATE TABLE dept(id IN ...

  2. sql join on 多表连接_SQL 多表查询-交叉连接(笛卡尔积)

    交叉连接(笛卡尔积)返回被连接的两个表所有数据行的笛卡尔积,返回结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数. 简单解释一下笛卡尔积 设A,B为集合,用 ...

  3. 单表查询和多表连接查询哪个效率更快?

    这段时间在做项目的过程中,遇到一个模块,数据之间的联系很复杂,在建表的时候就很纠结,到底该怎么去处理这些复杂的数据呢,是单表查询,然后在业务层去处理数据间的关系,还是直接通过多表连接查询来处理数据关系 ...

  4. sql join on 多表连接_阿里规范不建议多表Join,可这SQL要怎么写啊?

    前言 我们先来看一下阿里开发手册的描述: 手册上写着[强制],但是我相信很多同学项目里面的代码都不满足这个要求.但是关键问题是:不用join,这SQL究竟要怎么写啊! 高性能MySQL 高性能MySQ ...

  5. SQL中EXISTS与IN的使用及效率

    in 和exists 对于以上两种查询条件,in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,每次loop 循环再对内表进行查询. 一直以来认为exists 比in 效率高 ...

  6. mysql和sql视图连接_SQL视图和多表连接

    本篇博客关注的焦点是视图的使用以及视图和多表连接的配合.以便可以了解视图,以及更好的使用视图. 首先,还是要说明一下视图的定义:视图是基于SQL语句的结果集的可视化虚拟表,换句话说视图就是SQL查询结 ...

  7. 【SQL】在SQL Server中多表关联查询问题

    好久没有写SQL语句的多表连接查询,总在用框架进行持久化操作.今天写了一个多表关联查询,想根据两个字段唯一确定一条数据 失败的案例如下: SELECT cyb.id,ad.name FROM [Gen ...

  8. oracle表连接查询逗号隔开_Oracle多表连接查询

    连接:将一张表中的行按照某种条件和另一张表中的行连接起来形成一个新行的的过程. 根据连接查询返回的结果,分为3类: 内连接(inner join) 外连接(outer join) 交叉连接(cross ...

  9. SQL表连接,排序输出

    数据库练习题: SQL表连接 区别on和where: 1.on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录. 2.where条件是在临时表生成好后,再对临时表进行 ...

最新文章

  1. java 生成pdf itext_使用Java组件itext 生成pdf介绍
  2. 如何理解“异或(XOR)”运算在计算机科学中的重要性?(转自-阿里聚安全)...
  3. python3实现下载ftp上的文件
  4. docker安装elasticsearch并进行目录挂载
  5. android SharedPreferences实现用户的注册和保存账号密码
  6. pytorch list转tensor_PyTorch 52.PyTorch常用代码段合集
  7. 高温津贴:关键是消除劳动者“权利贫困”
  8. python编程(基于twisted的客户端编程)
  9. 记录——《C Primer Plus (第五版)》第十章编程练习第十二题
  10. php checkbox表单提交,HTML表单Checkbox的值如何正确提交到PHP后台?,需要技巧
  11. 2017 ACM-ICPC南宁网络赛: J. Minimum Distance in a Star Graph(BFS)
  12. IDEA 导入cordova3.5工程目录注意事项
  13. Tomcat7下载与安装及eclipse中配置tomcat
  14. 最齐全的骨头VRay材质球素材,速来收藏
  15. 【持续更新中······】 各种模板+神奇黑科技
  16. SCADA系统一次系统与二次系统模型
  17. python中justify的意思_Python3 tkinter基础 Label justify 多行字符串左对齐
  18. python:批量改名脚本
  19. java lucene 中文分词_Lucene的中文分词器IKAnalyzer
  20. C语言编程练习 3.写一个函数,如果它首次被调用,则返回字母A,第二次被调用,则返回字母B,第三次调用,则返回字母C,以此类推。(提示:使用一个static数据类型)

热门文章

  1. 『HTML5挑战经典』是英雄就下100层-开源讲座(一)从天而降的英雄
  2. 职称考试计算机怎么学容易,计算机职称考试备考的六个关键点
  3. zend新建php文件夹,php - 对于Zend的项目模块基于一步一步转化成文件夹结构 - SO中文参考 - www.soinside.com...
  4. Docker-Docker-file构建Redis5.0.3镜像
  5. gulp之gulp-uglify模块
  6. 多线多IP的服务器配置
  7. 根据class显示或隐藏多个div
  8. 马哥Linux网络班作业(6)
  9. Javascript 正则表达式校验数字
  10. Linux对变量的截取替换