- 浏览: 535323 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (377)
- J2EE (61)
- ORACLE (36)
- JS (15)
- EXT (0)
- win7 (12)
- TOMCAT (10)
- game (1)
- ie (5)
- etc (8)
- ibatis (3)
- ORACLE 客户端 (1)
- bat (3)
- 健康 (127)
- baby (4)
- html (12)
- myeclipse (16)
- 射手 字幕默认下载 位置 (1)
- office (0)
- car (2)
- xxx (1)
- python简介 (1)
- FusionCharts (1)
- dorado (4)
- english (3)
- weblogic (3)
- request/servlet (3)
- wsdl (1)
- offie2010 visio2010 下载 (1)
- nexus5 (0)
- chrome (3)
- ssi (2)
- 安卓 (3)
- nexus ipad (1)
- mysql (4)
- json (3)
- struts (6)
- datagrid (1)
- highcharts (1)
- tools (2)
- tool (1)
- spring3 (1)
- jedit (1)
- java (4)
- windows (1)
- easyui (2)
- 液晶显示器色温 (1)
- mybatis (1)
- where (1)
- sublime (1)
- spring4 (3)
最新评论
-
spring_springmvc:
如何在java Web项目中开发WebService接口,地址 ...
java 调用WebService服务接口 -
chenzheng8975:
阅
人生三大陷阱 -
ygbb007:
直接OD就能破解的
myBase Desktop 6.0 破解方法 -
lanlansnss:
直接删除nyfedit.ini文件即可
myBase Desktop 6.0 破解方法 -
yunzhu:
LZ写博客不太注重排版啊,排版不行别人没法看的
PermGen space
有两个简单例子,以说明 “exists”和“in”的效率问题
Java代码
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) 的查询效率高。
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)句中的有颜色字体的部分 ,理解其含义;
其中 Java代码
“select 1 from T2 where T1.a=T2.a”
“select 1 from T2 where T1.a=T2.a”相当于一个关联表查询,相当于
Java代码
“select 1 from T1,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 的用法:
继续引用上面的例子
Java代码
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字段表达的意义应该是一样的,否则这样查没什么意义。
打个比方:T1,T2表都有一个字段,表示工单号,但是T1表示工单号的字段名叫“ticketid”,T2则为“id”,但是其表达的意义是一样的,而且数据格式也是一样的。这时,用 2)的写法就可以这样:
Java代码
“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);
“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通常查询速度快的原因。
Java代码
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) 的查询效率高。
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)句中的有颜色字体的部分 ,理解其含义;
其中 Java代码
“select 1 from T2 where T1.a=T2.a”
“select 1 from T2 where T1.a=T2.a”相当于一个关联表查询,相当于
Java代码
“select 1 from T1,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 的用法:
继续引用上面的例子
Java代码
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字段表达的意义应该是一样的,否则这样查没什么意义。
打个比方:T1,T2表都有一个字段,表示工单号,但是T1表示工单号的字段名叫“ticketid”,T2则为“id”,但是其表达的意义是一样的,而且数据格式也是一样的。这时,用 2)的写法就可以这样:
Java代码
“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);
“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 werhe
2016-12-06 11:10 509SQL Select语句完整的执行 ... -
存储过程 的is与as,oracle存储过程大数据量insert
2016-03-24 09:42 937一直纠结于存储过程的is与as最近在网上查了巨多资料,总结如下 ... -
Oracle移植到mysql
2014-03-19 10:31 1577MYSQL远程连接速度慢的 ... -
oracle中long转varchar
2013-11-14 10:52 1835oracle中long转varchar 这个 ... -
racle数据字典dictionary
2013-11-14 10:49 1018了解Oracle数据字典dictionary 数据字典 ... -
SQLserver 解决dat/bak还原时的结构错误
2013-10-17 17:12 1301SQL2005精简版下载 & ... -
SEQ NEXTVAL CURRVAL
2013-09-17 15:20 1167SQL中取序列号的用法: SELECT SEQ_MENU_ME ... -
存储过程
2013-07-10 16:46 918带有无参数的存储过程 SQL中调用存储过程语句:call p ... -
viso反向工程
2013-07-02 09:47 1028... -
sql数据类型
2013-06-04 09:05 920... -
spring中常见的3种数据源的配置
2013-06-01 14:53 1504我在这里简单的介绍一下关于spring中常见的3种数据源的配置 ... -
ORACLE 毫秒转换为日期 日期转换毫秒
2013-05-13 10:49 1181ORACLE 毫秒转换为日期 日期转换毫秒 转自 http: ... -
ORACLE_毫秒转换为日期_日期转换毫秒
2013-05-08 11:17 957... -
Connect By、Level、Start With的使用(Hierarchical query-层次查询)
2013-04-08 11:57 1034... -
商业智能的实施步骤
2013-03-30 15:20 954... -
int number
2013-03-29 15:08 797建表的时候,如果是浮点数,一般设置为 number(m,n ) ... -
in select
2013-03-29 09:31 964UPDATE mytable SET node_in ... -
商业智能的实施步骤 数据仓库
2013-03-15 16:12 899商业智能的实施步骤 数据仓库的特点 1、面向主题 ... -
Null值
2013-03-12 11:25 939有人总结了数据库中Null ... -
Oracle的update语句优化研究
2013-01-09 15:24 1050...
相关推荐
Oracle 中 EXISTS 和 IN 的效率问题详解 EXISTS 和 IN 都是 Oracle 中的集合操作符,但它们在使用和执行效率上有所不同。本文将深入探讨 EXISTS 和 IN 的使用场景、执行机制和效率问题。 EXISTS 的使用场景和机制 ...
尽管`IN`和`EXISTS`在功能上看似相似,但在执行效率和适用场景上有明显的不同。`EXISTS`因其能够更早终止查询的特性,在大多数情况下提供了更好的性能,尤其是在处理大数据量时。然而,具体选择哪种语句,还需根据...
本文将深入探讨 SQL 中 `EXISTS`, `NOT EXISTS`, `IN`, `NOT IN` 的使用场景及效率问题。 #### 一、Exists 和 Not Exists 的效率说明 **Exists** 和 **Not Exists** 子句通常用于检查子查询是否返回任何行,它们...
然而,它们在处理数据时的效率和适用场景有所不同,这主要取决于涉及的数据量以及表之间的关联。 首先,让我们来看看"EXISTS"的用法。"EXISTS"子句通常与一个子查询一起使用,它并不关心子查询返回的具体值,而是...
在SQL查询语言中,`EXISTS` 和 `IN` 子句都是非常常用且重要的操作符,它们被广泛应用于复杂的查询条件中,特别是当需要检查某个子查询是否返回结果时。根据给定的信息,本文将详细解析`EXISTS`与`IN`的区别以及如何...
IN、EXISTS、NOT IN、NOT EXISTS 是 SQL 中四种常用的条件判断运算符,它们之间的区别主要体现在使用场景、执行效率和语法结构上。 IN IN 是一种条件判断运算符,用于判断某个值是否存在于一个列表中。其基本语法...
在SQL查询中,`CASE WHEN`、`EXISTS`、`NOT EXISTS`以及`IN`和`NOT IN`是常用的操作符,它们用于处理复杂的条件判断和数据...通过不断地实践和优化,能够编写出更高效、更灵活的SQL查询,提升数据库管理的效率和质量。
使用EXISTS和NOT EXISTS可以提高查询的效率,避免了使用NOT IN和IN的低效率。同时,EXISTS和NOT EXISTS也可以使查询语句变得更加简洁和易于理解。 总结 本文探讨了使用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句...
在数据库查询语言中,`IN` 和 `EXISTS` 子句是两种常见的用于关联两个表的方法,它们各自有其独特的性能特点和适用场景。本文将深入解析Oracle中`IN`与`EXISTS`的性能差异,以及如何根据具体需求选择最合适的查询...
如果两张表大小差不多,那么exists和in的效率差不多。 例如: 一张大表为A,一张小表B 一、第一种情况 select * from A where mm in (select mm from B) 效率高,这里用到的是大表A上的索引 select * from B ...
MySQL中的`NOT IN`, `LEFT JOIN`, `IS NULL`, 和 `NOT EXISTS` 是四种不同的SQL查询方式,它们在特定情况下可以实现相似的功能,但实际执行效率可能会有很大差异。本文主要探讨这四种方法在处理大数据量时的性能表现...
相较于`IN`、`NOT IN`等操作,`EXISTS`与`NOT EXISTS`具有更高的效率,尤其是在处理大型数据集时。 #### EXISTS 介绍 `EXISTS`关键字用于检查子查询是否至少返回一行数据。如果子查询返回至少一行数据,则`EXISTS`...
在数据库查询语言QL中,`exists`与`in_`(通常写作`IN`)是两种常见的用于子查询的语法结构,它们各自有着独特的应用场景和性能表现。理解这两种语法的区别对于优化查询效率至关重要。 ### `exists`与`in_`的基本...
- 效率:在某些情况下,`EXISTS` 和 `NOT EXISTS` 可能会提供相似的性能,但通常 `IN` 和 `NOT IN` 比较操作符在处理大量数据时更有效。然而,当涉及到子查询时,`EXISTS` 和 `NOT EXISTS` 可能更合适,因为它们只...
- **效率问题**:相比`EXISTS`,`IN`可能需要返回所有的结果集来判断左侧的值是否存在于右侧的集合中。因此,在处理大数据量的情况下,`IN`可能会比`EXISTS`慢。 **示例应用** 1. **查找特定出版社出版的书籍**: ...
在SQL查询中,`EXISTS`和`NOT EXISTS`是两个非常重要的子查询操作符,它们主要用于判断子查询是否返回结果。本篇文章将详细介绍这两个关键字的用法,并...理解和熟练运用这些操作符,能够提高SQL查询的效率和灵活性。
然而,它的执行效率通常不如使用NOT EXISTS或NOT IN,特别是在右表记录较少的情况下。 #### 总结 从以上分析可以看出,每种查询方式都有其适用场景,并不存在绝对的“好”或“坏”。选择哪种方式取决于具体的应用...
PostgreSQL作为一种强大的开源关系数据库系统,它支持多种SQL操作,其中包括IN、EXISTS、ANY/ALL和JOIN等操作符。这些操作符在不同的业务场景下有着不同的表现和性能影响。在实际的数据库操作中,选择合适的操作符是...