一、 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_IDCOUNT(*)
------------- ----------
  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_IDCOUNT(*)
------------- ----------
  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的效率高。当两张表的数据量不大时,使用二者之一就可以,当其中一张表的数据量巨大,或者两张表的数据量都很大的时候,则最好使用连接查询的方式。

最新文章

  1. c++转载系列 std::vector模板库用法介绍
  2. Eenterprise linux服务器分区
  3. IOS git 的安装
  4. java运行期类型鉴定
  5. 95. Unique Binary Search Trees II
  6. Microsoft Access Database Engine 2010 Redistributable Download
  7. Chrome多线程模型
  8. 编程实例--for循环,找出0~100之间与8有关的正整数
  9. jQuery Mobile方向感应事件
  10. VirtualBox 扩展包卸载或安装失败(VERR_ALREADY_EXISTS)
  11. HDU 3909 DLX
  12. 算法入门(C++)
  13. C# 6.0 11个新特性
  14. mfc---获取当前时间
  15. Linux之shell典型应用之脚本实现
  16. springmvc+thymeleaf搭建框架启动报错
  17. centos6.5下安装tomcat
  18. cropper实现图片剪切上传
  19. Android 7.0下,拍摄照片报错
  20. elasticsearch基本操作之--使用QueryBuilders进行查询

热门文章

  1. Problem 29
  2. linux 头文件和库文件的设置
  3. BZOJ 1232 USACO 2008 Nov. 安慰奶牛Cheer
  4. bug的分类和等级
  5. linux学习1-基础知识
  6. 【codeforces 796C】Bank Hacking
  7. 清北学堂模拟赛d3t4 a
  8. poj 1860 bellman 求正环
  9. 百度地图API位置偏移的校准算法
  10. mongoDB学习笔记——安装及启动