서브쿼리(Subquery) 정리

TJK·2025년 8월 22일

서브쿼리(Subquery) 정리

서브쿼리는 하나의 SQL 문장 안에 포함된 또 다른 SELECT 문을 의미합니다. SQLD 시험에서는 서브쿼리의 다양한 유형과 각 유형에 맞는 연산자 사용법, 그리고 성능 측면에서의 특징을 정확히 이해하는 것이 중요합니다.


1. 서브쿼리 기본 개념

  • 정의: 메인 쿼리를 보조하는 SELECT 문.
  • 실행 순서: 서브쿼리가 먼저 실행되어 결과를 반환하면, 메인 쿼리가 그 결과를 이용하여 최종 결과를 도출합니다.
  • 문법: 반드시 괄호 ( )로 감싸야 합니다.

2. 서브쿼리 유형별 특징 (★★★★★)

(1) 단일 행 서브쿼리 (Single-row Subquery)

  • 결과: 단 하나의 행(0 또는 1건)만 반환합니다.
  • 연산자: WHERE 절에서 =, > , <, >= , <= , <>단일 비교 연산자를 사용합니다.
  • 시험 함정: 서브쿼리 결과가 여러 행이면 ORA-01427 같은 오류가 발생합니다.

(2) 다중 행 서브쿼리 (Multi-row Subquery)

  • 결과: 여러 행을 반환합니다.
  • 연산자: IN, ANY, ALL, EXISTS다중 행 비교 연산자를 사용해야 합니다.
    • IN: 서브쿼리 결과 중 하나라도 일치하는지 확인.
    • > ANY: 서브쿼리 결과 중 최솟값보다 큰지 확인.
    • < ANY: 서브쿼리 결과 중 최댓값보다 작은지 확인.
    • > ALL: 서브쿼리 결과 중 최댓값보다 큰지 확인.
    • < ALL: 서브쿼리 결과 중 최솟값보다 작은지 확인.
  • 시험 함정: > 또는 = 같은 단일 비교 연산자를 사용하면 오류가 발생합니다.

(3) 스칼라 서브쿼리 (Scalar Subquery)

  • 결과: 반드시 1행 1열만 반환합니다.
  • 사용 위치: 주로 SELECT 절이나 ORDER BY 절에서 사용됩니다.

(4) 인라인 뷰 (Inline View)

  • 사용 위치: FROM 절에서 사용되는 서브쿼리입니다.
  • 역할: 임시 테이블처럼 동작하며, 복잡한 쿼리를 간결하게 만듭니다.

(5) 상관 서브쿼리 (Correlated Subquery)

  • 특징: 메인쿼리의 한 행에 대해 서브쿼리가 반복적으로 실행됩니다.
  • 성능: 메인쿼리의 행 수만큼 서브쿼리가 반복되므로, 성능 저하의 원인이 될 수 있습니다. EXISTS와 함께 자주 사용됩니다.

3. SQLD 시험 핵심 포인트

  • 단일행 vs 다중행 연산자 구분: IN, ANY, ALL, EXISTS는 다중행 서브쿼리에만 사용 가능. 단일 비교 연산자(=, >)는 단일 행에만 사용 가능.
  • IN vs EXISTS: IN은 서브쿼리의 모든 결과를 메모리에 로드한 후 비교하지만, EXISTS는 조건을 만족하는 첫 번째 행이 발견되면 바로 종료되므로, 대용량 데이터에서는 EXISTS가 더 효율적일 수 있습니다.
  • > ANY vs > ALL: ANY가장 작은 값보다 큰지, ALL가장 큰 값보다 큰지 비교합니다.

4. 암기 팁

  • 단일행 → 단일 연산자 (=, >)
  • 다중행 → 다중 연산자 (IN, ANY, ALL, EXISTS)
  • > ANY = Min 보다 크다.
  • > ALL = Max 보다 크다.

5. 실전 기출 문제 스타일

1. 다음 쿼리가 실행되었을 때 예상되는 오류는?
(단, 서브쿼리의 결과는 여러 건이다.)

SELECT * FROM Emp WHERE deptno = (SELECT deptno FROM Dept WHERE loc IN ('DALLAS', 'NEW YORK'));

A. 문법 오류
B. 결과가 0건인 경우
C. 단일행 서브쿼리가 여러 행을 반환하여 발생하는 오류
D. 다중행 서브쿼리가 단일 행을 반환하여 발생하는 오류

2. 다음 SQL문이 의미하는 바는?

SELECT * FROM Emp WHERE sal > ANY (SELECT sal FROM Emp WHERE job = 'SALESMAN');

A. SALESMAN의 평균 급여보다 많은 급여를 받는 사원
B. SALESMAN 중 가장 적은 급여를 받는 사원보다 많은 급여를 받는 사원
C. SALESMAN 중 가장 많은 급여를 받는 사원보다 많은 급여를 받는 사원
D. SALESMAN의 급여와 동일한 급여를 받는 사원

3. 다음 서브쿼리 유형과 그 특징이 올바르게 연결된 것은?
A. 스칼라 서브쿼리 - FROM 절에서 사용되는 임시 테이블
B. 인라인 뷰 - SELECT 절에서 사용되며 1행 1열만 반환
C. 상관 서브쿼리 - 메인 쿼리 한 행마다 반복적으로 실행
D. 다중 행 서브쿼리 - > 연산자와 함께 사용 가능


정답 및 해설

  • 문제 1 정답: C
    • 해설: 서브쿼리의 결과가 'DALLAS'와 'NEW YORK' 두 건이므로 다중 행이 반환됩니다. 하지만 메인 쿼리에서 =라는 단일 비교 연산자를 사용했기 때문에 오류가 발생합니다.
  • 문제 2 정답: B
    • 해설: > ANY는 서브쿼리 결과의 최솟값보다 크다는 의미이므로, SALESMAN의 급여 중 가장 작은 값보다 큰 모든 급여를 반환합니다.
  • 문제 3 정답: C
    • 해설: A와 B는 서로 바뀌어 설명되었습니다. D는 >가 아닌 IN, ANY, ALL 등 다중 행 연산자를 사용해야 합니다. 상관 서브쿼리는 메인 쿼리와 연결되어 각 행마다 반복 실행되는 특징이 있습니다.
profile
Hello world!

0개의 댓글