Oracle DBA/SQL

074 서브 쿼리 사용하기 4(EXISTS와 NOT EXISTS)

Nuez 2023. 7. 5. 13:43
반응형

문제 392. dept 테이블에서 부서번호를 출력하는데 emp 테이블에 존재하는 부서번호들만 출력하시오. 

 

방법 1)  메인쿼리에서 출력되는 값이 적을 때 사용 : 검색 성능이 좋음. (EXISTS)

SELECT deptno
FROM dept D
WHERE EXISTS (SELECT 'X' FROM emp E WHERE E.deptno=D.deptno);

수행 원리 및 순서 

1. 메인쿼리 테이블 먼저 select (서브쿼리X)
2. 메인쿼리 출력 결과의 첫번째 값이 서브쿼리의 테이블에 존재하는지 찾음
3. 순서대로 찾다가 첫번째로 그 값이 나오는 순간 서치 중지 (밑에 동일 값이 더 있어도)
4. 메인쿼리 출력 결과의 두번째 값이 서브쿼리의 테이블에 존재하는지 찾음.
5. 순서대로 찾다가 첫번째로 그 값이 나오는 순간 서치 중지 

 

이런식으로 반복해서 찾음.

 

데이터를 전제 스캔하지 않고, 원하는 값이 한번이라도 나오면 그 순간에 스캔을 중지하므로, 빠르게 검색을 수행한다는 점이 장점.

 

* 참고

:

1. 메인쿼리의 데이터 건수가 몇 건 되지 않을 때 좋은 검색속도를 보임.

메인쿼리에서 출력된 값이 많으면 서브쿼리에서 조회도 많이 해야하므로, 이때는 딱히 성능이 좋다고 할 수 없음.

 

2. SQL전체를 통틀어서 유일하게 WHERE절에 컬럼명 없이 쓸 수 있음. 

3. 테이블 별칭을 사용해야 함. 

 

방법 2)  메인쿼리에 출력되는 값이 적을 경우 악성 SQL (IN 사용) : 속도 느려짐

SELECT deptno 
FROM dept
WHERE deptno IN (SELECT deptno FROM emp);

1. 서브쿼리 먼저 수행 

2. 나온 값을 바탕으로 메인쿼리 테이블의 값을 하나하나 다 비교