http://www.cnblogs.com/posoft/articles/1550453.html
上次介绍过sql 不等连接和sql子查询IN的用法,还看到有朋友提到子查询的效率问题,很高兴大家能重视效率。那今天我们将介绍子查询EXISTS的用法。
什么是sql子查询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'
这时,两个条件要判断的值都已经知道
查询就可以得到结果,看是否存在记录.然后将结果返回外层查询.
那么该如何判断要用子查询IN还是子查询EXISTS呢,当然要具体情况具体分析(汗!有人该说这不是废话了嘛)
哈哈,大家可以掌握一个小原则:
如果外表的记录很多而子查询的记录相对较少的话,建议采用子查询 IN写法;相反,如果子查询的记录很多而外表的记录相对较少,则建议采用子查询EXISTS写法。
其它情况???就只能还是那句:具体情况具体分析:D
其实子查询IN是一定可以用EXISTS写出来的,但有些是必须要用子查询EXISTS,无法用IN写出来的
所以,关于子查询IN 与子查询EXISTS的PK,大概还是子查询EXISTS要稍胜一筹啦!
分享到:
相关推荐
SQL 中 EXISTS 的用法简介 exists 是 SQL 中最常用的子查询操作符之一,用于检测子查询是否返回至少一个记录。exists 的使用场景非常广泛,包括对多表之间的关系进行查询、检测记录的存在性等。 在 SQL 中,exists...
### SQL EXISTS 和 NOT EXISTS 的用法详解 在SQL查询中,`EXISTS`与`NOT EXISTS`是非常实用的子查询操作符,它们主要用于检测是否存在满足一定条件的数据行。相较于`IN`、`NOT IN`等操作,`EXISTS`与`NOT EXISTS`...
### SQL Server 2005 EXISTS 使用方法详解 #### 一、EXISTS 子句概述 在 SQL Server 2005 中,`EXISTS` 是一个非常实用的子句,用于检查子查询是否返回至少一行数据。如果子查询返回至少一行数据,则 `EXISTS` ...
本文将重点剖析WHERE EXISTS子查询的语法、执行流程及使用离散数学知识辅助解决复杂查询的实现方法。 WHERE EXISTS子查询是SELECT语句中的一种常用的查询方式,它可以将一个查询块嵌入到另一个查询块中,以便实现...
在SQL查询中,`EXISTS`和`NOT EXISTS`是两个非常重要的子查询操作符,它们主要用于判断子查询是否返回结果。本篇文章将详细介绍这两个关键字的用法,并通过实例进行解析。 首先,`EXISTS`的语法是:主查询中的条件...
### 经典SQL查询总结关于Exists, not Exists, IN, not IN 效率的说明 在数据库查询操作中,存在着多种方法来实现相似的功能,但不同的实现方式在性能上可能会有显著差异。本文将深入探讨 SQL 中 `EXISTS`, `NOT ...
SQL EXISTS 的用法详解 EXISTS 是 SQL 中的一个子句,用于判断是否存在满足条件的记录。它通常与 SELECT、FROM、WHERE 等子句结合使用,以实现复杂的查询操作。 EXISTS 的用法 EXISTS 子句的基本格式为:`EXISTS...
IN、EXISTS、NOT IN、NOT EXISTS 是 SQL 中四种常用的条件判断运算符,它们之间的区别主要体现在使用场景、执行效率和语法结构上。 IN IN 是一种条件判断运算符,用于判断某个值是否存在于一个列表中。其基本语法...
以上是SQL2000中的各种查询方法,这些基础知识对于理解和使用任何SQL数据库都是非常重要的。通过熟练掌握这些方法,你可以高效地从数据库中获取你需要的信息。在实际应用中,还可以结合存储过程、触发器、视图等高级...
理解`EXISTS`和`NOT EXISTS`的用法对于优化SQL查询非常重要,因为它们通常比使用`IN`或`JOIN`操作符更有效率,特别是在处理大量数据时。`EXISTS`主要关注记录是否存在,而不需要返回具体的值,这使得它在处理复杂...
if exists用法,里面包含各种需要用到if exists的情况。
在SQL查询中,`CASE WHEN`、`EXISTS`、`NOT EXISTS`以及`IN`和`NOT IN`是常用的操作符,它们用于处理复杂的条件判断和数据筛选。这些概念对于理解和编写高效的SQL语句至关重要,尤其是在数据分析和数据库管理中。 `...
在SQL查询中,`EXISTS`子句是一个非常重要的存在性测试工具,它用于检查子查询是否返回至少一行数据。这个关键字通常与`WHERE`子句一起使用,以过滤出满足特定条件的记录。让我们深入探讨`EXISTS`及其反义词`NOT ...
此外,这种教学方法还可以帮助学生理解除法运算背后的逻辑,以及exists子查询如何在实际的SQL查询中实现复杂的逻辑判断。 根据文档内容,在讲解关系代数除法运算时,需要注意的是将关系R和S中相对应的Y属性的含义...
在SQL查询中,EXISTS谓词是一个非常关键的子句,用于判断子查询是否返回至少一行数据。这个知识点对于数据库查询优化和复杂条件筛选至关重要。本文将深入探讨EXISTS谓词的工作原理、用法以及其与IN和JOIN操作符的...
在SQL Server中,`EXISTS` 和 `NOT EXISTS` 是两个非常重要的子查询操作符,它们用于检查子查询是否返回任何行。理解这两个操作符的用法对于编写高效的查询至关重要。 1. `EXISTS` 操作符: `EXISTS` 用于测试子...
EXISTS子句是另一种处理关联的方法,它检查一个子查询的结果是否存在。如果子查询返回至少一行数据,则EXISTS返回TRUE,否则返回FALSE。在某些情况下,EXISTS可以代替JOIN,特别是当仅关心左表中的某些记录是否在右...