서브쿼리는“쿼리 안에서 또 다른 쿼리를 실행해그 결과를 조건이나 값으로 사용하는 방법”이다.
SQL을 쓰다 보면 이런 상황이 생긴다.
“이 조건을 만족하는 값들을 먼저 구한 뒤, 그 결과를 가지고 다시 조회하고 싶다.”
- 이럴 때 쓰는 게 서브쿼리
SELECT 컬럼
FROM 테이블
WHERE 컬럼 IN (
SELECT 컬럼
FROM 테이블
WHERE 조건
);
서브쿼리는 어디에 쓰이느냐에 따라 나뉜다.
SELECT *
FROM customers
WHERE customer_id IN (
SELECT customer_id
FROM orders
);
의미:
orders에 등장한 customer_id만 고객에서 조회
SELECT
o.order_id,
(
SELECT SUM(quantity)
FROM order_items oi
WHERE oi.order_id = o.order_id
) AS total_qty
FROM orders o;
특징:
SELECT *
FROM (
SELECT order_id, SUM(quantity) AS qty
FROM order_items
GROUP BY order_id
) t
WHERE t.qty >= 3;
의미:
SELECT *
FROM customers
WHERE customer_id IN (
SELECT customer_id
FROM orders
);
SELECT DISTINCT c.*
FROM customers c
JOIN orders o
ON c.customer_id = o.customer_id;
| 구분 | 서브쿼리 | JOIN |
|---|---|---|
| 가독성 | 직관적 | 관계 명확 |
| 성능 | 느릴 수 있음 | 일반적으로 빠름 |
| 옵티마이저 | 제한적 | 최적화 유리 |
| 실무 | 제한적 | 주력 |
바깥 쿼리의 값을안쪽 쿼리가 참조하는 구조
SELECT *
FROM customers c
WHERE (
SELECT COUNT(*)
FROM orders o
WHERE o.customer_id = c.customer_id
) >= 2;
문제점:
데이터 많아지면 성능 급락
SELECT c.*
FROM customers c
JOIN orders o
ON c.customer_id = o.customer_id
GROUP BY c.customer_id
HAVING COUNT(*) >= 2;
SELECT *
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);
장점: