Oracle数据库的exists用法总结

12 篇文章 1 订阅

Oracle数据库的exists用法总结

exists表示()内子查询语句返回结果不为空说明where条件成立就会执行主sql语句,
如果为空就表示where条件不成立,sql语句就不会执行。
not exists和exists相反,子查询语句结果为空,
则表示where条件成立,执行sql语句。负责不执行。

之前在学oracle数据库的时候,接触过exists,做过几个简单的例子,如

1.如果部门名称中含有字母A,则查询所有员工信息(使用exists)

select 
* 
from 
emp 
where exists 
(select * from dept where dname like '%A%' and deptno = emp.deptno) 
temp and deptno=temp.deptno;

2.如果有平均工资不小于1500的部门信息则查询所有部门信息(使用not exists)

select 
* 
from 
dept
where 
not exists (select deptno from emp where deptno = emp.deptno group by deptno having avg(sal) < 1500)
and exists (select * from emp where emp.deptno = deptno);

exists使用场景

“exists”和“in”

select * from T1 where exists(select 1 from T2 where T1.a=T2.a);
T1数据量小而T2数据量非常大时,T1<<T2 时,上面的查询效率高。
select * from T1 where T1.a in (select T2.a from T2) ;
T1数据量非常大而T2数据量小时,T1>>T2 时,上面的查询效率高

“exists”和“distinct”

用distinct实现如下:
select d.dp_id,d.dp_name from depts d,staffs s where d.dp_id=s.dp_id;

这样写的sql语句执行过程是:先遍历执行部门表中的每一行,
因为每一行对应一个dp_id,
然后在固定dp_id的情况下表里staffs表中的每一行,
直到运行到staffs表的最后一行。
然后在换下一个dp_id进行查找,
又要遍历staffs表中的每一行,
以此类推,直到所有的dp_id都比较过。




用exists实现如下:
select d.dp_id,d.dp_name from depts d 
where exists(select null from staffs s where s.dp_id=d.dp_id)
首先说明一下exists的工作原理,
exists语句用来判断()内的表达式是否存在返回值,
如果存在就返回true,如果不存在就返回false,
所以在上面语句中我们使用select null,因为返回什么数据不重要,
重要有值返回就行。

另外exists的有点是,
它只要括号中的表达式有一个值存在,
就立刻返回true,而不用遍历表中所有的数据。

所以在dp_id同样多的情况下,用distinct需要每次都遍历staffs表进行比对,
而使用exists只需要比对staffs表的一部分,
在staffs表数据十分庞大时,这种性能差别就能更好的体现出来。

用EXISTS,只要找到第一个符合条件的值,就返回了,
而不管后面有多少条符合条件的重复记录。
而DISTINCT,是全扫描,
必须查找全部符合条件的记录后,再返回唯一值。
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值