`
liuhuan1534
  • 浏览: 49850 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

exists和in

阅读更多

in
针对in很好理解,

Sql代码 复制代码 收藏代码
  1. select * from T1 where T1.a in (select T2.a from T2) ”     
select * from T1 where T1.a in (select T2.a from T2) ”   

 

这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,T1和T2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。
exists:

Sql代码 复制代码 收藏代码
  1. select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;     
select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;   

 
T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。

刚开始有点不理解为啥是select 1,后来一想,最根本的原因是不能按照in的思路去考虑exists

 

通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。
Oracle在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,
系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因。

---------------------------------------------------------------------------------------------------------------------------------

 

    exists 适合外表的结果集小的情况。因为in 是把外表和那表作hash join,而exists是对外表作loop,每次loop再对那表进行查询。
    当 exists 中的 where 后面条件为真的时候则把前面select 的内容显示出来(外表的select ).

    这样的话,in适合内外表都很大的情况,exists适合外表结果集很小的情况。

 

---------------------------------------------------------------------------------------------------------------------------------

in和exists
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表)

1:

select * from A where cc in (select cc from B) 效率低,用到了A表上cc列的索引;

select * from A where exists(select cc from B where cc=A.cc) 效率高,用到了B表上cc列的索引。
相反的2:

select * from B where cc in (select cc from A) 效率高,用到了B表上cc列的索引;

select * from B where exists(select cc from A where cc=B.cc) 效率低,用到了A表上cc列的索引。


not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
in 与 =的区别
select name from student where name in ('zhang','wang','li','zhao');

select name from student where name='zhang' or name='li' or name='wang' or name='zhao'
的结果是相同的。

分享到:
评论

相关推荐

    oracle中exists_和in的效率问题详解

    Oracle 中 EXISTS 和 IN 的效率问题详解 EXISTS 和 IN 都是 Oracle 中的集合操作符,但它们在使用和执行效率上有所不同。本文将深入探讨 EXISTS 和 IN 的使用场景、执行机制和效率问题。 EXISTS 的使用场景和机制 ...

    SQL里的EXISTS与IN

    在SQL查询语言中,`EXISTS` 和 `IN` 子句都是非常常用且重要的操作符,它们被广泛应用于复杂的查询条件中,特别是当需要检查某个子查询是否返回结果时。根据给定的信息,本文将详细解析`EXISTS`与`IN`的区别以及如何...

    in和exists的区别与执行效率问题解析

    标题和描述均聚焦于SQL查询语句中"IN"与"EXISTS"的区别及执行效率问题,这是一个在数据库操作中非常关键的话题,尤其对于优化查询性能有着不可忽视的作用。下面,我们将深入探讨这两种语句的不同之处及其对执行效率...

    简述Oracle中in和exists的不同

    且看接下来的具体分析:in其实是将外表和内表进行hash join,exists是先对外表进行loop操作,然后每次loop后再对内表进行查询。 如果两张表大小差不多,那么exists和in的效率差不多。 例如: 一张大表为A,一张小表B...

    MySQL exists 和in 详解及区别

    MySQL中的`EXISTS`和`IN`都是在SQL查询中用来检查特定条件是否存在的子查询操作符,但它们的工作方式和适用场景有所不同。下面将详细解释这两个操作符的用法和区别。 ### `EXISTS`操作符 `EXISTS`主要用于判断子...

    in和exists的区别

    在Oracle数据库中,"IN"和"EXISTS"都是用于查询某个集合的元素是否存在于另一个集合中的关键字。然而,它们在处理数据时的效率和适用场景有所不同,这主要取决于涉及的数据量以及表之间的关联。 首先,让我们来看看...

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

    在查询中,我们可以使用EXISTS和NOT EXISTS来代替IN和NOT IN。例如,我们要查询Sendorder表中的冗余数据(没有和reg_person或worksite相连的数据): ```sql select Sendorder.id, Sendorder.reads, Sendorder....

    sql中exists的用法

    在 SQL 中,in 和 exists 的使用场景可以互换,但是在某些情况下,exists 的效率可能要高于 in。例如: ```sql SELECT ID, NAME FROM A WHERE ID IN (SELECT AID FROM B); ``` 这个查询将返回表 A 中所有与表 B 相...

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

    IN、EXISTS、NOT IN、NOT EXISTS 是 SQL 中四种常用的条件判断运算符,它们之间的区别主要体现在使用场景、执行效率和语法结构上。 IN IN 是一种条件判断运算符,用于判断某个值是否存在于一个列表中。其基本语法...

    SQL SERVER中关于exists 和 in的简单分析

    在SQL Server中,`EXISTS` 和 `IN` 是两种常用的子查询操作符,用于比较一个查询结果是否与另一个查询结果相匹配。虽然它们在功能上相似,但在性能和优化方面存在一些差异,这在大数据处理时尤其显著。 1. **EXISTS...

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

    - 在某些情况下,可以考虑使用 `EXISTS` 或 `NOT EXISTS` 来替代 `IN` 和 `NOT IN`,以提高查询效率。 #### 三、左连接、右连接与全连接 除了上述几种查询方式之外,SQL 还提供了不同的连接类型来处理不同情况下...

    sql case when exists not exists in not in

    在SQL查询中,`CASE WHEN`、`EXISTS`、`NOT EXISTS`以及`IN`和`NOT IN`是常用的操作符,它们用于处理复杂的条件判断和数据筛选。这些概念对于理解和编写高效的SQL语句至关重要,尤其是在数据分析和数据库管理中。 `...

    SQL中exists的用法[借鉴].pdf

    EXISTS 和 IN 都可以用于判断子查询的结果,但是它们的使用场景不同。 IN 子句只能返回一个字段,而 EXISTS 子句可以返回多个字段。例如: `SELECT name FROM student WHERE sex = 'm' AND mark IN (SELECT 1,2,3 ...

    exists的使用(查询选择了所有课程的学生信息)归纳.pdf

    EXISTS 和 IN 语句在 SQL 查询中的应用 EXISTS 语句是 SQL 中的一种子查询语句,用于判断是否存在满足条件的记录。它通常用于关联查询,判断主查询结果是否存在于子查询结果中。EXISTS 语句的基本语法为:`SELECT *...

    in和exists性能解析

    在数据库查询语言中,`IN` 和 `EXISTS` 子句是两种常见的用于关联两个表的方法,它们各自有其独特的性能特点和适用场景。本文将深入解析Oracle中`IN`与`EXISTS`的性能差异,以及如何根据具体需求选择最合适的查询...

    “exists”和“in”的效率问题

    ### "Exists"与"In"的效率问题详解 #### 引言 在数据库查询语言SQL中,“Exists”与“In”是两种常用的子查询方法,它们在实际应用中各有优势与局限。本文将深入探讨这两种方法的工作原理、应用场景以及性能差异,...

    sql exists和not exists用法

    这是因为`IN`和`NOT IN`需要将主查询中的每一行都与子查询结果进行比较,而`EXISTS`和`NOT EXISTS`则只需判断子查询是否返回至少一行数据即可,无需获取所有数据行。 **性能对比:** - **IN 和 NOT IN**:需要将主...

    QL中exists 与 in_的比较

    在数据库查询语言QL中,`exists`与`in_`(通常写作`IN`)是两种常见的用于子查询的语法结构,它们各自有着独特的应用场景和性能表现。理解这两种语法的区别对于优化查询效率至关重要。 ### `exists`与`in_`的基本...

Global site tag (gtag.js) - Google Analytics