EXSITS应该怎么用?

无论是做项目还是普通使用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

EXSITS应该怎么用?

时间: 2024-10-13 07:35:45

EXSITS应该怎么用?的相关文章

基础渗透测试笔记一

1.access数据库 数据库后缀名:*.mdb 打开数据库工具: 破障浏览器  辅臣数据库浏览器. access注入>判断注入点> '报错  and 1=1返回正常  and 1=2返回错误  or 1=1正 常   or 1=2返回错误  an 1=23错误 返回错误存在注入漏洞 获取基本信息: and 1=cast(version()as int) 获取数据库版本信息系统信息 and 1=cast(user||123 as int)获取当前用户名称 postgres用户相当于root用户

2016-7-2 Linux shell基础知识

静态语言:编译型语言 强类型(变量) 事先转换成可执行格式 c c++ java c# 强类型语言的变量在使用前,必选事先声明,甚至需要初始化 动态语言:解释型语言 弱类型 边解释边执行 php shell python 弱类型语言,变量声明时,甚至不区分类型 编程能力: 脚本编译 变量类型:事先确定数据的存储格式和长度的 1Byte=8b   1(Byte)字节=8位(bit) 字符型 数值型 整型 浮点型 Bash变量类型 环境变量 本地变量(局部变量) 位置变量 特殊变量:$? 本地变量:

mysql总结

mysql命令行: 如何使用命令行:配置mysql的环境变量path指向mysql的安装目录下的bin文件夹,然后在cmd中直接可以调用mysql mysql -h localhost -u(usernemw) root -p(password) root.-h 可以不写,默认localhost show databases; --显示所有的数据库.drop database php--删除数据库. create database php:--创建一个数据库.use php:--选择这个数据库.

数据库开发

1.Mysql是一种开放源代码的关系型   数据库管理系统(RDBMS),Mysql数据库系统使用最常用的数据库管理语言-----结构化查询语言(SQL)进行数据库管理 2.官网下载Mysql后进行安装 下载地址: http://dev.mysql.com/downloads/mysql/ 选择合适的版本 3.配置环境变量(mysql.exe) 路径: C:\Program Files\MySQL\MySQL Server 5.7\bin 4.启动服务: (1)任务管理---服务(Win10)-

Oracle之UTL_FILE 包用法详解

UTL_FILE包可以用来读写操作系统上的文本文件,UTL_FILE提供了在客户端(FORM等等)和服务器端的文件访问功能. 创建测试目录: 新建一个command window: 创建目录:(以system用户登录数据库) Sql代码 收藏代码 SQL> create or replace directory cux_log_dir as '/home/appltest/debug'; Directory created 赋权限. Sql代码 收藏代码 SQL> grant read, wr

使用VMware桥接模式组建局域网测试MSMQ(二)

上一篇讲了搭建VMware虚拟机实现与宿主机相互通信,环境已经就绪,现在就可以做MSMQ的分布式开发了. 本篇准备分四点介绍MSMQ: 1.MSMQ简介 2.MSMQ的安装 3.MSMQ编程开发 4.Demo下载 一.MSMQ简介 MSMQ本质上是一种消息传递协议,它允许在单独的服务端/客户端运行的应用程序间已可靠的方式通信.队列用来临时存储消息,服务器端向队列发送消息,客户端从队列读取消息.这就使得即使服务器端和客户端不在同一网络中,不能直接访问彼此,也能通过队列进行通信.相比之下,socke

Java学习笔记-File操作(API)

一:知识点总结 1.File类只用于表示文件(目录)的信息,不能对文件的内容进行访问. 2.创建File对象时候的路径问题 (1)File file=new File(“绝对路径”); “绝对路径”: 1)windows: “d:/test” -------Java提供的自动处理的方法,程序员比较常用 “d:\\test”-----转义字符 “d:”+File.separator+”test” 2)Linnux/Unix/Mac A.”/home/soft01/test” B.  ”/home/

分享:Node.js静态文件服务器实战

博文共赏:Node.js静态文件服务器实战 作者 田永强 发布于 2011年11月13日 | 12 讨论 [编者按]<博文共赏>是InfoQ中文站新推出的一个专栏,精选来自国内外技术社区和个人博客上的技术文章,让更多的读者朋友受益,本栏目转载的内容都经过原作者授权.文章推荐可以发送邮件到[email protected]. 本文是我对V5Node项目的总结,该项目的特性包括: 项目大多数的文件都是属于静态文件,只有数据部分存在动态请求. 数据部分的请求都呈现为RESTful的特性. 所以项目主

练习2 及pl/sql

Rownum 如果不是对主键排序是不会变得 -查询没有学分的学生信息 --SELECT * FROM z_student zs WHERE zs.code NOT IN (SELECT DISTINCT zsc.stu_code FROM z_stu_cour zsc) SELECT * FROM z_student zs WHERE NOT EXISTS (SELECT 1 FROM z_stu_cour zsc WHERE zsc.stu_code=zs.code) exsits 效率极高