티스토리 뷰
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을 활용해 작성하였습니다=================
'SQL' 카테고리의 다른 글
[SQL] 포트폴리오 - Youtube의 Trending(인기 급상승) 동영상의 제목에서 최빈도 단어 확인 (1) | 2018.02.01 |
---|---|
[SQL] 10. 집합 연산자 (0) | 2018.02.01 |
[SQL] 8. Join (0) | 2018.01.30 |
[SQL] 7. 데이터 분석함수 (0) | 2018.01.26 |
[SQL] 6. 그룹함수(복수행함수) (0) | 2018.01.23 |
- Total
- Today
- Yesterday
- data
- 하둡설치
- Big Data
- 하둡
- Data Analysis
- 빅데이터
- hadoop setup
- hadoop install
- hadoop 2.7 install
- hadoop
- 하둡 설치 가이드
- hadoop2.7
- 하둡설치가이드
- 데이터 분석
- 하둡2.7
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |