in和select的技术原理:
㈠ in:先进行子查询,再进行主查询
㈡ exists:先进行主查询,再到子查询中过滤
in和exists的使用建议:
Ⅰ 如果限制性强的条件在子查询,则使用in
Ⅱ 如果限制性强的条件在主查询,则使用exists
可用查询结果集来理解上面这段话,采用最优化匹配原则:拿最小记录匹配大记录。限制性强,则结果集小;反之,则大。
注释:
① 使用exists可以将子查询结果定位常量,不影响查询结果,而且,效率高。
比如:
select e.*
from emp e
where exists
(select 1 from dept d
where e.deptno=d.deptno and
d.dname='SALES')
② not in可能会因为null而改变其行为导致和not exists结果集有出入。然而,在相关子查询下,not in和not exists的结果集是一样的。
sql exists和not exists用法
exists (sql 返回结果集,为真)
not exists (sql 不返回结果集,为真)
如下:
表A
ID NAME
1 A1
2 A2
3 A3
表B
ID AID NAME
1 1 B1
2 2 B2
3 2 B3
表A和表B是1对多的关系 A.ID => B.AID
SELECT ID,NAME FROM A WHERE EXIST (SELECT * FROM B WHERE A.ID=B.AID)
执行结果为
1 A1
2 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
===========================================================================
EXISTS = IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因
SELECT ID,NAME FROM A WHERE ID IN (SELECT AID FROM B)
NOT EXISTS = NOT IN ,意思相同不过语法上有点点区别
SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)
===========================================================================
EXISTS:
系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not exists
修改方法如下:
in的SQL语句
select *
from univ_subject u
where u.per_id in (select c.per_id from colle_subject c);
修改为exists的SQL语句
select *
from univ_subject u
where exists (select * from colle_subject c where u.per_id = c.per_id);
分享到:
相关推荐
exists: 括号内子查询sql语句返回结果不为空(即:sql返回的结果为真),子查询的结果不为空这条件成立,执行主sql,否则不执行。 not exists:与exists相反,括号内子查询sql语句返回结果为空(即:sql不返回的结果...
exists 和 not exists的详细解释
“exists”和“in”是Oracle中,都是查询某集合的值是否存在在另一个集合,但对不同的数据有不同的用法,主要是在效率问题上存在很大的差别,以下有两个简单例子,以说明 “exists”和“in”的效率问题。
关于Exists,not Exists.in ,not in效率的说明。关于Exists,not Exists.in ,not in效率的说明。关于Exists,not Exists.in ,not in效率的说明。关于Exists,not Exists.in ,not in效率的说明。关于Exists,not Exists.in...
VB6 判断文件是否存在,使用VB内置的函数FileExists来实现,可以说实现方法简单,直接调用函数(文件路径)即可,至于返回的结果,这里有两种形式,一种是以MsgBox的方式弹出窗口告之,另一种是返回布尔值,True或...
使用EXISTS(或NOT EXISTS)关键字引入一个子查询时,子查询实际上不产生任何数据;它只返回TRUE或FALS值。 指定一个子查询,检测行的存在。 如果子查询包含行,则返回 TRUE IN效率要差(返回子查询)
Delphi FileExists检查文件是否存在
function_exexists函数详解function_exists函数详解function_exists函数详解function_exists函数详解function_existexists函数详解function_exists函数详解function_exists函数详解function_exists函数详解function_...
exists是用来判断是否存在的,当exists(查询)中的查询存在结果时则返回真,否则返回假。not exists则相反 它所在的查询属于相关子查询,即子查询的查询条件依赖于外层父查询的某个属性值,处理过程一般为: 取外层...
使用exists 判断ERP系统中单据分录中物料是否符合某种条件,否则不予保存。
mysql多表查询和EXISTS查询性能对比
在SQL查询语句中,Exists语句的使用方式
里面自己根据网上的资源整理出来的一份sql中in,exists,not in,not exists的使用方法以及注意事项等,有助于初学的朋友们借鉴。
golang 错误提示 $GOPATH/go.mod exists but should not goland 出现该问题 去掉vendor即可 初出茅庐有错必改 欢迎交流
oracle in和exists性能解析
exists用法说明.doc
if exists用法,里面包含各种需要用到if exists的情况。
基本数据插入 except和intersect和exists和not exists和union和union all sql server
详细讲解了exist的使用方法,如何避免使用较为复杂的exists
oracle数据库关于exists使用方法与in的比较