[Oracle] 서브쿼리

hi·2021년 12월 28일
  • 두 쿼리문을 결합 => 하나의 쿼리문을 다른 쿼리문 내부에 포함 시킨다.

    내부에 기술하는 쿼리 : 서브 쿼리
    외부에 기술하는 쿼리 : 메인 쿼리

  • 서브 쿼리는 결과 값의 개수에 따라

    ✔ 단일 행 서브 쿼리
    ✔ 다중 행 서브 쿼리

    두가지로 나뉨

1) 단일 행 서브 쿼리

: 내부 서브 쿼리문의 결과가 행 1개

  • 단일 행 비교 연산자 : > , = , <=
  • in 연산자
 
🔎 'SCOTT'과 동일한 부서에서 근무하는 사원 이름, 부서번호 조회


1) 우선 'SCOTT'의 부서 알기

select dno
from employee 
where ename='SCOTT';


2) 해당 부서 번호와 같은 사원 이름, 부서 번호 조회

select ename, dno
from employee
where dno = (select dno
 	     from EMPLOYEE
 	     where ename='SCOTT')
and ename != 'SCOTT';

2) 다중 행 서브 쿼리

: 내부 서브 쿼리문의 결과가 행 여러개

  • 다중 행 비교 연산자 : in , any , some , all , exists

1. in

  • 메인쿼리의 비교 조건에서 서브쿼리의 출력 결과와 '하나라도 일치하면'
    메인쿼리의 where절이 true
  • 단일 또는 다중 행 서브쿼리 둘 다 사용 가능
🔎 부서별 최소 급여를 받는 사원의 부서번호, 사원번호, 이름, 최소 급여 조회

1) 부서별 최소 급여 구하기

select dno, min(salary)
from employee
group by dno;  
		

2) 부서별 최소 급여를 받는 사원의 
   부서번호, 사원번호, 이름, 최소 급여 조회
   
select dno, eno, ename, salary
from employee
where (dno,salary) in (select min(salary) 
		       from employee
		       group by dno)
order by 1;

2. any

  • 서브 쿼리가 변환하는 각각의 값과 비교 , 하나 이상 일치하면 true
🔎 부서별 최소 급여를 받는 사원의 부서번호, 사원번호, 이름, 최소 급여 조회

1) 부서별 최소 급여 구하기

select dno, min(salary)
from employee
group by dno; 
		

2) 부서별 최소 급여를 받는 사원의 
   부서번호, 사원번호, 이름, 최소 급여 조회
   
select dno, eno, ename, salary
from employee
where (dno,salary) = any (select dno, min(salary) --in(1300,800,950)
			  from employee
			  group by dno)
order by 1;

🤔 쉽게 정리하자면...

where (dno, salary) = any((10,1300), (20,800), (30,950))
where (dno, salary)    in((10,1300), (20,800), (30,950))

=> 서브쿼리의 결과 중 아무거나와 같은 것

3. all

  • 서브 쿼리에서 반환되는 모든 값과 비교
🔎 직급이 SALESMAN이 아니면서 급여가 모든 SALESMAN 보다 낮은 
    사원의 정보(사원이름, 직급, 급여) 출력 
    (모든 = 모두 동시에 만족)

1) 직급 SALESMAN 급여 구하기

select distinct salary  	-- 1300, 1250, 1500
from employee
where job = 'SALESMAN'; 

2)

select ename, job, salary
from employee
where job != 'SALESMAN' and salary < all (select distinct salary
					  from employee
					  where job = 'SALESMAN'); 

=> salary < all (1300, 1250, 1500) 의 서브 쿼리 결과 중 '최소값'보다 작다

4. exists

  • 서브 쿼리에서 구해진 데이터가 1개라도 존재하면 true
    select
    from
    where EXISTS (서브쿼리);
🔎 사원 테이블에서 직업이 'PRESIDENT'가 있으면 모든 사원 이름을 출력


1) 직업이 'PRESIDENT'인 사람의 사원 번호

select eno, job --7839
from employee
where job='PRESIDENT';


2)

select ename
from employee
where EXISTS (select eno
	      from employee
	      where job='PRESIDENT');							

0개의 댓글