SQL 서브쿼리(Subquery) 구조, 용도
서브쿼리(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 등 거의 모든 위치에서 사용 가능합니다.
댓글남기기