2 분 소요

서브쿼리(Subquery)다른 SQL 문 안에 포함된 SELECT 문으로, 복잡한 조건을 간단히 처리하거나 하나의 값 또는 테이블을 생성할 수 있습니다. JOIN과 달리 데이터를 계층적으로 조회하는 방식입니다.


🔍 1. 서브쿼리란?

구분 설명
서브쿼리 다른 쿼리 내부에 포함된 SELECT 문
외부 쿼리 서브쿼리를 포함하는 쿼리 (메인 쿼리)
실행 순서 내부 쿼리(서브쿼리) 먼저 → 외부 쿼리 실행
표현 방식 반드시 괄호로 감싸야 하며, SELECT, FROM, WHERE 등에서 사용 가능

🧱 2. 서브쿼리 기본 문법

SELECT 컬럼
FROM 테이블
WHERE 컬럼 IN (
    SELECT 컬럼
    FROM 다른_테이블
    WHERE 조건
);

🧪 3. 실전 예제

✅ 3.1. WHERE 절에서 서브쿼리

SELECT ID, ReserveDate
FROM Reservation
WHERE Name IN (
    SELECT Name
    FROM Customer
    WHERE Address = '서울'
);

Customer 테이블에서 서울 거주 고객의 이름을 가져와 Reservation에서 필터링


✅ 3.2. FROM 절에서 서브쿼리 (인라인 뷰)

SELECT Name, ReservedRoom
FROM (
    SELECT Name, RoomNum + 1 AS ReservedRoom
    FROM Reservation
    WHERE RoomNum > 1001
) AS SubResult;

RoomNum이 1001 초과인 레코드를 임시 테이블처럼 활용


✅ 3.3. SELECT 절에서 서브쿼리

SELECT Name,
    (SELECT COUNT(*)
     FROM Reservation r
     WHERE r.Name = c.Name) AS ReservationCount
FROM Customer c;

각 고객의 예약 횟수를 함께 표시


🧩 4. 다양한 활용 위치

위치 예시 설명
WHERE 특정 조건 비교: RoomNum = (SELECT MAX(RoomNum) FROM Reservation)
FROM 인라인 뷰처럼 활용: FROM (SELECT ...) AS 별칭
SELECT 계산된 컬럼: SELECT Name, (SELECT COUNT(*) FROM ...) AS 컬럼명
EXISTS 존재 여부 확인: WHERE EXISTS (SELECT 1 FROM ...)

⚖️ 5. 서브쿼리 vs JOIN

항목 서브쿼리 JOIN
복잡성 단순한 비교나 값 추출에 적합 여러 테이블 간 관계를 직접 결합해야 할 때 유리
가독성 서브쿼리가 간단할수록 명확 복잡한 관계는 JOIN이 더 명확하게 표현됨
성능 대량의 데이터나 중첩 쿼리는 성능 저하 가능 인덱스를 활용한 조인 시 일반적으로 성능이 더 우수
재사용성 결과는 일회성 → 복합 쿼리에 활용 JOIN 결과는 다른 JOIN으로 쉽게 확장 가능

⚠️ 6. 주의 사항

  • 중첩 서브쿼리 과다 사용 지양: 성능 저하 및 가독성 문제
  • 서브쿼리의 결과는 수정 불가
  • 외부 쿼리의 값을 참조할 경우 명확한 alias 필요
  • SELECT 절 서브쿼리는 레코드 수만큼 반복 실행되므로 성능 유의

💡 7. 실전 패턴 모음

🎯 7.1. 평균보다 높은 가격의 예약 조회

SELECT *
FROM Reservation
WHERE Price > (
    SELECT AVG(Price)
    FROM Reservation
);

🎯 7.2. 가장 최근 예약 날짜 조회

SELECT *
FROM Reservation
WHERE ReserveDate = (
    SELECT MAX(ReserveDate)
    FROM Reservation
);

🎯 7.3. 고객이 한 예약 수 계산

SELECT Name,
    (SELECT COUNT(*)
     FROM Reservation r
     WHERE r.Name = c.Name) AS TotalReservations
FROM Customer c;

📌 8. 요약

항목 설명
서브쿼리 위치 SELECT, FROM, WHERE, HAVING 등
서브쿼리 장점 복잡한 조건을 분리하여 명확하게 표현
성능 주의 반복 실행되는 서브쿼리는 성능 저하 가능
JOIN과 선택 서브쿼리는 값 비교, JOIN은 관계 결합에 적합

질문 정리

❓ 서브쿼리 안에 또 서브쿼리 넣을 수 있나요?

→ 가능합니다. 하지만 과도한 중첩은 성능에 악영향을 줄 수 있어 주의해야 합니다.

❓ SELECT 절에서 서브쿼리는 언제 사용하나요?

→ 특정 행에 대한 관련 데이터의 요약 정보(합계, 개수 등)를 계산할 때 유용합니다.

❓ 성능을 고려하면 JOIN이 낫나요?

대량 데이터에서는 JOIN이 성능이 더 나은 경우가 많습니다. 서브쿼리는 가독성 중심 작업에 적합합니다.

❓ 서브쿼리는 WHERE 외에도 사용할 수 있나요?

→ 네, SELECT, FROM, HAVING, INSERT, UPDATE 등 거의 모든 위치에서 사용 가능합니다.

카테고리:

업데이트:

댓글남기기