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数据量非常大时,T1T2 时,上面的查询效率高
“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,是全扫描,
必须查找全部符合条件的记录后,再返回唯一值。