티스토리 뷰

SQL

[SQL] 9. 서브쿼리

superkong1 2018. 1. 31. 15:45
반응형

9. 서브쿼리

데이터 분석함수의 pivot에서 잠깐 다뤄봤던 서브쿼리에 대해 알아보도록 하겠다.
서브쿼리(Subquery) 란 단어의 뜻 그대로 "쿼리안의 쿼리" 를 의미하며,
일반적인 쿼리로는 원하는 출력값을 얻을 수 없는 경우 사용한다.

예제) emp테이블에 있는 JONES보다 더 많은 월급을 받는 사원들의
이름과 월급을 출력하시오!


< emp 테이블 >

이 경우 JONES의 월급을 미리 알고 있지 않다면,
아래의 두 가지 쿼리를 순서대로 진행해야 확인할 수 있다.

select sal
from emp
where ename = 'JONES'; # 첫번째 쿼리

↓ JONES의 월급 확인

select ename, sal
from emp
where sal > 2975 ; # 두번째 쿼리

이때, 서브쿼리를 사용하면 하나의 쿼리로 이를 해결할 수 있다.

select ename, sal
from emp
where sal > (select sal from emp
where ename='JONES') ;

where절에 서브쿼리를 사용하여 JONES의 월급보다 많은 사람을 추려내었다.
서브쿼리는 where절이외에도 select, from 절에서도 사용할 수 있다.



서브쿼리는 사용될때 크게 3가지로 나누어진다.

emp 테이블에서 mgr(관리자인 사원의 사원번호)인 사람들의 이름만 출력하고 싶다면,
아래와 같은 서브쿼리로 쉽게 해결할 수 있다.

select ename from emp
where empno in (select mgr from emp) ;

위와 반대로, 관리자가 아닌 사원들을 출력하고자 하려면
in 대신 not in을 사용해야 하고 이는 곧 !=all과 동일하다. 하지만!

!=all은 곧 !=7839 and !=7566 and .... and 1388과 같은 식이다.
(7839, 7566, 1388이라는 사원번호가 있을 때)
허나, 만약 null 값이 있을 경우 true and null은 null이므로 null로 출력된다.
따라서 not in을 사용할 때 null 값이 있다면 where mgr is not null 등으로 null을 제거해야한다.

서브쿼리에서 not in을 사용할때는 반드시 null처리를 해줘야 결과를 볼 수 있다.



이제 헷갈리는 all과 any의 사용에 대하여 알아보자.

직업이 SALESMAN인 사원 중 최대월급보다 더 많은 월급을 받는
사원들의 이름과 월급을 출력하려면
select ename, sal
from emp
where sal > all (select sal from emp
                where job = 'SALESMAN') ;

all은 서브쿼리의 결과로 나온 모든 값을 적용하는 것이며,
→ SALESMAN인 사원들의 각 월급보다 무조건 커야함 반대로 any를 사용하면 서브쿼리의 결과로 나온 어떤 값 중 하나에만 조건이 해당되어도 출력된다.
→ SALESMAN인 사원들의 각 월급 중 하나보다만 커도 출력됨



마지막으로 exists를 살펴보자.
exists는 성능이 좋은 문법으로 SQL 튜닝 시 많이 사용된다고 한다.
→ 메인쿼리의 data는 적은데 서브쿼리의 data가 많은 경우

보통 where절에서 사용되며,
where (not) exists (select 'X' from ~ ) 과 같이 쓰인다.
→ 'X'는 null이 아닌 다른 알파벳으로 사용해도 무방하다.

예제) dept 테이블에서 부서번호(deptno)와 부서위치(loc)를 출력하는데
emp 테이블에 존재하는 부서번호에 대한 것만 출력하자.

select deptno, loc
from dept d
where exists (select 'X'
            from emp e
            where e.deptno = d.deptno) ;

exists의 경우, 일반적인 서브쿼리 수행 순서와 다르게 메인쿼리부터 작업이 수행되며,
dept 테이블을 먼저 읽어와 서브쿼리의 d.deptno로 하나씩 들어가게 된다.
서브쿼리부터 실행할 시 emp 테이블에 있는 모든 deptno를 파악해야하는데,
비교적 데이터가 적은 dept 테이블을 먼저 읽어 수행시간이 빨라지는 것이다.

=================이 글은 Markdown을 활용해 작성하였습니다=================

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함