하나의 SQL문안에 포함되어 있는 또 다른 SQL문으로, 알려지지 않은 기준을 이용한 검색에 사용한다.
SELECT (스칼라 서브쿼리)
FROM (인라인뷰)
WHERE (서브쿼리);
# select 절에서 사용
select empno, (select dname from dept where deptno = a.deptno) dname
from emp a;
# 함수의 인자로 사용
select empno, ename, substr((select dname from dept where deptno = e.deptno), 1, 3) as department_name
from emp e;
# where 절 조건으로 사용
select empno, ename from emp e where (select dname from dept where deptno = e.deptno)
= (select dname from dept_2 where deptno = e.deptno);
# order by 절에서 사용
select empno, ename, deptno from emp e
order by (select dname from dept where deptno = e.deptno)VIEW 는 데이터베이스에 정의되어 사용되지만, 서브쿼리는 쿼리 실행시 정의되기 때문에
일반적인 뷰를 **정적 뷰(Static View)** 라고 하고 인라인 뷰를 **동적 뷰(Dynamic view)** 라고도 한다.
select t.team_name, p.player_name, p.back_no
from (select team_id, player_name, back_no
from player
where position = 'MF') p, team t
where p.team_id = t.team_id
order by player_name;
VIEW 사용의 장점
단지 정의만을 가지고 있으며, 실행 시점에 질의를 재작성하여 수행한다.
실제 데이터를 저장하고 있는 뷰를 생성하는 기능을 지원하는 DBMS 도 있다.
독립성 : 테이블 구조가 변경되어도 뷰를 사용하는 응용 프로그램은 변경하지 않아도 된다.
편리성 : 복잡한 질의를 뷰로 생성하여 관련 질의를 단순하게 작성할 수 있다.
보안성 : 숨기고 싶은 정보를 빼고 생성하여 정보를 감출 수 있다.
인라인 뷰의 집계 함수 출력 결과는 별칭으로 메인 쿼리에 전달한다.
select d.dname, e.avg_sal, e.max_sal
from (select deptno, avg(sal) avg_sal, max(sal) max_sal
from emp
group by deptno) e, dept d
where e.deptno = d.deptno AND d.sal > e.max_sal
order by dname;
단일 행 서브쿼리
다중 행 서브쿼리
# salary 가 서브쿼리의 salary들 중 최소값보다 큰 모든 행 반환
select * from emp where salary > ANY(select salary from emp where deptno = 10)
다중 컬럼 서브쿼리 (oracle) - SQL server 에서 지원 X
select team_id, player_name, position, back_no, height
from player
where (team_id, height) in (select team_id, min(height) from player group by team_id)
order by team_id, player_name;
비연관 서브쿼리
SELECT employee_id, first_name, salary
FROM employees
WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'Sales');연관 서브쿼리 - WHERE 절에 사용
SELECT employee_id, first_name, salary
FROM employees e
WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id);