서브쿼리에 메인쿼리의 컬럼이 포함되는지에 따라 연관 서브쿼리, 비연관 서브쿼리로 구분한다.
메인쿼리의 컬림이 서브쿼리에 포함되며, 메인쿼리의 컬럼은 서브쿼리에 특정 조건으로 사용된다.
select id, department_id, name, salary
from employee as a
where
salary > (select avg(salary)
from
employee as b
where
b.department_id = a.department_id);
예시를 보면 서브쿼리에서 메인쿼리의 column을 참조하고 있다.
메인쿼리 컬럼이 서브쿼리에 포함되지 않으며, 주로 메인 쿼리에 특정한 값을 제공할 때 사용한다.
select
avg(salary)
from
employee
where
department_id = (select
department_id
from
employee
where
name = 'steve');
예시를 보면 서브쿼리가 메인 쿼리를 참조하지 않는다.
하나의 행만을 결과 값으로 가지는 서브쿼리를 뜻한다.
서브쿼리의 결과가 두 개 이상 행을 반환할 수 있으며, 다중 행 비교 연산자(IN, ALL, ANY, EXISTS)와 같이 사용된다.
서브 쿼리의 결과가 여러 개의 컬럼을 반환하며, 메인쿼리의 조건과 비교된다.
select
name,
salary
from
employee
where
(department_id, salary) in
(select
department_id, max(salary)
from
employee
group by
department_id);
하나의 속성을 가지면서, 하나의 행만을 반환하는 쿼리이다. select, where, having 절 등에서 사용 할 수 있다.
select
name,
(select
count(*)
from
employee as e
where
e.department_id = d. id)
from
department as d;
뷰는 다른 테이블에서 파생된 테이블이다. 물리적(하드웨어)으로 데이터가 저장되는 것이 아니라,
논리적으로만 존재하며 뷰를 사용한 질의 시에는 DBMS에서 뷰 정의에 따라 질의를 재작성하여 수행한다.
create [또는 replace] view 뷰 이름 as
select 컬럼 1, 컬럼 2, .....
from 테이블 이름
where 조건