쿼리속에 존재하는 또 다른 쿼리로
먼저 수행된 쿼리의 결과를 가지고 다시 쿼리를 수행하는 문법
ex ) 수학점수가 평균보다 높은 학생을 조회
먼저 수학 점수를 평균을 서브 쿼리로 계산 → 그 결과를 기준으로 학생 정보를 필터링
먼저 실행되는 안쪽 쿼리가 서브 쿼리(Subquery) | 그 결과를 이용하는 바깥쪽 쿼리가 메인 쿼리(Main Query)
💡 서브 쿼리는 어느 위치에 쓰일까요?
SELECT절 | FROM절 | WHERE절 | JOIN절 등 다양한 위치에 쓰이나
각 위치에 따라 형태의 제약이 있음을 주위
📑 음료(beverages)의 이름 및 가격과 함께, 가장 비싼 음료와의 가격 차이를 조사하려 한다. 주어진 두 쿼리를 조합하여 이를 구하시오. (SELECT 절 서브쿼리를 사용할 것)
-- 음료명, 가격, 최대 가격과의 차이
SELECT
name AS "음료명",
price AS "가격",
price -(
-- 가장 비싼 음료의 가격(1x1)
SELECT
MAX(price)
FROM
beverages
) AS "최대 가격과의 차이"
FROM
beverages
;
📑 주문내역(order_details)로부터 주문 별 음료 개수의 평균을 조회하려 한다. 주어진 쿼리를 조합하여 이를 구하시오. (FROM 절 서브쿼리를 사용할 것)
SELECT
ROUND(AVG(SUM),2) AS "주문 별 음료 개수 평균"
FROM
(
-- 주문 별 음료 개수
SELECT
order_id,
SUM(count)
FROM
order_details
GROUP BY
order_id) AS "주문 별 음료 개수"
;
📑 주문내역(order_details)로부터 음료 별 주문 개수를 조회하려 한다. 주어진 두 쿼리를 조합하여 이를 구하시오. (JOIN 절 서브쿼리를 활용할 것)
📌 COALESCE(컬럼명, NULL일 시 넣어줄 값)
SELECT
name AS "음료명",
COALESCE(total_count, 0) AS "주문 개수" -- NULL 이면 0 됨
FROM
beverages
LEFT JOIN (SELECT
beverage_id,
SUM(count) AS total_count
FROM
order_details
GROUP BY
beverage_id
) AS b_counts ON
b_counts.beverage_id = beverages.id
;
📑 평균 가격보다 비싼 음료(beverages)를 다음과 같이 조회하려 한다. 주어진 두 쿼리를 조합하여 이를 구하시오. (WHERE 절 서브쿼리를 사용할 것)
SELECT
name AS "음료명",
price AS "가격"
FROM
beverages
WHERE
price > (
SELECT
AVG(price)
FROM
beverages
)
;