In和Exists的区别
- 格式:doc
- 大小:27.50 KB
- 文档页数:2
SQL查询中in和exists的区别分析select * from A where id in (select id from B);select * from A where exists (select 1 from B where A.id=B.id);对于以上两种情况,in是在内存⾥遍历⽐较,⽽exists需要查询数据库,所以当B表数据量较⼤时,exists效率优于in。
1、select * from A where id in (select id from B);它的查询过程类似于以下过程:复制代码代码如下:List resultSet={};Array A=(select * from A);Array B=(select id from B);for(int i=0;i<A.length;i++) {for(int j=0;j<B.length;j++) {if(A[i].id==B[j].id) {resultSet.add(A[i]);break;}}}return resultSet;如:A表有10000条记录,B表有1000000条记录,那么最多有可能遍历10000*1000000次,效率很差。
再如:A表有10000条记录,B表有100条记录,那么最多有可能遍历10000*100次,遍历次数⼤⼤减少,效率⼤⼤提升。
2、select * from A where exists (select 1 from B where A.id=B.id);它的查询过程类似于以下过程:复制代码代码如下:List resultSet={};Array A=(select * from A);for(int i=0;i<A.length;i++) {if(exists(A[i].id) { //执⾏select 1 from B where B.id=A.id是否有记录返回resultSet.add(A[i]);}}return resultSet;当B表⽐A表数据⼤时适合使⽤exists(),因为它没有那么多遍历操作,只需要再执⾏⼀次查询就⾏。
简述Oracle中in和exists的不同
⼀直以来,⼤家认为exists⽐in速度快,其实是不准确的。
且看接下来的具体分析:in其实是将外表和内表进⾏hash
join,exists是先对外表进⾏loop操作,然后每次loop后再对内表进⾏查询。
如果两张表⼤⼩差不多,那么exists和in的效率差不多。
例如:⼀张⼤表为A,⼀张⼩表B
⼀、第⼀种情况
select * from A where mm in (select mm from B)
效率⾼,这⾥⽤到的是⼤表A上的索引
select * from B exists (select mm from A where mm=B.mm)
效率⾼,这⾥⽤到的是⼩表B上的索引
⼆、第⼆种情况
select * from B where mm in (select mm from A)
效率低,这⾥⽤到的是⼩表B上的索引
select * from A exists (select mm from B where mm=A.mm)
效率⾼,这⾥⽤到的是⼤表A上的索引
三、第三种情况
not exists 在使⽤时依然会⽤到表上的索引,但是not in会进⾏全盘扫描
因此,not exists 始终⽐not in 的效率⾼
四、第四种情况
in与==效果是相同的
总结
以上所述是⼩编给⼤家介绍的Oracle中in和exists的不同,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
在此也⾮常感谢⼤家对⽹站的⽀持!。
in和exists的区别“exists”和“in”是Oracle中,都是查询某集合的值是否存在在另一个集合,但对不同的数据有不同的用法,主要是在效率问题上存在很大的差别,以下有两个简单例子,以说明“exists”和“in”的效率问题。
1、select * from Table1 where exists(select 1 from Table2 where Table1.a=Table2.a) ; Table1数据量小而Table2数据量非常大时,Table1<<Table2 时,1、的查询效率高。
2、select * from Table1 where Table1.a in (select Table2.a from Table2) ;Table1数据量非常大而Table2数据量小时,Table1>>Table2 时,2、的查询效率高。
详细解释下“exists”和“in”的用法exists 用法:请注意1、,理解其含义;其中“select 1 from Table2 where Table1.a=Table2.a”相当于一个关联表查询,相当于“select 1 from Table1,Table2 where Table1.a=Table2.a”但是,如果你单单执行1、句括号里的语句,是会报语法错误的,这也是使用exists需要注意的地方。
“exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。
因此“select 1”这里的“1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这1、句的where 条件成立。
in 的用法:继续引用上面的例子“2、select * from Table1 where Table1.a in (select Table2.a from Table2) ”这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,Table1和Table2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。
SQL中exist与in的区别in 是一个集合运算符.a in {a,c,d,s,d....} P105例子这个运算中,前面是一个元素,后面是一个集合,集合中的元素类型是和前面的元素一样的.而exists是一个存在判断,如果后面的查询中有结果,则exists为真,否则为假.in 运算用在语句中,它后面带的select 一定是选一个字段,而不是select *.比如说你要判断某班是否存在一个名为"小明"的学生,你可以用in 运算:"小明" in (select sname from student)这样(select sname from student) 返回的是一个全班姓名的集合,in用于判断"小明"是否为此集合中的一个数据;同时,你也可以用exists语句:exists (select * from student where sname="小明")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为真,该行显示,否则不显示区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
表AID NAME1 A12 A23 A3表BID AID NAME1 1 B12 2 B23 2 B3表A和表B是1对多的关系 A.ID => B.AIDSELECT ID,NAME FROM A WHERE EXIST (SELECT * FROM B WHERE A.ID=B.AID)执行结果为1 A12 A2原因可以按照如下分析SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1)--->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)--->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)--->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据NOT EXISTS 就是反过来SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)执行结果为3 A3例子查询选修了全部课程的学生姓名。
MySQL中in与exists的使⽤及区别介绍先放⼀段代码for(int i=0;i<1000;i++){for(int j=0;j<5;j++){System.out.println("hello");}}for(int i=0;i<5;i++){for(int j=0;j<1000;j++){System.out.println("hello");}}分析以上代码可以看到两⾏代码除了循环的次序不⼀致意外,其他并⽆区别,在实际执⾏时两者所消耗的时间和空间应该也是⼀致的。
但是这仅仅是在Java中,现在我们转化⼀下情景,最外层循环是数据库中的连接操作,内层循环为查找操作,那么现在两次的结果将相差巨⼤。
之所以出现这样的原因是数据库的特点决定的,数据库中相⽐较于查询操作⽽⾔,建⽴连接是更消耗资源的。
第⼀段代码建⽴了1000次连接,每⼀次连接却只做了5次查询,显然是很浪费的。
因此在我们对数据库进⾏操作时需要遵循的操作应当是⼩表驱动⼤表(⼩的数据集驱动⼤的数据集)。
in与exists表结构tbl_emp为员⼯表,deptld为部门id。
tbl_dept为部门表。
员⼯表中含有客⼈,其deptld字段为-1mysql> desc tbl_emp;+--------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+----------------+| id | int(11) | NO | PRI | NULL | auto_increment || name | varchar(20) | YES | | NULL | || deptld | int(11) | YES | MUL | NULL | |+--------+-------------+------+-----+---------+----------------+3 rows in set (0.00 sec)mysql> desc tbl_dept;+----------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+----------+-------------+------+-----+---------+----------------+| id | int(11) | NO | PRI | NULL | auto_increment || deptName | varchar(30) | YES | MUL | NULL | || locAdd | varchar(40) | YES | | NULL | |+----------+-------------+------+-----+---------+----------------+3 rows in set (0.01 sec)我们知道对于⼀个公司⽽⾔相对于部门来说员⼯数要多得多。
对⽐分析MySQL语句中的IN和Exists背景介绍最近在写SQL语句时,对选择IN 还是Exists 犹豫不决,于是把两种⽅法的SQL都写出来对⽐⼀下执⾏效率,发现IN的查询效率⽐Exists⾼了很多,于是想当然的认为IN的效率⽐Exists好,但本着寻根究底的原则,我想知道这个结论是否适⽤所有场景,以及为什么会出现这个结果。
⽹上查了⼀下相关资料,⼤体可以归纳为:外部表⼩,内部表⼤时,适⽤Exists;外部表⼤,内部表⼩时,适⽤IN。
那我就困惑了,因为我的SQL语句⾥⾯,外表只有1W级别的数据,内表有30W级别的数据,按⽹上的说法应该是Exists的效率会⽐IN⾼的,但我的结果刚好相反!!“没有调查就没有发⾔权”!于是我开始研究IN 和Exists的实际执⾏过程,从实践的⾓度出发,在根本上去寻找原因,于是有了这篇博⽂分享。
实验数据我的实验数据包括两张表:t_author表和 t_poetry表。
对应表的数据量:t_author表,13355条记录;t_poetry表,289917条记录。
对应的表结构如下:CREATE TABLE t_poetry (id bigint(20) NOT NULL AUTO_INCREMENT,poetry_id bigint(20) NOT NULL COMMENT '诗词id',poetry_name varchar(200) NOT NULL COMMENT '诗词名称',<font color=red> author_id bigint(20) NOT NULL COMMENT '作者id'</font>PRIMARY KEY (id),UNIQUE KEY pid_idx (poetry_id) USING BTREE,KEY aid_idx (author_id) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=291270 DEFAULT CHARSET=utf8mb4CREATE TABLE t_author (id int(15) NOT NULL AUTO_INCREMENT,author_id bigint(20) NOT NULL,</font>author_name varchar(32) NOT NULL,dynasty varchar(16) NOT NULL,poetry_num int(8) NOT NULL DEFAULT '0'PRIMARY KEY (id),<font color=red>UNIQUE KEY authorid_idx (author_id) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=13339 DEFAULT CHARSET=utf8mb4执⾏计划分析 IN 执⾏过程sql⽰例:select * from tabA where tabA.x in (select x from tabB where y>0 );其执⾏计划:(1)执⾏tabB表的⼦查询,得到结果集B,可以使⽤到tabB表的索引y;(2)执⾏tabA表的查询,查询条件是tabA.x在结果集B⾥⾯,可以使⽤到tabA表的索引x。
SQL 里的EXISTS与in、not exists与not in2011-01-07 10:01:25| 分类:sql | 标签:|字号大中小订阅系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not exists修改方法如下:in的SQL语句SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtimeFROM tab_oa_pub WHERE is_check=1 andcategory_id in (select id from tab_oa_pub_cate where no='1')order by begintime desc修改为exists的SQL语句SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtimeFROM tab_oa_pub WHERE is_check=1 andexists (select id from tab_oa_pub_cate where tab_oa_pub.category_id=convert(int,no) and no='1') order by begintime desc分析一下exists真的就比in的效率高吗?我们先讨论IN和EXISTS。
select * from t1 where x in ( select y from t2 )事实上可以理解为:select *from t1, ( select distinct y from t2 ) t2where t1.x = t2.y;——如果你有一定的SQL优化经验,从这句很自然的可以想到t2绝对不能是个大表,因为需要对t2进行全表的“唯一排序”,如果t2很大这个排序的性能是不可忍受的。
in和exists的区别与SQL执行效率in和exists的区别与SQL执行效率最近很多论坛又开始讨论in和exists的区别与SQL执行效率的问题,本文特整理一些in和exists的区别与SQL执行效率分析SQL中in可以分为三类:1、形如select * from t1 where f1 in ('a','b'),应该和以下两种比较效率select * from t1 where f1='a' or f1='b'或者select * from t1 where f1 ='a' union all select * from t1 f1='b'你可能指的不是这一类,这里不做讨论。
2、形如select * from t1 where f1 in (select f1 from t2 where t2.fx='x'),其中子查询的where里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成exist语句,也就是效率和exist一样。
3、形如select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx),其中子查询的where里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少,一般认为效率不如exists。
除了第一类in语句都是可以转化成exists 语句的SQL,一般编程习惯应该是用exi sts而不用in,而很少去考虑in和exists的执行效率.in和exists的SQL执行效率分析A,B两个表,(1)当只显示一个表的数据如A,关系条件只一个如ID时,使用IN更快:select * from A where id in (select id from B)(2)当只显示一个表的数据如A,关系条件不只一个如ID,col1时,使用IN就不方便了,可以使用EXISTS:select * from Awhere exists (select 1 from B where id = A.id and col1 = A.col1)(3)当只显示两个表的数据时,使用IN,EXISTS都不合适,要使用连接:select * from A left join B on id = A.id所以使用何种方式,要根据要求来定。
mysql中EXISTS和IN的使⽤⽅法⽐较1、使⽤⽅式:(1)EXISTS⽤法select a.batchName,a.projectId from ucsc_project_batch a where EXISTS (select b.id from ucsc_project b where a.projectId = b.id)上⾯这条SQL的意思就是:以ucsc_project_batch为主表查询batchName与projectId字段,其中projectId字段存在于ucsc_project表中。
EXISTS 会对外表ucsc_project_batch进⾏循环查询匹配,它不在乎后⾯的内表⼦查询的返回值是什么,只在乎有没有存在返回值,存在返回值,则条件为真,该条数据匹配成功,加⼊查询结果集中;如果没有返回值,条件为假,丢弃该条数据。
例如我们这⾥改变⼀下⼦查询的查询返回字段,并不影响外查询的查询结果:select a.batchName,a.projectId from ucsc_project_batch a where EXISTS (select panyId, from ucsc_project b where a.projectId = b.id)(2)IN⽤法select a.batchName,a.projectId from ucsc_project_batch a where a.projectId in (select b.id from ucsc_project b)上⾯这条SQL的查询结果与刚才的EXISTS的结果⼀样,查询的意思也⼀样。
2、注意点:(1)EXISTS写法需要注意⼦查询中的条件语句⼀般需要带上外查询的表做关联,不然⼦查询的条件可能会⼀直为真,或者⼀直为假,外查询的表进⾏循环匹配的时候,要么全部都查询出来,要么⼀条也没有。
select a.batchName,a.projectId from ucsc_project_batch a where EXISTS (select b.id from ucsc_project b)⽐如上述这种写法,由于ucsc_project 表存在值,⼦查询的条件⼀直为真,ucsc_project_batch 每条数据进⾏循环匹配的时候,都能匹配成功,查询出来的结果就成为了ucsc_project_batch整张表数据。
MySQL中的IN和EXISTS都是用于在子查询中测试条件的操作符,但它们的用法和性能特点有所不同。
1.IN操作符:IN用于在子查询中返回一个值的列表,并在主查询中测试该值是否在列表中。
语法如下:sqlSELECT column1, column2, ...FROM table1WHERE column_name IN (value1, value2, ...);例如,假设我们有一个名为orders的表,其中包含订单信息,我们想要查询订单状态为"shipped"的订单:sqlSELECT *FROM ordersWHERE status IN ('shipped', 'delivered');这将返回状态为"shipped"或"delivered"的所有订单。
2.EXISTS操作符:EXISTS用于测试子查询是否返回任何结果。
如果子查询返回至少一行结果,则EXISTS返回真(TRUE),否则返回假(FALSE)。
语法如下:sqlSELECT column1, column2, ...FROM table1WHERE EXISTS (subquery);例如,假设我们想要查询至少有一个订单的客户:sqlSELECT customer_nameFROM customersWHERE EXISTS (SELECT 1 FROM orders WHERE orders.customer_id = customers.customer_id);这将返回至少有一个订单的客户列表。
总结:IN用于测试值是否在给定的列表中,而EXISTS用于测试子查询是否返回任何结果。
选择使用IN还是EXISTS取决于具体的查询需求和数据结构。
数据库in和exists的用法数据库in和exists的用法的用法如下:SELECT DISTINCT MD001 FROM BOMMD WHERE MD001 NOT IN (SELECT MC001 FROM BOMMC)NOT EXISTS,exists的用法跟in不一样,一般都需要和子表进行关联,而且关联时,需要用索引,这样就可以加快速度select DISTINCT MD001 from BOMMD WHERE NOT EXISTS (SELECT MC001 FROM BOMMC where BOMMC.MC001 = BOMMD.MD001)exists是用来判断是否存在的,当exists(查询)中的查询存在结果时则返回真,否则返回假。
not exists则相反。
exists做为where 条件时,是先对where 前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断,如果为真则输出当前这一条主查询的结果,否则不输出。
in和existsin 是把外表和内表作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=)效率高,用到了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=)效率低,用到了A表上cc列的索引。
数据库in和exists的用法数据库in和exists的用法的用法如下:SELECTDISTINCTMD001FROMBOMMDWHEREMD001NOTIN(SELECTMC001F ROMBOMMC)NOTEXISTS,exists的用法跟in不一样,一般都需要和子表进行关联,而且关联时,需要用索引,这样就可以加快速度selectDISTINCTMD001fromBOMMDWHERENOTEXISTS(SELECTMC001FR OMBOMMCwhereBOMMC.MC001=BOMMD.MD001)exists是用来判断是否存在的,当exists(查询)中的查询存在结果时则返回真,否则返回假。
notexists则相反。
exists做为where条件时,是先对where前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断,如果为真则输出当前这一条主查询的结果,否则不输出。
in和existsin是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。
一直以来认为exists比in 效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:例如:表A(小表),表B(大表)1:select*fromAwhereccin(selectccfromB)效率低,用到了A表上cc列的索引;select*fromAwhereexists(selectccfromBwherecc=)效率高,用到了B表上cc列的索引。
相反的2:select*fromBwhereccin(selectccfromA)效率高,用到了B表上cc列的索引;select*fromBwhereexists(selectccfromAwherecc=)效率低,用到了A表上cc列的索引。
"exists"和"in"在英语中常常用于不同的语境中,表达不同的含义。
以下是关于这两个词的一些基本用法和注意事项:**exists**1. **存在性**:这个词主要用于表达某个实体或概念在某个集合或范围内是存在的。
例如:“Does anyone exist in this class?”(这个班级里有人存在吗?)这里的“exist”是动词,表示“存在”。
2. **存在状态**:当我们谈论某个物体或情况的存在状态时,我们可能会使用“exists”。
例如:“My car exists in my garage.”(我的车在车库里。
)在这个句子中,“exists”表示的是一种存在状态。
**in**1. **在……里面**:这个用法主要用于表示位置或范围。
例如:“The cat is in the kitchen.”(猫在厨房里。
)在这个句子中,“in”表示的是空间位置。
2. **用某种语言或方式**:当我们在描述某种行为或情况时,我们可能会使用“in”。
例如:“She speaks French very well, in a clear and confident way.”(她法语说得非常好,用清晰而自信的方式。
)在这个句子中,“in”表示方式。
3. **在某个时间或时期**:当我们谈论某个事件或活动发生的时间或时期时,我们可能会使用“in”。
例如:“The party started in the early evening.”(晚会开始于傍晚早些时候。
)**用法建议**在使用这两个词时,建议根据语境选择合适的词。
一般来说,“exists”更常用于描述事物的存在状态,而“in”则更常用于描述空间位置、方式或时间。
同时,注意不要混淆这两个词的用法,以免产生误解。
另外,在某些情况下,你可能需要查阅相关词典或语法书籍以获取更准确和详细的解释。
这些资源通常会提供更多关于这两个词的用法、含义和例句的信息,帮助你更好地理解和使用它们。
SQL⾥IN的⽤法以及优化1.in后条件不多,可以考虑主表建索引,或⽤union all 代替2. 和 exists的区别: 如果⼦查询得出的结果集记录较少,主查询中的表较⼤且⼜有索引时应该⽤, 反之如果外层的主查询记录较少,⼦查询中的表⼤,⼜有索引时使⽤exists。
其实我们区分和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执⾏⼦查询,所以我们会以驱动表的快速返回为⽬标,那么就会考虑到索引及结果集的关系了,另外IN时不对进⾏处理。
3.如果in后接⼏百⼏千或⼏万的条件,可把in⾥的条件录⼊临时表,给临时表加索引,⽤表连接代替问题描述: id值可能有数千个之多,怎么提⾼效率?例⼦:select * from table1 where id in (1,3,6,10,...,8000) and type = 1************************************************************/--例如:SELECT *FROM tbWHERE id IN (1, 2, 3, 4, ........)AND NAME = 'best'--1.将括号的条件做成变量DECLARE @str VARCHAR(4000)SET @str = '1,2,3,4,5.......'--2.然后将@s拆分后插⼊临时表CREATE TABLE #t(id VARCHAR(10))DECLARE @i INTDECLARE @len INTSET @i = 1WHILE @i < LEN(@str + ',')BEGININSERT #tSELECT SUBSTRING(@str + ',', @i, CHARINDEX(',', @str + ',', @i) -@i)SET @i = CHARINDEX(',', @str + ',', @i) + 1END--3利⽤临时表和原表进⾏连接取值SELECT k.*FROM tb kINNER JOIN #t pON p.id = k.idWHERE NAME = 'best'。
1.exists的用法跟in不一样,一般都需要和子表进行关联,而且关联时,需要用索引,这样就可以加快速度。
2.exists是用来判断是否存在的,当exists(查询)中的查询存在结果时则返回真,否则返回假。
not exists则相反。
exists做为where 条件时,是先对where 前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断,如果为真则输出当前这一条主查询的结果,否则不输出。
3.in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。
一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:。
mysql的exsitis用法MySQL的EXISTS用法MySQL是一种常用的关系型数据库管理系统,它提供了丰富的查询功能来满足不同需求。
其中,EXISTS是一种常用的关键字,它用于判断一个查询的结果是否存在。
在这篇文章中,我们将详细介绍MySQL的EXISTS 用法,并一步一步回答下面的问题:1. 什么是EXISTS?在MySQL中,EXISTS是一个用于判断是否存在子查询结果的关键字。
当关键字后面的子查询返回至少一条记录时,EXISTS返回TRUE,否则返回FALSE。
它通常用于WHERE子句或JOIN条件中,以过滤或连接数据。
2. EXISTS的语法是什么样的?EXISTS的语法如下所示:SELECT column_name(s)FROM table_nameWHERE EXISTS(subquery);在这个语法中,column_name(s)代表你想要查询的列名,table_name 代表你想要查询的表名,而subquery则是一个嵌套的子查询。
3. EXISTS的工作原理是什么?当EXISTS关键字与一个子查询一起使用时,MySQL会首先执行子查询,然后根据子查询的结果来决定最终的查询结果。
具体来说,MySQL会逐行检查子查询的结果。
如果子查询返回至少一行记录,则EXISTS返回TRUE,否则返回FALSE。
因此,EXISTS只关心子查询是否有结果,而不关心具体的数据内容。
4. EXISTS与IN之间有什么区别?EXISTS和IN都是判断子查询结果是否存在的关键字,但它们在实际应用中有一些区别。
首先,EXISTS比IN更高效,尤其是当子查询返回大量记录时。
这是因为EXISTS只需要找到一条满足条件的记录,而IN需要将整个子查询的结果集加载到内存中进行比较。
其次,EXISTS在某些情况下可以更好地处理NULL值。
当子查询中包含NULL值时,使用IN时可能会出现意外的结果,而EXISTS则可以正确地处理这种情况。
sql中exists替换in的区别在sql中使⽤exists替换in查询时要注意使⽤exists时⼀定要关联主查询和⼦查询的关联不然查询会得不到相应的结果如下语句:语句⼀使⽤in查询:select realname from Users where erId in(select Gallery.Galleries.CreatorId from Gallery.Galleries group by Gallery.Galleries.CreatorIdhaving COUNT(Gallery.Galleries.CreatorId)>1 ) Order by UserId语句⼆使⽤exists查询:select realname from Users where exists(select Gallery.Galleries.CreatorId from Gallery.Galleries group by Gallery.Galleries.CreatorIdhaving COUNT(Gallery.Galleries.CreatorId)>1 ) Order by UserId乍⼀看没有错误,但是语句⼆忘记了主查询和⼦查询的主键的关联,导致把主查询的所有内容查出来。
语句⼆的正确写法应该是:select * from Gallery.Galleries as A where exists (select A .CreatorId from Gallery.Galleries as BWhere A.CreatorId = B.CreatorId group by B.CreatorId having COUNT(B.CreatorId)>1)Order by CreatorId注:exists是boolean运算的只要字查询的结果集有⼀条数据结果就为真where后的条件就为真所以第⼆条查询语句等价于select realname from Users where 1=1 Order by UserId(如果⼦查询有⼀条数据被查出)。
Oracle中的EXISTS与IN分类:数据库2012-10-31 23:28 1288人阅读评论(3) 收藏举报项目中对数据库的查询操作很多,各种拼接,各种in,但由于in的内容受字符限制,所以有些地方将in改成了Extist,两种写法有什么关联,查了写资料,分析看看:in针对in很好理解,Sql代码1.select * from T1 where T1.a in (select T2.a from T2) ”Sql代码1.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) ;Sql代码1.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 适合外表的结果集小的情况。
MySQL中exists、in及any的基本⽤法【1】exists对外表⽤loop逐条查询,每次查询都会查看exists的条件语句。
当 exists⾥的条件语句能够返回记录⾏时(⽆论记录⾏是多少,只要能返回),条件就为真 , 返回当前loop到的这条记录。
反之如果exists⾥的条件语句不能返回记录⾏,条件为假,则当前loop到的这条记录被丢弃。
exists的条件就像⼀个boolean条件,当能返回结果集则为1,不能返回结果集则为 0。
语法格式如下:select * from tables_name where [not] exists(select..);⽰例如下:select * from p_user_2where EXISTS(select * from p_user where id=12)如果p_user表中有id为12的记录,那么将返回所有p_user_2表中的记录;否则,返回记录为空。
如果是not exists,则与上述相反。
总的来说,如果A表有n条记录,那么exists查询就是将这n条记录逐条取出,然后判断n遍exists条件【2】in语法格式如下:select * from A where column in (select column from B);需要说明的是,where中,column为A的某⼀列,in 所对应的⼦查询语句返回为⼀列多⾏结果集。
注意,in所对应的select语句返回的结果⼀定是⼀列!可以为多⾏。
⽰例如下:select * from p_user_2 where id [not] in (select id from p_user )查询id在p_user表id集合的p_user_2的记录。
not in则相反。
【3】exists与in的关系经过sql改变,⼆者是可以达到同⼀个⽬标的:select * from p_user_2where id [not] in (select id from p_user );select * from p_user_2where [not] EXISTS (select id from p_user where id = p_user_2.id )那么什么时候⽤exists 或者in呢?**如果查询的两个表⼤⼩相当,那么⽤in和exists差别不⼤。
exists 和 inin适合内外表都很大的情况,exists适合外表结果集很小的情况。
===========================================================今天市场报告有个sql及慢,运行需要20多分钟,如下:update p_container_decl cdset cd.ANNUL_FLAG='0001',ANNUL_DATE = sysdatewhere exists(select 1from (select tc.decl_no,tc.goods_nofrom p_transfer_cont tc,P_AFFIRM_DO adwhere tc.GOODS_DECL_NO = ad.DECL_NOand ad.DECL_NO = 'sssssssssssssssss') awhere a.decl_no = cd.decl_noand a.goods_no = cd.goods_no)上面涉及的3个表的记录数都不小,均在百万左右。
根据这种情况,我想到了前不久看的tom 的一篇文章,说的是exists和in的区别,in 是把外表和那表作hash join,而exists是对外表作loop,每次loop再对那表进行查询。
这样的话,in适合内外表都很大的情况,exists适合外表结果集很小的情况。
而我目前的情况适合用in来作查询,于是我改写了sql,如下:update p_container_decl cdset cd.ANNUL_FLAG='0001',ANNUL_DATE = sysdatewhere (decl_no,goods_no) in(select tc.decl_no,tc.goods_nofrom p_transfer_cont tc,P_AFFIRM_DO adwhere tc.GOODS_DECL_NO = ad.DECL_NOand ad.DECL_NO = ‘ssssssssssss’)让市场人员测试,结果运行时间在1分钟内。
exists 和 in
in适合内外表都很大的情况,exists适合外表结果集很小的情况。
===========================================================
今天市场报告有个sql及慢,运行需要20多分钟,如下:
update p_container_decl cd
set cd.ANNUL_FLAG='0001',ANNUL_DATE = sysdate
where exists(
select 1
from (
select tc.decl_no,tc.goods_no
from p_transfer_cont tc,P_AFFIRM_DO ad
where tc.GOODS_DECL_NO = ad.DECL_NO
and ad.DECL_NO = 'sssssssssssssssss'
) a
where a.decl_no = cd.decl_no
and a.goods_no = cd.goods_no
)
上面涉及的3个表的记录数都不小,均在百万左右。
根据这种情况,我想到了前不久看的tom 的一篇文章,说的是exists和in的区别,
in 是把外表和那表作hash join,而exists是对外表作loop,每次loop再对那表进行查询。
这样的话,in适合内外表都很大的情况,exists适合外表结果集很小的情况。
而我目前的情况适合用in来作查询,于是我改写了sql,如下:
update p_container_decl cd
set cd.ANNUL_FLAG='0001',ANNUL_DATE = sysdate
where (decl_no,goods_no) in
(
select tc.decl_no,tc.goods_no
from p_transfer_cont tc,P_AFFIRM_DO ad
where tc.GOODS_DECL_NO = ad.DECL_NO
and ad.DECL_NO = ‘ssssssssssss’
)
让市场人员测试,结果运行时间在1分钟内。
问题解决了,看来exists和in确实是要根据表的数据量来决定使用。
not in <>not exists
请注意not in 逻辑上不完全等同于not exists,如果你误用了not in,小心你的程序存在致命的BUG:
请看下面的例子:
create table t1 (c1 number,c2 number);
create table t2 (c1 number,c2 number);
insert into t1 values (1,2);
insert into t1 values (1,3);
insert into t2 values (1,2);
insert into t2 values (1,null);
select * from t1 where c2 not in (select c2 from t2);
no rows found
select * from t1 where not exists (select 1 from t2 where t1.c2=t2.c2);
c1 c2
1 3
正如所看到的,not in 出现了不期望的结果集,存在逻辑错误。
如果看一下上述两个select
语句的执行计划,也会不同。
后者使用了hash_aj。
因此,请尽量不要使用not in(它会调用子查询),而尽量使用not exists(它会调用关联子查询)。
如果子查询中返回的任意一条记录含有空值,则查询将不返回任何记录,正如上面例子所示。
除非子查询字段有非空限制,这时可以使用not in ,并且也可以通过提示让它使用hasg_aj或merge_aj连接。