`

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需要注意的地方。

“existsxxx就表示括号里的语句能不能查出记录,它要查的记录是否存在。

因此“select 1”这里的 “1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这 1 句的where 条件成立。

in 的用法:

继续引用上面的例子

“2) select * from T1 where T1.a in (select T2.a from T2) ”

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

打个比方:T1T2表都有一个字段,表示工单号,但是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语句的执行效率不如第二句。

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

使用 NOT EXISTS 的子查询
NOT EXISTS 与 EXISTS 的工作方式类似,只是如果子查询不返回行,那么使用 NOT EXISTS 的 WHERE 子句会得到令人满意的结果。

例如,要查找不出版商业书籍的出版商的名称:

USE pubs
SELECT pub_name
FROM publishers
WHERE NOT EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')

下面是结果集:

pub_name
----------------------------------------
Binnet & Hardley
Five Lakes Publishing
Ramona Publishers
GGG&G
Scootney Books
Lucerne Publishing

(6 row(s) affected)

下面的查询查找已经不销售的书的名称。

USE pubs
SELECT title
FROM titles
WHERE NOT EXISTS
(SELECT title_id
FROM sales
WHERE title_id = titles.title_id)

下面是结果集:

title
----------------------------------
The Psychology of Computer Cooking
Net Etiquette

(2 row(s) affected)

分享到:
评论

相关推荐

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

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

    oracle数据库关于exists使用

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

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

    在Oracle数据库中,`NOT EXISTS` 子句常用于查询中,以排除某些特定条件的记录。然而,它对查询性能的影响可能并不总是直观的,尤其是在涉及到外层查询时。本文将深入探讨`NOT EXISTS`如何影响外层查询,并通过示例...

    Oracle语句规划详解

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

    oracle数据泵详解

    - **EXP 和 IMP**:这是在Oracle 10g之前的版本中使用的工具,它们既可以作为客户端工具使用,也可以在服务器端使用。 - **EXPDP 和 IMPDP**:这些工具仅能在Oracle服务器端使用,无法在客户端运行。 - **兼容性**:...

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

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

    oracle 数据泵详解

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

    oracle函数详解[收集].pdf

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

    oracle初始化参数详解

    Oracle初始化参数是数据库管理系统Oracle中用来配置数据库运行特性的关键元素。这些参数定义了数据库的行为,包括内存管理、性能优化、安全策略、备份与恢复、并发处理等方面。下面是对一些重要参数的详细解释: 1....

    oracle性能优化技巧

    ### Oracle性能优化技巧详解 #### 一、Oracle优化器模式 在Oracle数据库中,优化器是决定查询执行计划的关键组件,其目标是最小化资源消耗并最大化查询性能。Oracle提供了三种主要的优化器模式:基于规则(RULE)...

    Oracle高级sql学习与练习

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

    oracle函数详解

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

    Oracle中常用的通配符

    通过本文,我们将详细介绍Oracle中常见的通配符及其用法,帮助读者更好地理解和运用这些符号,从而提高SQL查询的灵活性和效率。 #### 一、通配符概述 在Oracle SQL中,通配符主要用于`LIKE`操作符中,用于模糊查询...

    Oracle通配符,运算符的使用

    本文详细介绍了Oracle数据库中常用的通配符和运算符,包括它们的定义、用法以及具体的应用示例。通过学习这些内容,您可以更加熟练地进行数据检索和处理,从而提高工作效率。希望本文能够帮助您更好地理解和掌握...

    ORACLE 物化视图 详解

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

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

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

    oracle导入导出详解

    总结,Oracle的导入导出功能强大且灵活,通过掌握Data Pump工具的使用,能够高效地管理数据库中的数据。在实际操作中,应结合具体需求,合理设置参数,确保数据迁移的顺利进行。同时,了解并解决可能出现的问题,有...

Global site tag (gtag.js) - Google Analytics