메인쿼리 실행 후 서브쿼리 조건을 비교 한다.
EXISTS는 메인쿼리를 통해 데이터를 확보해 놓고, 서브쿼리로 조건을 걸러내기 때문에 IN보다 사용은 복잡하지만 속도면에서 우월하다.
해당 결과가 있는지 없는지 1 or 0을 반환
- select exists (select deptno from dept d where loc in ('LA','boston')) as yn;
- exists의 반환값이 1이면 데이터를 조회
select from emp where 1;
select ename, job,deptno from emp where exists (select deptno from dept d where loc in ('LA','boston'));
- exists의 반환값이 0이면 데이터를 보여주지 않는다.
select from emp where 0;
select ename, job,deptno from emp where exists (select deptno from dept where loc='korea');
사용 예
- 1) 메인 쿼리 : 11개의 조회된 데이터를 먼저 확보하고
select ename, job,deptno from emp e;
- 2) exists : 확보한 데이터 중에서 조건에 맞는 값이 존재하는지를 확인
- dept와 emp의 공통되는 컬럼이 있으므로 그 둘을 하나씩 맞춰가는 것
select ename, job,deptno from emp e where exists (select deptno from dept d where e.deptno = d.deptno);
- 3) 2의 결과로 확보한 데이터에 loc in ('LA','boston')) 조건을 추가
select ename, job,deptno from emp e where exists (select deptno from dept d where e.deptno = d.deptno and (loc in ('LA','boston')));
=ANY : IN 과 같은 효과
select ename, job from emp e where deptno
IN (select deptno from dept where loc = 'LA' or loc = 'boston');
select ename, job from emp e where deptno
= ANY (select deptno from dept where loc = 'LA' or loc = 'boston');
> ANY : 최소값 보다 크면
- 직책이 manager 인 직원의 입사일이 가장 빠른 사람 보다 늦은 이름과, 직책, 입사일
select ename, job, hiredate from emp
where hiredate > ANY(select hiredate from emp where job = 'manager')
order by hiredate;
< ANY : 최대값 보다 작으면
- 직책이 manager 인 직원의 입사일이 가장 늦은 사람 보다 빠른 이름과, 직책, 입사일
select ename, job, hiredate from emp
where hiredate < ANY(select hiredate from emp where job = 'manager')
order by hiredate;