我们用数据库进行一些查询时,可能需要对结果进行去重复,一般我们都是想到distinct,但是为了提高效率我们应该尽量用exists,下

面我将举例分析。

我们假设有一张公司员工表staffs和一张部分表depts,其中员工表中包含字段dp_id,也就是部分编号,depts表中包含dp_id和dp_name,

分别表示部门和部分名字。我们现在要做的就是,找到这张员工表中涉及到的部门id和部门名字。

用distinct实现如下:

select d.dp_id,d.dp_name from depts d,staffs s where d.dp_id=s.dp_id;

这样写的sql语句执行过程是:先遍历执行部门表中的每一行,因为每一行对应一个dp_id,然后在固定dp_id的情况下表里staffs表中的每一行,直到运行到staffs表的最后一行。然后在换下一个dp_id进行查找,又要遍历staffs表中的每一行,以此类推,直到所有的dp_id都比较过。

用exists实现如下:

select d.dp_id,d.dp_name from depts d where exists(select null from staffs s where s.dp_id=d.dp_id)

首先说明一下exists的工作原理,exists语句用来判断()内的表达式是否存在返回值,如果存在就返回true,如果不存在就返回false,所以在上面语句中我们使用select null,因为返回什么数据不重要,重要有值返回就行。

另外exists的有点是,它只要括号中的表达式有一个值存在,就立刻返回true,而不用遍历表中所有的数据。

所以在dp_id同样多的情况下,用distinct需要每次都遍历staffs表进行比对,而使用exists只需要比对staffs表的一部分,在staffs表数据十分庞大时,这种性能差别就能更好的体现出来。

用exists代替distinct相关推荐

  1. MySQL数据库学习笔记(10)- distinct与in和exists子查询

    文章目录 1. distinct的使用 2. 子查询in 3. 子查询exists 1. distinct的使用 distinct 用于在查询中返回列的唯一不同值(去重复),支持单列或多列.(只能写在 ...

  2. mysql使用exists、in、distinct区别

    使用exists 使用exists代替in 1.exists只检查行的存在性,in 检查实际的值,所以exists的性能比in好 验证 select * from emp where deptno i ...

  3. Sql 语句中 IN 和 EXISTS

    原文链接:  (2条消息)Sql 语句中 IN 和 EXISTS 的区别及应用 - jcpp9527的博客 - CSDN博客 https://blog.csdn.net/wqc19920906/art ...

  4. mysql not exists 效率高_mysql not in、left join、IS NULL、NOT EXISTS 效率问题记录

    语句一:select count(*) from A where A.a not in (select a from B) 语句二:select count(*) from A left join B ...

  5. NOT IN、JOIN、IS NULL、NOT EXISTS效率对比

    语句一:select count(*) from A where A.a not in (select a from B) 语句二:select count(*) from A left join B ...

  6. oracle distinct分页优化_Oracle SQL性能优化最常用的40条建议

    关于Oracle SQL优化的内容,这一篇应该能满足常规大部分的应用优化需求,整整40条优化建议,干货满满. 1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换 ...

  7. 【SQL】IN、EXISTS和表连接三者的效率比较

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

  8. mysql sql exists_数据库sql语句的exists总结

    数据库sql语句的exists总结 sql exists in 学习 先来比较下语法: --deals=交易表,areas=地域表,例如香港:我们的目的:查看有交易的地域 select * from ...

  9. oracle update exsits,Oracle 11g 递归+ exists执行计划的改变

    有一个递归查询在Oracle 10g上运行很快,但在11g上运行不出来. SQL> select * from v$version; BANNER ----------------------- ...

最新文章

  1. kill qz _e epi,eu,ex,exo out3
  2. vs2012使用64位IIS EXPRESS调试
  3. pi数据库系统中国服务器,基于PI数据库的服务器实时监控系统研究与开发
  4. 学python五大理由_学习Python的五大理由
  5. 【计算机组成原理 数字逻辑 Verilog】32位加法器的实现:支持整数的加减运算
  6. Java 最常见 200+ 面试题全解析:面试必备
  7. 实验3 --俄罗斯方块 with 20135335郝爽
  8. 我那么拼命,为什么还会被裁掉?
  9. MySQL 外连接查询
  10. python 装饰器 二
  11. Layui中的table中toolbar自定义过程
  12. 动态代理(JDK动态代理)初步详解
  13. 天津出差系列(六)----第六天
  14. c语言一行黑白相间的瓷砖,磁砖样式——第八届蓝桥杯C语言B组(国赛)第二题...
  15. 【jzoj2220】【二分】愤怒的奶牛2(angry)
  16. 第四课 C++中的运算符
  17. 天翼随身wifi,鸡肋or神器?
  18. linux怎么杀掉僵尸进程,Linux中如何杀掉僵尸进程
  19. 2021年山东省安全员C证考试及山东省安全员C证找解析
  20. 一看就懂的字符串匹配算法 之 BM算法

热门文章

  1. MySQL学习笔记之MySQL安装详解
  2. Dom4j 解析Xml文档及 XPath查询 学习笔记
  3. 当页面上的某个控件回发时,保持滚动条位置的。
  4. Nginx加密与上游服务器的TCP网络通信
  5. 结构设计模式 - 复合设计模式
  6. BGP——本地始发选路+AS-PATH选路(讲解+命令)
  7. 【C语言】输入5个整数并按输入顺序逆序输出
  8. sqlmap源码阅读系列init中的_cleanupOptions
  9. react的一些概念
  10. git版本管理使用指南(附带repo)