티스토리 뷰

반응형



서브쿼리란? 

  • emp 테이블에서 scott 의 월급보다 높은 월급을 받는 사람의 정보를 출력하시오 라는 쿼리를 실행하려면 몇 개의 쿼리가 필요할까요. scott 의 월급을 구하는 쿼리 하나와 emp 테이블에서 scott 의 월급보다 높은 사람들의 정보를 출력하는 쿼리 하나 총 두 개의 쿼리가 필요합니다. 이렇게 하나의 결과를 얻기 위해 사용해야 하는 쿼리가 2 개 이상일 때 서브쿼리 를 사용합니다.

  • subquery 는 다른 select 문의 절에 포함되는 select 문 입니다. 서브쿼리는 select, where having, from 같이 다양한 sql 절에 배치할 수 있습니다. 보통 쿼리가 실행될 때에는 서브쿼리가 먼저 실행되고 이후에 메인 쿼리가 실행됩니다.

  • 서브쿼리는 그 출력값에 따라 단일 행과 복수 행으로 나누어집니다.


단일 행 서브쿼리 

  • 단일 행 서브쿼리는 한 행만 반환하는 쿼리를 의미 합니다. 그렇기 때문에 하나의 값과 비교하는 단일 행 비교 연산자를 사용합니다.


select * from emp
    where sal > (select sal 
from emp
where 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 emp
where sal <= any ( select sal from emp 
where deptno = 20 );

부서번호 20인 사원들의 월급 리스트


월급이 위의 리스트 중 하나보다 작은 사원들의 정보


  • 결과를 보면 월급이 3000 보다 작은 사원은 모두 출력된 것을 알 수 있습니다. 서브쿼리의 결과가 800, 2975, 3000, 1100, 3000 이기 때문에 이 중 어떤 것보다 작기만 하면 출력됩니다. 그래서 <= any 는 서브쿼리의 결과 중 최대값보다 작은 것을 출력하게 합니다. 반대로 >= any 는 서브쿼리의 결과 중 최소값보다 크면 출력하게 합니다.

select * from emp
where sal <= all ( select sal from emp 
where deptno = 20 );

부서번호 20인 사원들의 월급 리스트


월급이 위의 리스트 값 전부보다 작은 사원들의 정보


  • any 를 all 로 바꾼 것 뿐인데 결과가 많이 달라졌습니다. <= all 은 서브쿼리 결과값 전체보다 작거나 같은 것을 의미 하기 때문에 결과값의 최소값보다 작은 것을 출력하라는 의미가 됩니다. 반대로 >= all 은 결과값의 최대값보다 큰 것을 출력하라는 의미가 됩니다.






부족한 블로그에 방문해 주셔서 감사합니다.

잘못된 부분이나 질문이 있으시면 

댓글로 말씀해주세요.


금방 확인하고 피드백 드리겠습니다.


좋은 하루 되세요. ^^





반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함