`

[收藏]sql多表查询之四:子查询EXISTS

阅读更多

sql多表查询之四:子查询EXISTS

标签: sql多表查询 子查询EXISTS

大家都领会过使用sql多表查询之三:子查询IN 的奇妙了吧,还看到有朋友提到子查询的效率问题,很高兴大家能重视效率。那今天我们将介绍sql多表查询系列 的最后一菜,压轴菜——sql多表查询之四:子查询EXISTS。
什么是子查询EXISTS?
子查询EXISTS是用来指定一个子查询,检测行的存在使用子查询EXISTS 关键字引入一个子查询时,就相当于进行一次存在测试。外部查询的WHERE 子句测试子查询返回的行是否存在。子查询实际上不产生任何数据;它只返回 TRUE 或 FALSE 值。要注意:在子查询中使用仍然返回结果集,通过使用EXISTS仍取值为 TRUE
通过对子查询EXISTS的解释,大家可以发现子查询IN与子查询EXISTS的区别了吗?注意,EXISTS子查询实际上不产生任何数据;它只返回 TRUE 或 FALSE 值。
这样就不存在我们之前说“子查询IN适合外结果集大,子查询结果集小的情况。
好了,在我们了解EXISTS之前,让我们先来了解一下集合运算。
有两张表A和B

我们如何得到两表的并、减、交、乘、除呢
首先来看 集合运算-并

这个SQL很简单啦
select * from #a
union all
select * from #b
再看 集合运算-减
减是要什么样的结果呢?
以下两个结果分别是A-B和B-A得出来的

SQL如何处理呢?轮到我们的子查询EXISTS上场了
select * from a t1
where not exists(
select 1 from b t2
where t1.key1=t2.key1 and t1.key2=t2.key2
)

再看 集合运算-交
结果是:

SQL与减的很类似:
select * from #a t1
where exists(
select 1 from #b t2
where t1.key1=t2.key1 and t1.key2=t2.key2
)
看出他们的区别了吗?

集合运算-乘
结果集

其实这个我们的日常工作中使用的最多了,就是连接啦
SQL很简单:select * from #a,#b

最后,我们来看 集合运算-除
可能有些朋友对除出来的结果还有些陌生呢
结果集相除,会是什么结果呢?
不是任何表相除都是有结果的
这时,上面的两张表我们是用不上了,我们得来看下面这两张表,相除的条件

朋友们,看出他们是怎么除出来的吗?
SQL怎么写呢,想想,再看结果:
select a,b from #1 bb
where exists(
select 1 from (
select distinct #1.a,#1.b,#2.a c,#2.b d from #1,#2
) aa
where aa.a=bb.a and aa.b=bb.b and aa.c=bb.c and aa.d=bb.d
) group by a,b having count(*)>1

再来看一个吧:


SQL呢?
select distinct a,b from #1 a
where not exists(
select * from #2 b where not exists(
select * from #1 where a=a.a and b=a.b and c=b.a and d=b.b
)
)
如何理解呢
逐条扫描#1中的每条记录.
扫描每一条的时候,假设a=‘a’ and b=‘b’
开始去判断条件,即执行:
select * from #2 b where not exists(
select * from #1 where a='a' and b='b' and c=b.a and d=b.b
)
这时,又是一个子查询,它又逐条扫描#2的每条记录.
扫描每一条的时候,假设c=‘c’ and d=‘d’,然后开始去判断条件
即执行:
select * from #1 where a='a' and b='b' and c='c' and d='d'
这时,两个条件要判断的值都已经知道

查询就可以得到结果,看是否存在记录.然后将结果返回外层查询.

好了,sql多表查询之四:子查询EXISTS就介绍到这里了,如何用子查询EXISTS来改造我们上期说的查询前三名的学生成绩呢,就留给大家去实践啦
在本文的开篇,我们提到过子查询EXISTS” 子查询实际上不产生任何数据”,看上去他比IN的效率要高很多呢,绝对是这样吗?当然不?否则IN早就被子查询EXISTS取代了嘛
那该如何判断要用子查询IN还是子查询EXISTS呢,当然要具体情况具体分析(汗!有人该说这不是废话了嘛)
哈哈,大家可以掌握一个小原则:
如果外表的记录很多而子查询的记录相对较少的话,建议采用子查询IN写法;相反,如果子查询的记录很多而外表的记录相对较少,则建议采用子查询EXISTS写法。
其它情况???就只能还是那句:具体情况具体分析:D
其实子查询IN是一定可以用EXISTS写出来的,但有些是必须要用子查询EXISTS,无法用IN写出来的
所以,关于子查询IN 与子查询EXISTS的PK,大概还是子查询EXISTS要稍胜一筹啦!
好了,关于SQL多表查询 四个部分就介绍到这里啦,谢谢大家的支持!!
下次我们来介绍介绍SQL2008的新东东,和数据仓库的一些好东东,希望大家多多关注xj的博客 ~~~~~~~

分享到:
评论

相关推荐

    exists SQL用法详解、exists和not exists的常用示例

    exists: 括号内子查询sql语句返回结果不为空(即:sql返回的结果为真),子查询的结果不为空这条件成立,执行主sql,否则不执行。 not exists:与exists相反,括号内子查询sql语句返回结果为空(即:sql不返回的结果...

    浅析SQL中WHERE EXISTS子查询.pdf

    浅析SQL中WHERE EXISTS子查询.pdf

    数据库实验报告 SQL查询 ,子查询组合

    3.子查询及组合 4.数据控制、数据导入/导出、数据备份和恢复 实验1 SQL SEVER 2000的系统工具、使用交互方式建库、建表实验 实验目的和要求:了解SQL SEVER 2000的功能及组成,熟练掌握利用SQL SEVER 2000企业管理...

    SQL之EXISTS

    它所在的查询属于相关子查询,即子查询的查询条件依赖于外层父查询的某个属性值,处理过程一般为: 取外层查询的第一个元组,根据它与内层查询相关的属性值处理内层查询,若where子句返回true,则将此元组放入结果表...

    关系代数中“除法”运算与SQL中带有exists子查询的对比教学.pdf

    关系代数中“除法”运算与SQL中带有exists子查询的对比教学.pdf

    sql exists和not exists用法

    使用EXISTS(或NOT EXISTS)关键字引入一个子查询时,子查询实际上不产生任何数据;它只返回TRUE或FALS值。 指定一个子查询,检测行的存在。 如果子查询包含行,则返回 TRUE IN效率要差(返回子查询)

    精通SQL 结构化查询语言详解

    10.2.4 EXISTS子查询实现两表交集  10.2.5 SOME/ALL子查询  10.2.6 UNIQUE子查询  10.3 相关子查询  10.3.1 使用IN引入相关子查询  10.3.2 比较运算符引入相关子查询 10.3.3 在HAVING子句中使用相关子...

    【3.18数据库作业8】SQL练习8 – SELECT(嵌套查询EXISTS、集合查询、基于派生表的查询)

    -带有EXISTS谓词的子查询 -集合查询 -基于派生表的查询 -Select总结 下午上次课学到了嵌套查询-3 今天我们来看一下 带有EXISTS谓词的子查询 3/20 15:30 EXISTS谓词: 存在量词 ∃ 带有EXISTS谓词的子查询不返回任何...

    精通sql结构化查询语句

    10.3.2 使用EXISTS子查询实现两表交集 10.3.3 使用EXISTS子查询实现两表并集 10.3.4 使用NOT EXISTS的子查询 10.4 相关子查询 10.4.1 使用IN引入相关子查询 10.4.2 使用比较运算符引入相关子查询 10.4.3 在HAVING...

    MySql基本查询、连接查询、子查询、正则表达查询讲解

    5、子查询 6、合并查询结果 7、为表和字段取别名 8、使用正则表达式查询 什么是查询? 怎么查的? 数据的准备如下: [sql] view plain copy create table STUDENT( STU_ID int primary KEY, STU_NAME char(10) ...

    数据库作业8:SQL练习5 – SELECT(嵌套查询EXISTS、集合查询、基于派生表的查询)

    4.带有EXISTS谓词的子查询 EXISTS谓词代表存在量词, 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。 若内层查询结果非空,则外层的WHERE子句返回真值;若内层查询结果为空,...

    sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句

    在子查询中,NOT IN子句将执行一个内部的排序和合并。无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT ...

    精通SQL--结构化查询语言详解

    10.2.4 exists子查询实现两表交集 194 10.2.5 some/all子查询 195 10.2.6 unique子查询 197 10.3 相关子查询 198 10.3.1 使用in引入相关子查询 198 10.3.2 比较运算符引入相关子查询 200 10.3.3 在having子句...

    SQL练习5 – SELECT(嵌套查询EXISTS、集合查询、基于派生表的查询)

    带IN谓词,ANY和ALL 谓词的子查询都能用EXIST子查询等价替换但是有些EXIST子查询不能被其他形式子查询替代。 此查询是相关子查询。在学生表中依次取元组的Sno值,在SC表中查询Sno值等于Student表中的Sno值,并且Cno ...

    数据库子查询

    分为四类介绍数据库子查询: 一、使用比较运算的子查询 二、使用all、any关键字的子查询 三、使用列表运算符的子查询(in 或者 not in) 四、使用exists运算符的子查询

    SQL语句嵌套查询

    基于SQL2005的嵌套查询,包括返回一个值的子查询、返回一组值的子查询(使用ANY谓词查询、使用IN谓词查询、使用ALL谓词查询使用EXISTS查询)。附有详细的表信息。

    SQL数据查询——嵌套查询

    嵌套查询语法格式带有IN谓词的子查询IN谓词实现交运算IN谓词实现差运算带有比较运算符的子查询带有ANY谓词的子查询带有ALL谓词的子查询相关子查询引用子查询的值不引用子查询的值(EXISTS)基于派生表的查询 ...

    【一文看懂SQL系列】攻下 查询 最难知识点之 子查询

    EXISTS后面(相关子查询)表子查询 按结果集的行列数不同: 标量子查询(结果集只有一行一列) 行子查询(结果集只有一行多列) 列子查询(结果集只有一列多行) 表子查询(结果集为多行多列) 一、WHERE 或 HAVING ...

    MySQL的子查询中FROM和EXISTS子句的使用教程

    FROM 子查询 FROM 子句中的子查询 MySQL FROM 子查询是指 FROM 的子句作为子查询语句,主查询再到子查询结果中获取需要的数据。FROM 子查询语法如下: ...FROM 子查询 SQL 如下: SELECT s1,s2 FROM (SELECT s1, s2*2 A

    T-SQL高级查询

    查询表的时候,有时候中间表需要重复使用,这些子查询被重复查询调用,不但效率低,而且可读性低,不利于理解。那么公式表表达式可以解决这个问题。 我们可以将公式表表达式(CET)视为临时结果集,在select、...

Global site tag (gtag.js) - Google Analytics