[SQL] 9. 쿼리안의 쿼리 - 서브쿼리
서브쿼리란?
emp 테이블에서 scott 의 월급보다 높은 월급을 받는 사람의 정보를 출력하시오 라는 쿼리를 실행하려면 몇 개의 쿼리가 필요할까요. scott 의 월급을 구하는 쿼리 하나와 emp 테이블에서 scott 의 월급보다 높은 사람들의 정보를 출력하는 쿼리 하나 총 두 개의 쿼리가 필요합니다. 이렇게 하나의 결과를 얻기 위해 사용해야 하는 쿼리가 2 개 이상일 때 서브쿼리 를 사용합니다.
subquery 는 다른 select 문의 절에 포함되는 select 문 입니다. 서브쿼리는 select, where having, from 같이 다양한 sql 절에 배치할 수 있습니다. 보통 쿼리가 실행될 때에는 서브쿼리가 먼저 실행되고 이후에 메인 쿼리가 실행됩니다.
서브쿼리는 그 출력값에 따라 단일 행과 복수 행으로 나누어집니다.
단일 행 서브쿼리
단일 행 서브쿼리는 한 행만 반환하는 쿼리를 의미 합니다. 그렇기 때문에 하나의 값과 비교하는 단일 행 비교 연산자를 사용합니다.
select * from empwhere sal > (select salfrom empwhere ename = 'SCOTT') ;
'SCOTT' 의 월급 - 3000
'SCOTT' 의 월급보다 높은 사원의 정보
서브쿼리 절은 다음처럼 두 개의 쿼리가 실행되는 구조 입니다. 먼저 'SCOTT' 의 월급을 구해서 3000 보다 월급이 높은 사원을 출력하는 구조 입니다.
복수 행 서브쿼리
서브쿼리가 두 개 이상의 행을 반환하는 경우를 복수 행 서브쿼리라고 칭합니다. 복수 행을 반환하는 경우에는 단일 행 비교 연산자를 사용할 수 없으며 복수 행 비교 연산자를 사용해야 합니다.
* ANY 와 ALL 은 단일행 연산자와 함께 사용합니다.
select * from emp
where sal in ( select sal from emp
where deptno = 10 );
부서번호 10인 사원들의 월급 리스트
월급이 위의 리스트 중 하나라도 같은 사원 정보
단일 행 서브쿼리와 같은 구조로 사용할 수 있습니다. 다른 부분은 여러 값들을 반환하기 때문데 다른 연산자를 사용하는 부분이겠지요.
select * from emp
where sal = ANY ( select sal from emp
where deptno = 10 );
= ANY 는 위의 IN 과 정확히 일치 합니다. 그래서 결과 값도 동일하게 출력됩니다.
select * from empwhere sal <= any ( select sal from empwhere deptno = 20 );
부서번호 20인 사원들의 월급 리스트
월급이 위의 리스트 중 하나보다 작은 사원들의 정보
결과를 보면 월급이 3000 보다 작은 사원은 모두 출력된 것을 알 수 있습니다. 서브쿼리의 결과가 800, 2975, 3000, 1100, 3000 이기 때문에 이 중 어떤 것보다 작기만 하면 출력됩니다. 그래서 <= any 는 서브쿼리의 결과 중 최대값보다 작은 것을 출력하게 합니다. 반대로 >= any 는 서브쿼리의 결과 중 최소값보다 크면 출력하게 합니다.
select * from empwhere sal <= all ( select sal from empwhere deptno = 20 );
부서번호 20인 사원들의 월급 리스트
월급이 위의 리스트 값 전부보다 작은 사원들의 정보
any 를 all 로 바꾼 것 뿐인데 결과가 많이 달라졌습니다. <= all 은 서브쿼리 결과값 전체보다 작거나 같은 것을 의미 하기 때문에 결과값의 최소값보다 작은 것을 출력하라는 의미가 됩니다. 반대로 >= all 은 결과값의 최대값보다 큰 것을 출력하라는 의미가 됩니다.
부족한 블로그에 방문해 주셔서 감사합니다.
잘못된 부분이나 질문이 있으시면
댓글로 말씀해주세요.
금방 확인하고 피드백 드리겠습니다.
좋은 하루 되세요. ^^