sql 문 안에 부품처럼 들어가는 select 문이다.
서브(sub)라는 단어는 하위의 또는 일부분의 라는 뜻을 가지고 쿼리는 데이터베이스에 보내는 요청을 뜻한다.
종합하면 서브쿼리는 전체 sql 문에서 일부를 이루는 또 다른 sql 문인 것이다.
서브쿼리를 쓸 때는 꼭 괄호로 감싸주어야 한다.
*select 절에 있는 서브쿼리는 컬럼의 최댓값, 평균값처럼 특정 컬럼의 특징을 찾아주는 서브쿼리를 자주 쓴다
SELECT
id,
name,
price,
(SELECT MAX(price) FROM item)
FROM copang_main_item;
(1)
SELECT id, name, price
FROM item
WHERE price = (SELECT MAX(price) FROM item);
(2)
서브쿼리가 또 다른 형식의 결과를 리턴하는 경우
SELECt * FROM item
WHERE id IN
(
SELECT item_id
FROM review
GROUP BY item_id HAVING COUNT(*) >= 3
);
▶ IN 이 있으면 그 뒤에 있는 값들 중에서 하나라도 같은 게 있으면 조건을 만족한다.
▶ ANY 는 조건에 만족하는 값들 중 단 하나의 값보다도 크다면 True를 리턴한다.
▶ ALL은 모든 경우에 대해서 해당 조건이 성립해야 True를 리턴한다.
From 절에 오는 서브쿼리는 table 형태이고 이렇게 탄생한 테이블을 derived 테이블이라고 한다.
그리고 꼭 alias 를 붙여주어야 한다.
SELECT AVG(review_count)
FROM
(SELECT
SUBSTRING(adress, 1, 2) AS region,
COUNT(*) AS review_count
FROM review AS r LEFT OUTER JOIN member AS m
ON r.mem_id = m.id
GROUP BY SUBSTRING(address, 1, 2)
HAVING region IN NOT NULL
AND region != '안드') AS review_count_summary;
▶ 비상관 서브쿼리
그 자체만으로도 실행이 가능한 쿼리로 서브쿼리로 사용된 쿼리를 따로 빼서 별도로 실행해도 결과가 잘 나온다. 이것은 이 서브쿼리가 그것을 둘러싼 outer query와 별개로 독립적으로 실행되기 때문에 그런것이다. 이렇게 outer query와 상관 관계가 없는 서브쿼리를 비상관 서브쿼리라고 한다.
▶ 상관 서브쿼리
상관 서브쿼리란 outer query와 상관 관계가 있는 쿼리를 말한다.
서브쿼리가 필요로 하는 item 테이블이 서브쿼리의 FROM 절에 있는게 아니라 outer query에 있기 때문에 독립적으로 실행이 안된다.