이 글의 핵심
비교 연산자는 서브쿼리가 반환하는 행 수와 열 수에 맞아야 합니다.
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·중복” 네 항목을 먼저 표시하면 대부분의 함정을 찾을 수 있습니다.
자체 제작 사례: 주문 존재 여부와 주문 목록 결합을 구분하기
주문한 고객을 찾는 문제와 두 지역의 고객 목록을 합치는 문제를 비교합니다.
- 관련 행의 존재만 필요하면 상관 서브쿼리와 EXISTS를 후보로 둡니다.
- 두 결과 집합을 세로로 합칠 때는 UNION 계열을 사용하고 중복 제거 필요 여부를 판단합니다.
- NOT IN 후보 데이터에 NULL이 있을 때 UNKNOWN이 결과에 미치는 영향을 별도로 확인합니다.
값 비교, 존재 확인, 집합 결합 중 문제의 요구가 무엇인지 먼저 분류하면 연산자를 고르기 쉽습니다.
흔한 오답 사고 바로잡기
IN과 EXISTS는 언제나 같은 방식으로 NULL을 처리하고 결과도 항상 같다고 생각한다.
왜 틀리는가: 특히 부정 조건과 NULL이 함께 있으면 3값 논리 때문에 예상과 다른 결과가 생길 수 있습니다.
올바른 확인법: 후보 집합에 NULL이 있는지 확인하고 존재 판단이 목적이면 NOT EXISTS 형태도 비교합니다.
복습 체크리스트
단일 값·다중 값·존재 여부 중 요구사항 분류
서브쿼리 반환 열과 행 수 예상
UNION의 중복 제거 필요성 확인
NOT IN 사용 전 NULL 포함 가능성 점검
자주 묻는 질문
스칼라 서브쿼리는 여러 행을 반환할 수 있나요?
하나의 값이 필요한 위치에 사용되므로 한 행 한 열을 반환해야 합니다. 결과가 없으면 NULL이 될 수 있고 여러 행이면 오류가 발생합니다.
UNION과 JOIN은 언제 구분해서 사용하나요?
같은 구조의 결과 행을 위아래로 합치려면 UNION 계열을, 관련된 테이블의 열을 옆으로 연결하려면 JOIN을 사용합니다.
검수 기준과 공식 자료
이 글은 가풀이 직접 작성·검수했으며 실제 기출문제나 복원문제를 옮기지 않았습니다. 시험 일정과 세부 규정은 변경될 수 있으므로 접수 전 아래 공식 공고를 다시 확인하세요.
- SQL 개발자 자격시험 공식 안내 — 한국데이터산업진흥원 데이터자격시험