`

oracle exists 和not exists 用法详解

 
阅读更多
有两个简单例子,以说明 “exists”和“in”的效率问题
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
    T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。
2) select * from T1 where T1.a in (select T2.a from T2) ;
     T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。


exists 用法:
请注意 1)句中的有颜色字体的部分 ,理解其含义;
其中 “select 1 from T2 where T1.a=T2.a” 相当于一个关联表查询,相当于
“select 1 from T1,T2     where T1.a=T2.a”
但是,如果你当当执行 1) 句括号里的语句,是会报语法错误的,这也是使用exists需要注意的地方。
“exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。
因此“select 1”这里的 “1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这 1) 句的where 条件成立。

in 的用法:
继续引用上面的例子
“2) select * from T1 where T1.a in (select T2.a from T2) ”
这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,T1和T2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。
打个比方:T1,T2表都有一个字段,表示工单号,但是T1表示工单号的字段名叫“ticketid”,T2则为“id”,但是其表达的意义是一样的,而且数据格式也是一样的。这时,用 2)的写法就可以这样:
“select * from T1 where T1.ticketid in (select T2.id from T2) ”
Select name from employee where name not in (select name from student);
Select name from employee where not exists (select name from student);
第一句SQL语句的执行效率不如第二句。
通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因。



分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

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

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

    oracle数据库关于exists使用

    ### Oracle数据库中Exists与In的使用详解 #### 一、Exists 的使用方法 在Oracle数据库中,`EXISTS` 是一种常用的子查询操作符,用于判断子查询是否有结果返回。如果子查询至少返回一行数据,则 `EXISTS` 表达式的...

    oracle中not exists对外层查询的影响详解

    1. 使用`EXISTS`的反面:在某些情况下,`EXISTS`和`NOT EXISTS`可以互换,但`EXISTS`通常在处理空子查询时更有效。 2. 使用`IN`或`NOT IN`:对于简单的条件,`IN`或`NOT IN`子句可能会更高效,尤其是当子查询返回...

    Oracle语句规划详解

    使用NOT EXISTS代替NOT IN可以提高效率。 - **示例**:查询没有订单的客户信息: - 低效:`SELECT * FROM CUSTOMER WHERE CUST_ID NOT IN (SELECT CUST_ID FROM ORDER)` - 高效:`SELECT * FROM CUSTOMER WHERE ...

    oracle数据泵详解

    ### Oracle 数据泵详解 #### 一、EXPDP和IMPDP使用说明 Oracle Database 10g引入了数据泵(Data Pump)技术,这是一种用于在Oracle数据库间高效传输数据的新技术。数据泵技术主要包括两个工具:EXPDP(Export Data...

    oracle 数据泵详解

    oracle数据泵详解 Oracle 数据泵是 Oracle 10g 以后引入的一种数据迁移工具,可以方便我们把低版本的数据库数据向高版本的数据库迁移。下面是 Oracle 数据泵的详细介绍。 一、EXPDP 和 IMPDP 使用说明 EXPDP...

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

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

    oracle初始化参数详解

    11. **control_files**:指定控制文件的路径,Oracle建议使用多个文件进行镜像以增加可靠性。 12. **core_dump_dest**:在Unix环境下,设定核心转储文件的存储位置。 13. **cpu_count**:Oracle用于计算其他参数的...

    oracle函数详解[收集].pdf

    Oracle函数详解涵盖了从基础操作到复杂查询的各个方面,理解和熟练运用这些函数和操作对于有效管理Oracle数据库至关重要。无论是数据查询、数据更新还是数据统计,都有相应的SQL语句和函数支持,使得数据处理变得...

    oracle性能优化技巧

    - `NOT IN`可能导致全表扫描,而`NOT EXISTS`则不会,因此在大多数情况下推荐使用`NOT EXISTS`。 13. **使用EXISTS代替子查询**: - 与普通的子查询相比,使用`EXISTS`可以减少查询的复杂度和提高性能。 14. **...

    oracle函数详解

    根据提供的文件内容,可以看出文档主要涉及的是Oracle SQL的基础语法与函数使用详解。下面将对文档中的各个知识点进行详细的解释和扩展。 ### Oracle SQL基础语法与函数详解 #### 1. 基本运算符 在Oracle SQL中,...

    Oracle高级sql学习与练习

    2. EXISTS和NOT EXISTS子句通常用于子查询中,用以判断子查询返回的结果集是否为空。EXISTS子句在找到至少一条符合条件的记录时就会返回TRUE,而不关心具体有多少条符合条件的记录;相反,NOT EXISTS子句则用于判断...

    oracle导入导出详解

    本篇文章将详细讲解Oracle数据库的导入导出操作,包括使用工具、基本流程、参数设置以及常见问题处理。 一、Oracle导入导出工具 Oracle提供了两个主要的实用程序来实现数据的导入导出:`expdp`(Export Data Pump)...

    Oracle数据库备份恢复Data Pump Expdp-Impdp参数详解与案例介绍.pdf

    Oracle数据库备份恢复是数据库管理员必须掌握的关键技能之一,它保障了企业数据的安全性与业务的连续性。...此外,对于关键业务的数据,还应考虑使用Oracle提供的RMAN工具来完成更为全面和安全的备份与恢复。

    ORACLE 物化视图 详解

    ### ORACLE 物化视图详解 #### 一、物化视图概述 在Oracle数据库中,物化视图(Materialized View)是一种特殊的数据库对象,它存储的是一个查询的结果集,可以理解为一个预计算的快照。物化视图主要用于提高报表...

    Oracle通配符,运算符的使用

    ### Oracle通配符与运算符的使用详解 #### 一、引言 Oracle数据库系统是全球最流行的数据库管理系统之一,其强大的数据管理能力和灵活的数据处理功能使其成为企业和组织中的核心工具。本文旨在深入探讨Oracle数据库...

    oracle操作文档

    ### Oracle 查询优化基本准则详解 #### 一、引言 在数据库系统中,尤其是在大型企业级应用中,Oracle 数据库因其稳定性和强大的功能被广泛使用。然而,随着数据量的增长和业务复杂性的增加,如何有效地优化 Oracle ...

Global site tag (gtag.js) - Google Analytics