조인·집합 연산

정보처리실무 · SQL·데이터베이스

이 페이지의 목차

학습 목표

조인은 매칭되는 행 쌍을 만들고 집합 연산은 결과 행들을 합친다.

본문

핵심 이론

INNER JOIN은 조건에 맞는 행 쌍만 남긴다. 한 행에 상대편 두 행이 매칭되면 결과도 두 행이다. CROSS JOIN의 행 수는 두 행 수의 곱이다.

LEFT JOIN은 왼쪽 미매칭 행도 오른쪽 NULL로 확장해 남긴다. 오른쪽 조건을 ON에 두는 것과 WHERE에 두는 것은 결과가 다를 수 있다.

UNION은 중복 제거, UNION ALL은 중복 유지, INTERSECT는 공통 행, EXCEPT는 왼쪽에만 있는 행이다. Oracle의 MINUS 등 방언 차이는 문제 조건에 맞춘다.

집합 연산은 대응 열 수·타입이 호환되어야 한다. 먼저 각 SELECT 결과를 계산하고 중복 처리 규칙을 적용한 뒤 최종 ORDER BY를 적용한다.

개념 도식

전체 맞춤새 창 보기
조인·집합 연산의 관계와 흐름을 보여 주는 도식

조인 결과는 조건을 만족하는 행 쌍의 목록이다

왼쪽 키 A가 2행, 오른쪽 키 A가 3행이면 해당 키의 동등 조인 결과는 2×3=6행이다. 조인 뒤의 COUNT나 SUM은 이 결과 행을 대상으로 한다. 원본 한쪽 표만 세면 집계가 달라진다.

LEFT JOIN은 연결 상대가 없는 왼쪽 행도 남기고 오른쪽 열을 NULL로 채운다. 직원 1에게 수당 두 건, 직원 2에게 수당이 없다면 조인 후 직원 1은 두 행, 직원 2는 NULL이 붙은 한 행이다. COUNT(*)는 직원 2의 행도 세지만 COUNT(수당의 비NULL 키)는 0이다.

연산중복 처리확인할 점
UNION ALL두 결과를 그대로 이어 붙임합친 전체 행 수
UNION같은 결과 행 제거모든 열이 같은 행인지
CROSS JOIN모든 행 쌍왼쪽 행 수 × 오른쪽 행 수

풀이에서는 조인표를 만든 뒤 필터·집계·정렬을 적용한다. OUTER JOIN 뒤 WHERE에서 오른쪽 열의 값만 요구하면 NULL 확장 행이 제외될 수 있다. ON 조건에서 상대를 고르는 것과 WHERE에서 완성된 행을 거르는 것을 구별한다. 실행계획 튜닝이나 조인 알고리즘 구현까지 다루지는 않는다.

풀이 예시

아래 테이블에 대해 SQL을 실행한 결과를 열의 순서대로 쓰시오. NULL은 NULL로 표기한다.

[A]

n
1
1
4

[B]

n
1
3

[실행할 SQL]

SQL
SELECT (SELECT COUNT(*) FROM (SELECT n FROM A UNION SELECT n FROM B)) AS u, (SELECT COUNT(*) FROM (SELECT n FROM A UNION ALL SELECT n FROM B)) AS ua;
정답과 풀이 보기

예시 정답

예시·텍스트
3 | 5

풀이 과정

UNION은 두 입력의 중복을 없애 {1,3,4}의 세 행이다. UNION ALL은 첫 테이블의 세 행과 둘째의 두 행을 모두 남겨 다섯 행이다.

복습 문제

답을 생각한 뒤 정답과 근거를 펼쳐 보세요.

01

LEFT JOIN 뒤 오른쪽 테이블 조건을 WHERE에 두면 NULL 확장 행이 사라질 수 있는가?

정답과 근거

그렇다. 오른쪽 조건이 거짓 또는 UNKNOWN이 되어 외부 조인이 사실상 내부 조인처럼 될 수 있다.

02

UNION과 UNION ALL의 중복 처리 차이는 무엇인가?

정답과 근거

UNION은 중복을 제거하고 UNION ALL은 모든 행을 유지한다.