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使用场景

  1. 1) “exists”和“in”

  2. select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;

  3. T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。

  4. 2) select * from T1 where T1.a in (select T2.a from T2) ;

  5. T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高

  6. “exists”和“distinct”

  7. 用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表数据十分庞大时,这种性能差别就能更好的体现出来。

  8. 用EXISTS,只要找到第一个符合条件的值,就返回了,而不管后面有多少条符合条件的重复记录。
    而DISTINCT,是全扫描,必须查找全部符合条件的记录后,再返回唯一值。

  9.  

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐