두 쿼리문을 결합 => 하나의 쿼리문을 다른 쿼리문 내부에 포함 시킨다.
내부에 기술하는 쿼리 : 서브 쿼리
외부에 기술하는 쿼리 : 메인 쿼리
서브 쿼리는 결과 값의 개수에 따라
✔ 단일 행 서브 쿼리
✔ 다중 행 서브 쿼리
두가지로 나뉨
: 내부 서브 쿼리문의 결과가 행 1개
🔎 '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';
: 내부 서브 쿼리문의 결과가 행 여러개
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');