SQLD
2과목
11
업데이트 2026.08.11

서브쿼리와 집합 연산자 정리: IN·EXISTS·UNION 차이

단일행·다중행 서브쿼리, 상관 서브쿼리, IN·EXISTS와 UNION·UNION ALL·INTERSECT·MINUS의 차이를 정리합니다.

작성·검수 가풀 · 최종 검수 2026.08.11 · 공식 자료 확인 2026.08.11

이 글의 핵심

비교 연산자는 서브쿼리가 반환하는 행 수와 열 수에 맞아야 합니다.

EXISTS는 서브쿼리 결과값보다 관련 행의 존재 여부를 검사합니다.

UNION은 중복을 제거하고 UNION ALL은 중복을 유지합니다.

서브쿼리는 반환 형태부터 확인한다

서브쿼리를 보면 먼저 몇 개의 열과 몇 개의 행을 반환하는지 예상해야 합니다. 단일행 비교 연산자 =, <, >는 한 행이 반환된다는 전제가 필요하고, 여러 행이 가능하면 IN, ANY, ALL 같은 연산자를 검토합니다.

집계 함수만 SELECT하고 GROUP BY가 없다면 보통 한 행을 반환합니다. 반대로 부서별 GROUP BY가 있으면 부서 수만큼 여러 행이 나올 수 있습니다.

IN과 EXISTS를 의미로 구분하기

IN은 왼쪽 값이 오른쪽 결과 집합의 값 중 하나와 같은지 비교합니다. EXISTS는 상관 조건을 만족하는 행이 하나라도 존재하는지만 확인합니다.

“주문한 적 있는 고객”은 고객별 관련 주문의 존재 여부이므로 EXISTS로 자연스럽게 표현할 수 있습니다. EXISTS 안의 SELECT 목록은 존재 판단 자체에 영향을 주지 않아 관례적으로 SELECT 1을 사용합니다.

관련 주문이 있는 고객
SELECT c.customer_id
FROM customers c
WHERE EXISTS (
  SELECT 1
  FROM orders o
  WHERE o.customer_id = c.customer_id
);

상관 서브쿼리는 바깥 행을 참조한다

상관 서브쿼리는 내부 쿼리가 바깥 쿼리의 현재 행 값을 참조합니다. 개념적으로 바깥 행마다 관련 조건을 평가하므로 독립적으로 실행할 수 없는 형태입니다.

시험에서는 별칭의 범위를 확인하세요. 안쪽 블록에서 바깥 별칭을 참조할 수 있지만, 바깥 블록이 안쪽에서만 정의된 별칭을 참조할 수는 없습니다.

집합 연산자는 결과를 세로로 결합한다

조인이 열을 가로로 연결한다면 집합 연산자는 두 SELECT 결과의 행을 세로로 결합합니다. 각 SELECT는 열 개수가 같고 대응 열의 데이터 유형이 호환되어야 합니다.

연산자결과중복 처리
UNION두 결과의 합집합중복 제거
UNION ALL두 결과를 그대로 연결중복 유지
INTERSECT양쪽에 공통인 행중복 제거
MINUS / EXCEPT첫 결과에만 있는 행중복 제거

ORDER BY와 열 이름의 기준

집합 연산자로 여러 SELECT를 결합할 때 ORDER BY는 전체 결과의 마지막에 한 번 사용합니다. 최종 열 이름은 일반적으로 첫 번째 SELECT의 열 이름이나 별칭을 따릅니다.

UNION의 중복 제거가 필요하지 않다면 UNION ALL이 의미를 더 정확히 표현하고 불필요한 중복 제거 작업도 피할 수 있습니다. 다만 시험에서는 성능 추측보다 요구된 중복 처리 여부를 먼저 판단하세요.

서브쿼리와 집합 연산자 문제는 “행 수·열 수·NULL·중복” 네 항목을 먼저 표시하면 대부분의 함정을 찾을 수 있습니다.

자체 제작 사례: 주문 존재 여부와 주문 목록 결합을 구분하기

주문한 고객을 찾는 문제와 두 지역의 고객 목록을 합치는 문제를 비교합니다.

  1. 관련 행의 존재만 필요하면 상관 서브쿼리와 EXISTS를 후보로 둡니다.
  2. 두 결과 집합을 세로로 합칠 때는 UNION 계열을 사용하고 중복 제거 필요 여부를 판단합니다.
  3. NOT IN 후보 데이터에 NULL이 있을 때 UNKNOWN이 결과에 미치는 영향을 별도로 확인합니다.

값 비교, 존재 확인, 집합 결합 중 문제의 요구가 무엇인지 먼저 분류하면 연산자를 고르기 쉽습니다.

흔한 오답 사고 바로잡기

IN과 EXISTS는 언제나 같은 방식으로 NULL을 처리하고 결과도 항상 같다고 생각한다.

왜 틀리는가: 특히 부정 조건과 NULL이 함께 있으면 3값 논리 때문에 예상과 다른 결과가 생길 수 있습니다.

올바른 확인법: 후보 집합에 NULL이 있는지 확인하고 존재 판단이 목적이면 NOT EXISTS 형태도 비교합니다.

복습 체크리스트

단일 값·다중 값·존재 여부 중 요구사항 분류

서브쿼리 반환 열과 행 수 예상

UNION의 중복 제거 필요성 확인

NOT IN 사용 전 NULL 포함 가능성 점검


자주 묻는 질문

스칼라 서브쿼리는 여러 행을 반환할 수 있나요?

하나의 값이 필요한 위치에 사용되므로 한 행 한 열을 반환해야 합니다. 결과가 없으면 NULL이 될 수 있고 여러 행이면 오류가 발생합니다.

UNION과 JOIN은 언제 구분해서 사용하나요?

같은 구조의 결과 행을 위아래로 합치려면 UNION 계열을, 관련된 테이블의 열을 옆으로 연결하려면 JOIN을 사용합니다.

검수 기준과 공식 자료

이 글은 가풀이 직접 작성·검수했으며 실제 기출문제나 복원문제를 옮기지 않았습니다. 시험 일정과 세부 규정은 변경될 수 있으므로 접수 전 아래 공식 공고를 다시 확인하세요.

공식 자료 확인일 2026.08.11 · 가풀 편집 원칙 보기
2과목

SQL JOIN 완전 정리: INNER·OUTER·SELF JOIN 결과 읽는 법

읽기
2과목

GROUP BY와 HAVING 차이: SQLD 집계 문제 실수 줄이기

읽기
2과목

SQL NULL 완전 정리: COUNT·비교 연산·NVL에서 틀리지 않는 법

읽기