서브쿼리 (Subquery) 정리

TJK·2025년 8월 22일
0

서브쿼리 (Subquery) 정리

서브쿼리는 하나의 SQL문 안에 중첩된 또 다른 SQL문입니다. 특히 SELECT 절에서 서브쿼리를 사용하여 각 컬럼에 독립적인 값을 할당하는 방식은 SQLD 시험에 자주 출제되는 핵심 개념입니다.


1. 서브쿼리의 네 가지 유형 (★★★★★)

유형설명사용 연산자
스칼라 서브쿼리SELECT에서 단 하나의 값을 반환.단일 값
단일 행 서브쿼리WHERE, HAVING 절에서 단 하나의 행을 반환.=, >, <
다중 행 서브쿼리WHERE, HAVING 절에서 여러 행을 반환.IN, ANY, ALL
다중 열 서브쿼리WHERE 절에서 여러 컬럼을 반환.(col1, col2) 형태

2. SELECT 절에 적용되는 서브쿼리 (스칼라 서브쿼리)

  • 핵심: SELECT 절에 사용되는 서브쿼리는 각 컬럼에 독립적으로 값을 반환합니다.

  • 특징:

    • 반드시 단일 행, 단일 컬럼만 반환해야 합니다. (스칼라 = 단일 값)
    • 여러 컬럼에 각각 다른 서브쿼리를 넣을 수 있습니다.
    • 결과가 없으면 NULL을 반환하고, 여러 행이면 오류가 발생합니다.
  • 예시:

    SELECT
        e.name,
        (SELECT dept_name FROM Department d WHERE d.dept_id = e.dept_id) as dept_name,
        (SELECT MAX(salary) FROM Employee) as max_salary
    FROM Employee e;
    • dept_name 컬럼은 각 행의 dept_id에 따라 다른 부서명을 반환합니다. (상관 서브쿼리)
    • max_salary 컬럼은 모든 행에 동일한 최대 급여 값을 반환합니다. (일반 서브쿼리)

3. SQLD 시험 핵심 포인트

  • SELECT 절 서브쿼리 = 스칼라 서브쿼리: SELECT 절의 서브쿼리는 항상 **하나의 값(스칼라)**을 반환해야 한다는 점을 기억하세요.
  • 오류 유형: 단일 행 서브쿼리가 여러 행을 반환하거나, 스칼라 서브쿼리가 여러 행을 반환하면 오류가 발생합니다.
  • 다중 행 연산자: IN, ANY, ALL다중 행 서브쿼리와 함께 사용된다는 것을 명심해야 합니다.

4. 최종 암기 팁

  • SELECT 절: "각 컬럼마다 하나씩, 스칼라처럼!"
  • WHERE =: "비교 대상이 하나만 있을 때!"
  • WHERE IN: "비교 대상이 여러 개 있을 때!"

실전 기출 문제 스타일

1. 다음 쿼리의 실행 결과는?

SELECT
    (SELECT COUNT(*) FROM Students WHERE grade = 1),
    (SELECT COUNT(*) FROM Students WHERE grade = 2)
FROM DUAL;

A. 1학년 학생 수와 2학년 학생 수가 각각 다른 컬럼에 출력된다.
B. 1학년 학생 수만 출력된다.
C. 2학년 학생 수만 출력된다.
D. 에러가 발생한다.

2. 다음 중 서브쿼리 결과가 여러 행일 때 WHERE 절에서 사용할 수 있는 연산자는?
A. =
B. >
C. ANY
D. <>

3. 스칼라 서브쿼리에 대한 설명으로 가장 옳지 않은 것은?
A. 반드시 하나의 컬럼과 하나의 행을 반환해야 한다.
B. SELECT 절에서 각 행마다 독립적으로 값을 반환한다.
C. 서브쿼리 결과가 없을 경우 NULL이 반환된다.
D. WHERE 절에서만 사용할 수 있다.


정답 및 해설

  • 문제 1 정답: A
    • 해설: SELECT 절의 서브쿼리는 스칼라 서브쿼리로, 각각의 서브쿼리가 독립적인 값을 반환하여 별도의 컬럼에 출력됩니다.
  • 문제 2 정답: C
    • 해설: => 같은 단일 행 연산자는 서브쿼리 결과가 여러 행일 때 오류를 발생시킵니다. ANY, ALL, IN은 다중 행 서브쿼리와 함께 사용됩니다.
  • 문제 3 정답: D
    • 해설: 스칼라 서브쿼리는 주로 SELECT 절에서 사용되며, WHERE, GROUP BY, ORDER BY 등 다양한 절에서 활용될 수 있습니다. WHERE 절에서만 사용된다는 설명은 틀렸습니다.
profile
Hello world!

0개의 댓글