`

[收藏]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的博客 ~~~~~~~

分享到:
评论

相关推荐

    浅析SQL中WHERE EXISTS子查询.pdf

    浅析SQL中WHERE EXISTS子查询 SQL(Structured Query Language)是一种功能强大、通用的关系数据库语言,而SQL语言的核心是SELECT语句,其中WHERE子句的条件表达式表现得灵活而复杂,和谓词DISJunctive所形成的嵌套...

    MS_SQL server 多表查询 子查询小总结

    ### MS_SQL Server 多表查询与子查询详解 #### 一、子查询概述 在 SQL 语言中,当一个查询语句被嵌套在另一个查询的查询条件之中时,我们称之为**子查询**(Subquery)。子查询总是被写在圆括号中,并且可以被用在...

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

    【SQL查询与子查询组合】 SQL (Structured Query Language) 是用于管理和处理数据库的标准语言,而SQL Server 2000是Microsoft提供的一款关系型数据库管理系统。在这个实验中,你将学习如何使用SQL Server 2000的...

    SQLServer与ORACLE数据库实现子查询方法比较.docx

    “SQL Server 与 Oracle 数据库实现子查询方法比较” 数据库查询都是通过 SELECT 语句来完成的,子查询就是在一个 SELECT 语句中嵌套另一个 SELECT 语句,通过子查询的嵌套可以实现复杂的数据查询功能。在 SQL ...

    sql子查询总结

    SQL 子查询总结 SQL 子查询是一种在 SQL 语言中嵌套在另一个查询的查询条件中的查询语句。子查询总是写在圆括号中,可以用在使用表达式的任何地方,如 Select、Insert、Update 或 Delete 语句或其他子查询中。 子...

    sql中exists的用法

    exists 是 SQL 中最常用的子查询操作符之一,用于检测子查询是否返回至少一个记录。exists 的使用场景非常广泛,包括对多表之间的关系进行查询、检测记录的存在性等。 在 SQL 中,exists 的基本语法为: ```sql ...

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

    在SQL查询中,`EXISTS`和`NOT EXISTS`是两个非常重要的子查询操作符,它们主要用于判断子查询是否返回结果。本篇文章将详细介绍这两个关键字的用法,并通过实例进行解析。 首先,`EXISTS`的语法是:主查询中的条件...

    SQL之EXISTS

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

    SQL里的EXISTS与IN

    2. **子查询优化**:尽可能使用`EXISTS`代替`IN`,特别是在子查询结果较大时。 3. **分页优化**:在进行分页查询时,考虑使用`LIMIT`和`OFFSET`来减少不必要的数据检索。 ### 结论 通过对`IN`与`EXISTS`的对比分析...

    sql exists和not exists用法

    在SQL查询中,`EXISTS`与`NOT EXISTS`是非常实用的子查询操作符,它们主要用于检测是否存在满足一定条件的数据行。相较于`IN`、`NOT IN`等操作,`EXISTS`与`NOT EXISTS`具有更高的效率,尤其是在处理大型数据集时。 ...

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

    总结来说,关系代数的除法运算和SQL中的exists子查询虽然属于不同的概念范畴,但它们在逻辑上有相似之处,尤其是在处理某些特定类型的数据库查询问题时。通过对比教学法,不仅能够使学生更好地理解这些概念,而且...

    SQL语句的多表查询

    除了常规的表连接外,还可以使用`EXISTS`子句来进行复杂的子查询。`EXISTS`子句用于检查子查询是否至少返回一行数据。如果子查询返回至少一行数据,则`EXISTS`表达式的结果为真;否则为假。 示例: ```sql SELECT ...

    sql server2005 exists使用方法

    在 SQL Server 2005 中,`EXISTS` 是一个非常实用的子句,用于检查子查询是否返回至少一行数据。如果子查询返回至少一行数据,则 `EXISTS` 返回 TRUE;反之则返回 FALSE。`EXISTS` 子句通常用于提高查询性能,特别是...

    经典SQL查询总结关于Exists,not Exists.in ,not in效率的说明。

    **Exists** 和 **Not Exists** 子句通常用于检查子查询是否返回任何行,它们不会返回实际的数据,仅返回一个布尔值。 1. **Exists** - **语法结构**: ```sql SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2...

    SQL的数据查询功能之四---子查询.

    SQL的数据查询功能之四是关于子查询的使用。子查询,也称为嵌套查询,是将一个SELECT-FROM-WHERE语句插入到另一个查询的WHERE子句或HAVING短语中的查询,增强了SQL的查询能力。它允许我们用一系列简单的查询构建复杂...

    sql in,exists,not in,not exists区别

    EXISTS 是一种条件判断运算符,用于判断子查询是否返回结果集。如果子查询返回结果集,则条件成立,否则不成立。其基本语法为: `EXISTS ()` 其中,`<query>` 是子查询语句。如果子查询返回结果集,则条件成立,...

    SQL数据的查询和更新实验报告报告.pdf

    - **EXISTS**:检查子查询是否存在匹配项 #### 1.4 集合运算 - **UNION**:合并两个或更多查询的结果,去除重复行 - **AND, OR**:用于组合查询,实现交集和并集操作 ### 2. 数据更新 虽然实验主要侧重查询,但...

    SQL子查询、内连接和外连接查询

    【SQL子查询、内连接和外连接查询】 在SQL中,子查询、内连接和外连接是进行复杂数据检索的关键工具。这些概念的理解和熟练应用对于数据库管理与数据分析至关重要。 **子查询** 是一个嵌套在其他SQL语句中的查询,...

    详解SQL EXISTS 运算符

    SQL EXISTS 运算符是SQL查询中的一个关键逻辑运算符,它主要用于判断子查询是否返回至少一条记录。在理解EXISTS运算符之前,我们需要先熟悉SQL查询的基本结构。SQL(Structured Query Language)是一种用于管理关系...

Global site tag (gtag.js) - Google Analytics