
SELECT customer_id,
(SELECT MAX(payment_value) FROM payments) AS max_payment
FROM customers;
SELECT customer_id
FROM customers
WHERE customer_id IN (
SELECT customer_id
FROM orders
WHERE order_status = 'delivered'
);
SELECT customer_id, total_payment
FROM (
SELECT customer_id, SUM(payment_value) AS total_payment
FROM payments
GROUP BY customer_id
) AS payment_summary;
SELECT customer_id,
(SELECT COUNT(*)
FROM orders
WHERE orders.customer_id = customers.customer_id) AS order_count
FROM customers;
SELECT customer_id, SUM(payment_value) AS total_payment
FROM (
SELECT customer_id, payment_value
FROM payments
WHERE payment_date >= '2023-01-01'
) AS recent_payments
GROUP BY customer_id;
SELECT customer_id
FROM customers
WHERE age > ( -- 고객의 나이가 모든 고객의 평균 나이보다 큰 경우
SELECT AVG(age)
FROM customers
);
SELECT customer_id
FROM customers
WHERE customer_id IN ( --서브쿼리 결과값 중 하나라도 매칭되면 true
SELECT customer_id
FROM orders
WHERE order_status = 'shipped'
);
SELECT customer_id
FROM customers
WHERE age > ANY ( --서브쿼리 결과값 중 하나라도 조건을 만족하면 true
SELECT age
FROM customers
WHERE city = 'Seoul'
);
SELECT customer_id
FROM customers
WHERE age <= ALL ( -- 서브쿼리 결과값의 모든 조건을 만족해야 true
SELECT age
FROM customers
WHERE city = 'Seoul'
) AND city = 'Busan';
SELECT customer_id, name
FROM customers c
WHERE EXISTS ( -- 고객이 주문 기록이 있는 경우 참!
SELECT 1 -- SELECT * 와 동일하다는 점, 꼭 기억해주세요!
FROM orders o
WHERE o.customer_id = c.customer_id
);
-- 서브쿼리 결과가 한 행이라도 존재하면 True
SELECT customer_id
FROM customers
WHERE age > (
SELECT AVG(age)
FROM customers
);
예시 1
-- 상관 서브쿼리의 예1
SELECT order_id, customer_id, order_amount
FROM orders o1
WHERE order_amount > (
SELECT AVG(order_amount)
FROM orders o2
WHERE o1.customer_id = o2.customer_id
);
-- 상관 서브쿼리의 예1: JOIN으로 변환
SELECT o1.order_id, o1.customer_id, o1.order_amount
FROM orders o1
JOIN (
SELECT customer_id, AVG(order_amount) AS avg_order_amount
FROM orders
GROUP BY customer_id
) avg_orders
ON o1.customer_id = avg_orders.customer_id
WHERE o1.order_amount > avg_orders.avg_order_amount;
예시 2
-- 상관 서브쿼리의 예2
SELECT customer_id,
(SELECT COUNT(*)
FROM orders
WHERE orders.customer_id = customers.customer_id) AS order_count
FROM customers;
-- 상관 서브쿼리의 예2: JOIN으로 변환
SELECT c.customer_id, COUNT(o.order_id) AS order_count
FROM customers c
LEFT JOIN orders o
ON c.customer_id = o.customer_id
GROUP BY c.customer_id;
-- 상관 서브쿼리의 예2: 윈도우 함수로 변환!
SELECT customer_id, COUNT(order_id) OVER(PARTITION BY customer_id) AS order_count
FROM orders;