본문 바로가기

Oracle/SQL

SQL Sub Query Exists / Not Exists 존재여부

EXISTS 

예제 74 : dept에서 부서번호, 부서위치를 출력하는데 emp에 존재하는 부서번호에 대한 것만 출력

  1. exists 없이 쓴 쿼리문 (다중행 서브쿼리)
select loc, deptno
from dept
where deptno in (select deptno
                 from emp);
  1.  만약 서브쿼리의 emp 테이블이 10억건의 데이터를 구성하고있다면 10억건의 부서번호를 다 출력하여서 메인쿼리로 리턴하기 때문에 성능이 느려진다.
  2. 따라서그렇게 되면 성능이 어마어마어마하게 느려진다.서브쿼리를 썼는데 너무 느리다면 exists 를 고려해 보아야한다.
  3. emp 테이블의 크기가 증가할 수록 성능이 느려진다.
  4. 그리고 10억건의 부서번호를 가지고 dept 테이블에서 데이터를 검색을 해야한다.   

2.   exists 문으로 수행한 쿼리문

select * 
from dept d
where exists (select 'x'
              from emp e
              where e.deptno = d.deptno);

- 위와같이 exists 문을 사용했고, 메인쿼리의 테이블 별칭이 서브쿼리에서 사용되고 있으면

select 'x' x 자리에 어떤 단어를 써도 상관없다.

dept 테이블의 10번부서번호를 emp 테이블에서 조회하는데 처음부터 스캔해서 10번이 존재하면 존재여부를 확인 했으므로 더이상 10 번을 찾지 않고 다음 부서번호인 20번이 emp 에 존재하는지 스캔해서 20번을 찾는다.

존재여부를 확인하면 더이상 20번을 찾지않고 다음 부서번호가 emp 에 존재하는지 또 찾아 나간다.

→ 메인쿼리의 테이블의 데이터가 적고 서브쿼리의 데이터가 많을 때 유리한 SQL 이다.

테이블 별칭 써야한다.

메인쿼리 먼저 수행합니다.


문제 358 telecom_service 에서 모든 컬럼의 데이터를 출력하는데 emp14 테이블에 존재하는 통신사에 대해서만 출력하시오.

튜닝전 

select * 
from telecom_service t 
where telecom in (select telecom
                  from emp14);

튜닝후

select * 
from telecom_service t 
where exists (select 'X' 
              from emp14 e
              where e.telecom = t.telecom);

 

Not Esists

문제 359 부서테이블에는 존재하는데 사원테이블에는 존재하지 않는 부서번호출력

select deptno
from dept d 
where not exists (select 'x' 
                  from emp e 
                  where e.deptno = d.deptno); —————→조인조건

 

'Oracle > SQL' 카테고리의 다른 글

SQL Sub Query From 절 In Line View  (0) 2021.11.28
SQL Sub Query Having 절 서브쿼리  (0) 2021.11.28
SQL Sub Query 다중컬럼 서브쿼리  (0) 2021.11.28
SQL Sub Query 다중행 (IN, NOT IN)  (0) 2021.11.28
SQL Sub Query 단일행 where 절  (0) 2021.11.28