文档章节

EXSITS应该怎么用?

吐槽的达达仔
 吐槽的达达仔
发布于 2014/12/05 22:18
字数 582
阅读 19
收藏 0
   无论是做项目还是普通使用SQL,我们通常都会使用IN。因为很好理解,也很方便。但是,面对着多层查询嵌套,或者IN关键字里面的结果集数量巨大,查询的效率就会直线下降。这时候,我们应该用好EXSITS。

首先,来一个简单的例子。
with score(id,name,subject,score)
as(
select 0,'张三','数学',88 from dual union all
select 1,'张三','英语',78 from dual union all
select 2,'李四','数学',68 from dual union all
select 3,'李四','英语',98 from dual union all
select 4,'王五','数学',77 from dual union all
select 5,'王五','英语',92 from dual union all
select 6,'赵六','数学',81 from dual union all
select 7,'赵六','英语',75 from dual
)
,has_phone(name,has_phone)
as(
select '张三','有' from dual union all
select '李四','没有' from dual union all
select '王五','没有' from dual union all
select '赵六','有' from dual 
)
--select *
--  from score a
-- where name in (select name from has_phone where has_phone = '有')
select *
  from score a
 where exists (select 1
          from has_phone b
         where b.name = a.name
           and has_phone = '有')

这段SQL的意思是,查询有手机的同学的成绩。

那么我来理解一下IN和EXSITS的区别吧。
在使用IN的时候。
数据库首先是去在has_phone里面查找所有条件为“有”的name。
然后把这些结果集让每一个name去匹配。

在使用EXSITS的时候。
数据库是先查询SCORE,然后每个连接条件到EXSITS里面进行判断。
如果为TRUE,则加入结果集,否则就跳过。

EXSITS执行过程
可以理解为:
for x in (select * from score a)
loop

if(exists(select 1 from has_phone b where b.name = a.name ))
then
  output the record;
end if;

end loop;

对于in 和 exists的性能区别:
如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in;
反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists.
其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,
那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,
那么就会考虑到索引及结果集的关系了








本文转载自:http://dacoolbaby.iteye.com/blog/1638990

吐槽的达达仔
粉丝 28
博文 104
码字总数 7105
作品 0
广州
程序员
私信 提问
ASP.NET Aries 高级开发教程:表单检测字段是否已存(番外篇)

前言: 昨天刚好有人问了这个问题,因此就针对这个问题,补上一篇吧。 正文: 如图:在用户编辑列表中,用户名是会自动检测是否已存在的。 具体对应的Html内容如下: *用户名: 验证类型的参...

路过秋天
07/25
0
0
鼠标离开文本框,请求执行了三次,应该只执行一次才对

validatebox 的validType属性 页面代码如下: data-options="required:true,validType:['minLength[1]','maxLength[45]','checkUserId']" js代码如下: $.extend($.fn.validatebox.defaults......

javacc
2015/10/22
367
6
Linux定时任务的使用

Linux下的定时任务,crontab是一个非常有用的命令(大部分的自动完成的工作都需要用到自动执行命令) 这里演示一个非常简单的定时任务设置。(用来做以后所有复杂的自动化工作的前提)。 先写...

熊猫88
2016/01/25
88
0
php安装脚本

#!/bin/sh echo "----------------------------------start install php -----------------------------" yum -y install gcc make gd-devel libjpeg-devel libpng-devel libxml2-devel bzip......

735897194
2016/12/16
0
0
mysql的 exsits 和 in的查询优化

数据库中现有两张表,一张客户表(customer),一张订单表(order) 客户表数据大概3K多条,订单表数据有100W条左右 当需要查询客户的订单状态在退款,付款,部分付款,支付完成的客户时,出...

帕吉不吃肉
07/02
34
0

没有更多内容

加载失败,请刷新页面

加载更多

如何快速为网站选择合适的SSL证书

随着HTTPS普及,越来越多用户开始采用SSL证书,来对HTTP进行加密,升级到HTTPS。但面对各种不同的SSL证书,用户应如何选择?安信SSL证书将为大家讲解: 一、按SSL证书类型选择 DV SSL证书:域...

安信证书
14分钟前
1
0
被嫌弃的eval和with

本文转载于:专业的前端网站➥被嫌弃的eval和with 前面的话   eval和with经常被嫌弃,好像它们的存在就是错误。在CSS中,表格被嫌弃,在网页中只是用表格来展示数据,而不是做布局,都可能被...

前端老手
16分钟前
1
0
Allegro非常实用的快捷键-PCB环境

立题简介: 内容:简单介绍Allegro绘制的PCB环境下的快捷键; 来源:实际使用得出; 作用:对Allegro绘制PCB快捷键进行介绍; PCB环境:Cadence 16.6; 立题详解: 对“allegro”板而言,其在...

demyar
23分钟前
1
0
润乾报表与 ActiveReport JS 功能对比

简介 润乾报表是用于报表制作的大型企业级报表软件,核心特点在于开创性地提出了非线性报表数学模型,采用了革命性的多源关联分片、不规则分组、自由格间运算、行列对称等技术,使得复杂报表...

泡泡糖儿
24分钟前
1
0
仿微信打飞机游戏网页版,基于cocos2d-js游戏引擎,在线试玩,内含源码

早几年研究cocos2d的demo项目,这个是基于cocos2d-js游戏引擎,整个游戏用js编写。 玩法:鼠标拖动飞机移动即可 试玩地址 源码地址 游戏截图: 文件说明 cocos2dx:游戏引擎 res:存放游戏素...

tanghc
27分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部