以下内容借鉴过来的!
今天在网上查资料看sql中exist与in 的区别,发现众说纷纭,有几种说法:
1. exist效率比in高,凡是in都应该用exist替换
2. 外大内小用in,外小内大用exist
3. 外大内小用exist,外小内大用in
一时分辨不了哪个正确,于是动手检验.
数据库: ORACLE 10G
客户端: PlSqlDev 7.1
1. 外大内小的情况:
history.tb_stk_cap_chg 记录数 > 100,000,000
history.tb_stk_cap_chg_test 记录数 = 20
--使用in
select count(*)
from history.tb_stk_cap_chg a
where a.tradedate = '20060712'
and a.br_serial_no in
(select b.br_serial_no from history.tb_stk_cap_chg_test b)
1 row selected in 21.188 seconds
--使用exists
select count(*)
from history.tb_stk_cap_chg a
where a.tradedate = '20060712'
and exists (select null
from history.tb_stk_cap_chg_test b
where a.br_serial_no = b.br_serial_no)
1 row selected in 0.5 seconds
可以看出外大内小用in效率极低,用exists效率很高
2. 外小内大的情况:
history.tb_stk_cap_chg 记录数 > 100,000,000
history.tb_stk_cap_chg_test 记录数 = 1,000,000
--使用in
select count(*)
from history.tb_stk_cap_chg_test a
where a.br_serial_no in
(select b.br_serial_no from history.tb_stk_cap_chg b)
1 row selected in 9.187 seconds
--使用exists
select count(*)
from history.tb_stk_cap_chg_test a
where exists (select null
from history.tb_stk_cap_chg b
where a.br_serial_no = b.br_serial_no)
1 row selected in 10.359 seconds
注: 当history.tb_stk_cap_chg_test 记录数 < 1,000,000时得出的时间差别很小,不容易判断
可以看出外小内大时使用in比exists效率更高
----------------------------------------------------------------------------------
在改变history.tb_stk_cap_chg_test记录数(10-1,000,000)进行测试(>5次)得出的结论与上述结论符合,在此不一一列出
由此得出结论: exits适合内小外大的查询,in适合内大外小的查询
----------------------------------------------------------------------------------
附上一篇觉得正确的文章,欢迎探讨:
in 和 exists也是很好区别的.
in 是一个集合运算符.
a in {a,c,d,s,d....}
这个运算中,前面是一个元素,后面是一个集合,集合中的元素类型是和前面的元素一样的.
而exists是一个存在判断,如果后面的查询中有结果,则exists为真,否则为假.
in 运算用在语句中,它后面带的select 一定是选一个字段,而不是select *.
比如说你要判断某班是否存在一个名为"小明"的学生,你可以用in 运算:
"小明" in (select sname from student)
这样(select sname from student) 返回的是一个全班姓名的集合,in用于判断"小明"是否为此集合中的一个数据;
同时,你也可以用exists语句:
exists (select * from student where sname="小明")
这两个涵数是差不多的, 但是由于优化方案的不同, 通常NOT EXISTS要比NOT IN 要快, 因为NOT EXISTS可以使用结合算法而NOT IN 就不行了,而EXISTS则不如IN快, 因为这时候IN可能更多的使用结合算法.
select * from 表A where exists(select * from 表B where 表B.id=表A.id)
这句相当于
select * from 表A where id in (select id from 表B)
对于表A的每一条数据,都执行select * from 表B where 表B.id=表A.id的存在性判断,如果表B中存在表A当前行相同的id,则exists为真,该行显示,否则不显示
exits适合内小外大的查询,in适合内大外小的查询
IN
确定给定的值是否与子查询或列表中的值相匹配。
EXISTS
指定一个子查询,检测行的存在。
比较使用 EXISTS 和 IN 的查询
这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相同的信息。
USE pubs
GO
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')
GO
-- Or, using the IN clause:
USE pubs
GO
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHERE type = 'business')
GO
下面是任一查询的结果集:
pub_name
----------------------------------------
Algodata Infosystems
New Moon Books
(2 row(s) affected)
exits 相当于存在量词:表示集合存在,也就是集合不为空只作用一个集合.例如 exist P 表示P不空时为真; not exist P表示p为空时 为真 in表示一个标量和一元关系的关系。例如:s in P表示当s与P中的某个值相等时 为真; s not in P 表示s与P中的每一个值都不相等时 为真
分享到:
相关推荐
标题和描述均聚焦于SQL语言中“IN”和“EXISTS”的区别,这是数据库查询语言中两种常用的子查询处理方式,它们在功能上虽然相似,但在执行效率、索引使用以及适用场景上存在显著差异。 ### IN关键字 “IN”主要...
"SQL中对not in和not exist查询的替代算法.pdf" 本文主要讨论了SQL中对not in和not exist查询的替代算法。首先,作者简要介绍了SQL语言的基本概念和特点,然后讨论了not in和not exist查询的低效性及其原因。接着,...
本文将深入探讨 SQL 中 `EXISTS`, `NOT EXISTS`, `IN`, `NOT IN` 的使用场景及效率问题。 #### 一、Exists 和 Not Exists 的效率说明 **Exists** 和 **Not Exists** 子句通常用于检查子查询是否返回任何行,它们...
IN、EXISTS、NOT EXISTS、NOT IN 在 SQL 语句中的应用和区别 IN 语句和 EXISTS 语句都是 SQL 语句中用来判断是否存在某个值的语句,但是它们的实现机制和应用场景是不同的。 IN 语句是通过 hash 连接来实现的,它...
在WinCC中,VBScript可以用来编写用户自定义的逻辑,比如与外部系统通信,如SQL Server数据库。 要连接到SQL Server,我们需要使用ADODB对象模型,它包含了Connection、Command、Recordset等组件。在VBScript中,...
SQL语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句 SQL语句优化是数据库性能优化的重要方面之一。在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下,使用EXISTS...
`EXISTS`和`IN`的区别在于,`IN`通常用于比较单个字段值,而`EXISTS`可以处理更复杂的查询,它关心的是子查询是否返回行,而不关心返回的具体值。`IN`通常用于获取特定值列表内的记录,而`EXISTS`则可以用于检查记录...
IN和EXIST语句是MySQL数据库中常用的语句。IN语句用于判断某个值是否在一个集合中,而EXIST语句用于判断某个子查询是否存在记录。IN和EXIST语句的使用可以提高数据库的性能和效率。 四、LIMIT语句 LIMIT语句是...
静态SQL 与动态SQL277 使用SQL 来编程279 总结280 问与答280 校练场280 练习281 第14 天动态使用SQL 282 目标282 快速入门282 ODBC 282 Personal Oracle 7283 InterBase SQL ISQL 283 Visual C++ 284 Delphi284 设置...
在SQL Server中,`EXISTS` 和 `IN` 是两种常用的子查询操作符,用于比较一个查询结果是否与另一个查询结果相匹配。虽然它们在功能上相似,但在性能和优化方面存在一些差异,这在大数据处理时尤其显著。 1. **EXISTS...
1. 尽量少用嵌套查询,使用 not exist 代替 not in 子句。 2. 用多表连接代替 EXISTS 子句。 3. 少用 DISTINCT,用 EXISTS 代替。 4. 使用 UNION ALL、MINUS、INTERSECT 提高性能。 5. 使用 ROWID 提高检索速度。 6....
SQL Server 2008 的安装过程中可能会遇到 MOF 语法错误,这种错误通常是由于 WMI(Windows Management Instrumentation)无法正常运行所引起的。WMI 是一个提供对系统管理和监控的功能的组件,它可以帮助管理员对...
在WHERE IN语句中,可以使用`exist()`来判断XML中的某节点文本(例如`UserID`)是否与表中的`UserID`字段相等。例如: ```sql SELECT * FROM Users WHERE @xml.exist('/root/UserID[text()=sql:column("UserID")]...
SQL EXISTS 运算符是SQL查询中的一种重要条件,它用于检查子查询是否至少返回一行数据。如果子查询返回至少一条记录,EXISTS 运算符返回True,否则返回False。这种运算符常用于筛选满足特定条件的记录,特别是在联合...
- **SQL语句**:`SELECT relname, n.amname AS index_type FROM sys_class m, sys_am n WHERE m.relam = n.oid AND m.oid IN (SELECT b.indexrelid FROM sys_class a, sys_index b WHERE a.oid = b.indrelid AND a....
1. 尽量少用嵌套查询,如必须,请用 not exist 代替 not in 子句。 2. 用多表连接代替 EXISTS 子句。 3. 少用 DISTINCT,用 EXISTS 代替。 4. 使用 UNION ALL、MINUS、INTERSECT 提高性能。 5. 使用 ROWID 提高检索...
这些SQL语句可以使用所有与DBMS有关的子句和保留字,如在SELECT命令中使用LIKE、BETWEEN、IN、EXIST、ANY、ALL、IS NULL等搜索条件,在INSERT、UPDATE、DELETE命令中使用子查询,在表达式中使用DBMS特定的内部函数等...