반응형
문제 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. 나온 값을 바탕으로 메인쿼리 테이블의 값을 하나하나 다 비교
'Oracle DBA > SQL' 카테고리의 다른 글
076 서브 쿼리 사용하기 6 (FROM절의 서브 쿼리) (0) | 2023.07.05 |
---|---|
075 서브 쿼리 사용하기 5(HAVING절의 서브 쿼리) (0) | 2023.07.05 |
추가 : 서브쿼리 사용하기 3 (다중열 서브쿼리) + unpair, pairwise (0) | 2023.07.04 |
073 서브 쿼리 사용하기 3(NOT IN) (0) | 2023.07.04 |
072 서브 쿼리 사용하기 2(다중 행 서브쿼리) (0) | 2023.07.04 |