9장 - 서브쿼리

SQL 구문이 실행을 완료한 후 데이터베이스 서버가 서브쿼리 결과에 할당된 메모리를 해제한다.


비상관 서브쿼리 - 독립적으로 실행되는 서브쿼리

select city_id, city
from city
where country_id <>
  (select country_id from country where country = 'India');

상관 서브쿼리 - 하나 이상의 열을 참조하는 포함 구문에 의존적인 서브쿼리

따라서 포함 구문이 실행되기 전까지 실행되지 않는다.

select c.first_name, c.last_name
from customer c
where 20 =
  (select count(*) from rental r
   where r.customer_id = c.customer_id);

주의할 점은 포함 쿼리의 각 행에 대해 한 번씩 실행되므로, 포함 쿼리가 많은 행을 반환할 경우 성능 문제가 발생할 수 있다.


상관 서브쿼리는 다음과 같이 update, delete, insert 문에서도 자주 사용된다.

update customer c
set c.last_update =
  (select max(r.rental_date) from rental r
   where r.customer_id = c.customer_id);

서브쿼리를 select, from, where 절 뿐만 아니라 having, order by 절에서도 사용할 수 있다.

select a.actor_id, a.first_name, a.last_name
from actor a
order by
  (select count(*) from film_actor fa
   where fa.actor_id = a.actor_id) desc;