EXISTS
예제 74 : dept에서 부서번호, 부서위치를 출력하는데 emp에 존재하는 부서번호에 대한 것만 출력
- exists 없이 쓴 쿼리문 (다중행 서브쿼리)
select loc, deptno
from dept
where deptno in (select deptno
from emp);
- 만약 서브쿼리의 emp 테이블이 10억건의 데이터를 구성하고있다면 10억건의 부서번호를 다 출력하여서 메인쿼리로 리턴하기 때문에 성능이 느려진다.
- 따라서그렇게 되면 성능이 어마어마어마하게 느려진다.서브쿼리를 썼는데 너무 느리다면 exists 를 고려해 보아야한다.
- emp 테이블의 크기가 증가할 수록 성능이 느려진다.
- 그리고 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 |