[Database] MySQL 실습(4) - 서브쿼리(Subquery)

우유·2026년 2월 3일

[Cloud] Database

목록 보기
7/28

4. 서브쿼리(Subquery)


1) 서브쿼리란

서브쿼리는“쿼리 안에서 또 다른 쿼리를 실행해그 결과를 조건이나 값으로 사용하는 방법”이다.


2) 왜 서브쿼리가 필요한가?

SQL을 쓰다 보면 이런 상황이 생긴다.

“이 조건을 만족하는 값들을 먼저 구한 뒤, 그 결과를 가지고 다시 조회하고 싶다.”

  • 이럴 때 쓰는 게 서브쿼리

3) 서브쿼리의 기본 구조

SELECT 컬럼
FROM 테이블
WHERE 컬럼 IN (
  SELECT 컬럼
  FROM 테이블
  WHERE 조건
);
  • 안쪽 쿼리(서브쿼리) 먼저 실행
  • 결과를 바깥 쿼리에서 사용

4) 서브쿼리의 위치별 분류

서브쿼리는 어디에 쓰이느냐에 따라 나뉜다.


4-1) WHERE 절 서브쿼리

예제: 주문이 있는 고객만 조회

SELECT *
FROM customers
WHERE customer_id IN (
  SELECT customer_id
  FROM orders
);

의미:

orders에 등장한 customer_id만 고객에서 조회


4-2) SELECT 절 서브쿼리 (스칼라 서브쿼리)

예제: 주문별 총 아이템 수 출력

SELECT
  o.order_id,
  (
    SELECT SUM(quantity)
    FROM order_items oi
    WHERE oi.order_id = o.order_id
  ) AS total_qty
FROM orders o;

특징:

  • 서브쿼리는 반드시 단일 값(1행 1열) 반환
  • 행마다 실행됨 → 성능 주의 ⚠️
  • order_items에 없는 order_id의 값까지 출력

4-3) FROM 절 서브쿼리 (파생 테이블)

예제: 주문 합계를 먼저 계산하고 조회

SELECT *
FROM (
  SELECT order_id, SUM(quantity) AS qty
  FROM order_items
  GROUP BY order_id
) t
WHERE t.qty >= 3;

의미:

  • 서브쿼리 결과를 임시 테이블처럼 사용 -> 뷰 (VIEW)
  • 복잡한 집계 → 단계 분리할 때 유용

5) 서브쿼리 vs JOIN

같은 문제, 두 가지 방식

서브쿼리

SELECT *
FROM customers
WHERE customer_id IN (
  SELECT customer_id
  FROM orders
);

JOIN

SELECT DISTINCT c.*
FROM customers c
JOIN orders o
  ON c.customer_id = o.customer_id;

차이 요약

구분서브쿼리JOIN
가독성직관적관계 명확
성능느릴 수 있음일반적으로 빠름
옵티마이저제한적최적화 유리
실무제한적주력
  • 실무에서는 JOIN이 우선,
  • 서브쿼리는 “의도가 명확할 때”

6) 상관 서브쿼리

바깥 쿼리의 값을안쪽 쿼리가 참조하는 구조


예제: 고객별 주문 수가 2건 이상인 고객

SELECT *
FROM customers c
WHERE (
  SELECT COUNT(*)
  FROM orders o
  WHERE o.customer_id = c.customer_id
) >= 2;

문제점:

  • customers 한 행마다
  • orders를 다시 조회

데이터 많아지면 성능 급락


JOIN으로 바꾸면

SELECT c.*
FROM customers c
JOIN orders o
  ON c.customer_id = o.customer_id
GROUP BY c.customer_id
HAVING COUNT(*) >= 2;

7) EXISTS 서브쿼리

특징

  • 결과 값 자체가 중요 ❌
  • 존재 여부만 체크

예제: 주문이 있는 고객 조회

SELECT *
FROM customers c
WHERE EXISTS (
  SELECT 1
  FROM orders o
  WHERE o.customer_id = c.customer_id
);

장점:

  • 조건 만족하면 즉시 종료
  • IN보다 효율적인 경우 많음
profile
Front-end Developer, Cloud Engineer

0개의 댓글