(DB실무) Part4-SQL 기본 및 활용-4.Join & Set Operation
2026년 11월 8일 공유
SQL 조인과 집합 연산
개요
조인은 여러 테이블을 논리적으로 연결해 통합 조회하는 연산이며, 정규화된 데이터베이스를 실무적으로 활용하는 데 필수적이다. 집합 연산은 여러
SELECT 결과를 합집합·교집합·차집합으로 결합한다. 강의에서는 조인의 유형과 문법, 계층형 질의, 집합 연산의 제약과 사용법을 다룬다.핵심 개념
- 조인은 테이블 구조를 변경하지 않고, 질의 과정에서 테이블을 일시적으로 연결한다.
- 조인은 실제로 두 테이블을 대상으로 수행되며, 여러 테이블은 조인을 연쇄적으로 적용해 연결한다.
- 조인 유형은 서로 다른 기준으로 분류된다. 예를 들어 조인은 동등 조인, 명시적 조인, 내부 조인의 성격을 동시에 가질 수 있다.
- 내부 조인은 양쪽 테이블에서 조건에 맞는 행만 반환하고, 외부 조인은 한쪽 또는 양쪽 테이블의 미일치 행도 포함한다.
- 집합 연산은
SELECT결과끼리 적용하며, 합치는 두 결과의 열 수와 열 위치별 데이터 형식이 호환되어야 한다.
상세 노트
관계형 연산과 조인의 역할
- 관계형 데이터베이스의 기본 연산에는 행을 선택하는 선택(Select), 열을 선택하는 투영(Project), 집합 연산 등이 있다.
- SQL에서는 행 선택을 주로
WHERE절에서, 열 선택을SELECT절에서 수행한다.
- 정규화는 삽입·삭제·갱신 이상을 줄이기 위해 테이블을 나누는 과정이다.
- 조인이 없다면 분리된 테이블을 함께 조회할 수 없으므로, 정규화된 데이터를 활용하기 어렵다.
- 조인은 테이블 자체를 변경하는 반정규화와 다르다. 질의 중에 필요한 테이블을 연결하는 연산이다.
- 일반적인 조인 기준은 기본 키와 외래 키의 관계지만, 다른 열을 기준으로도 조인할 수 있다.
조인 종류와 문법
카티션 프로덕트와 크로스 조인
- 조인 조건 없이 두 테이블의 모든 행 조합을 생성한다.
- 결과 행 수는 두 테이블 행 수의 곱이다. 예를 들어 14행과 4행을 결합하면 56행이 된다.
- 의도치 않게 조건을 빠뜨려도 카티션 프로덕트가 발생할 수 있으므로 주의한다.
동등 조인과 비동등 조인
- 동등 조인(Equi Join): 조인 조건에
=을 사용한다.
- 비동등 조인(Non-Equi Join):
BETWEEN,<,>등 동등 연산자가 아닌 조건으로 연결한다. 급여가 특정 범위에 속하는 등급을 찾는 예가 이에 해당한다.
- 테이블에 같은 이름의 열이 여러 개 있으면 열 이름 앞에 테이블명이나 별칭을 붙여야 모호성 오류를 피할 수 있다.
- 테이블 별칭을 정의한 뒤에는 해당 질의에서 원래 테이블명 대신 별칭을 사용한다. 가독성을 위해 중복 여부와 관계없이 열 앞에 별칭을 붙이는 것이 좋다.
암시적 조인과 명시적 조인
- 암시적 조인은
FROM절에 테이블을 나열하고 조인 조건과 일반 조건을 모두WHERE절에 둔다.
- 명시적 조인은
FROM절에JOIN을 표시하고, 조인 조건은ON, 일반 조건은WHERE에 둔다.
- 두 방식은 같은 조건이라면 동일한 결과를 낼 수 있지만, 명시적 조인은 조인 조건과 일반 조건이 분리되어 읽기 쉽다.
- 내부 조인은
INNER를 생략해JOIN으로 쓸 수 있다.
내부 조인과 외부 조인
- **내부 조인(Inner Join)**은 양쪽 테이블에서 조인 조건이 일치하는 행만 반환한다. 일치하지 않는 행은 결과에서 제외된다.
- **왼쪽 외부 조인(Left Outer Join)**은 왼쪽 테이블의 모든 행을 반환하고, 오른쪽에 대응 행이 없으면 오른쪽 열을
NULL로 채운다.
- **오른쪽 외부 조인(Right Outer Join)**은 오른쪽 테이블의 모든 행을 반환하고, 대응하는 왼쪽 행이 없으면 왼쪽 열을
NULL로 채운다.
- **완전 외부 조인(Full Outer Join)**은 양쪽 테이블의 모든 행을 포함한다.
LEFT JOIN,RIGHT JOIN,FULL JOIN에서는OUTER를 생략할 수 있다. 반면 일반JOIN은 기본적으로 내부 조인을 뜻한다.
- 외부 조인은 더 많은 행을 보존하므로 필요한 경우에 사용한다. 결과를 해석할 때
NULL이 어느 테이블의 미일치를 나타내는지 확인해야 한다.
자연 조인과 USING
- **자연 조인(Natural Join)**은 양쪽 테이블에 이름과 데이터 형식이 같은 열이 있으면, 그 모든 공통 열에 동등 조인을 적용한다.
- 조인 열과 조건을 자동으로 결정하므로 별도의
ON조건을 지정하지 않는다. 조인 대상 열에는 테이블 접두어를 붙이지 않는다.
- 자연 조인은 공통 열이 추가되거나 바뀌면 결과가 달라질 수 있으므로, 공통 열을 정확히 파악해야 한다.
USING절은 이름이 같은 조인 열 중 지정한 열만 사용해 연결한다. 여러 공통 열 중 일부만 조인 기준으로 삼을 때 유용하다.
USING에 지정한 열은 접두어를 붙이지 않으며, 괄호를 사용한다.
- 자연 조인은 모든 공통 열을 기준으로 삼지만,
USING은 지정한 열만 기준으로 삼는다는 점이 다르다.
셀프 조인과 계층형 질의
- **셀프 조인(Self Join)**은 같은 테이블을 두 번 이상 참조해 조인하는 방식이다.
- 직원과 관리자처럼 한 테이블 안에 자기 자신과의 관계가 저장된 경우에 사용한다.
- 같은 테이블을 서로 다른 역할로 구별해야 하므로 별칭이 필수적이다. 예를 들어 직원 별칭과 관리자 별칭을 각각 부여한다.
- 관리자가 없는 직원까지 표시하려면 내부 조인 대신 외부 조인을 사용한다.
계층형 질의
- 자기 참조 관계가 반복되어 부모·자식 구조를 이루면 계층형 데이터가 된다.
- 오라클의 계층형 질의에서는:
START WITH로 시작 행을 지정한다.
CONNECT BY PRIOR로 행 간 연결 관계와 탐색 방향을 지정한다.
- 부모에서 자식으로 내려가는 순방향 전개와 자식에서 부모로 올라가는 역방향 전개가 가능하다.
LEVEL은 시작 행을 기준으로 한 깊이를 나타내므로, 시작점과 탐색 방향에 따라 값이 달라진다.
CONNECT_BY_ISLEAF는 해당 행이 탐색 방향 기준의 말단 노드인지 나타낸다.
CONNECT_BY_ROOT는 각 결과 행이 어느 시작 행에서 비롯되었는지 보여 주며,SYS_CONNECT_BY_PATH는 시작점부터 현재 행까지의 경로를 표시하는 데 활용된다.
집합 연산
집합 연산은 두 개 이상의
SELECT 결과를 하나의 결과로 결합한다. 전체가 하나의 문장이므로 세미콜론은 마지막에만 붙인다.연산 종류
UNION: 합집합. 중복 행을 제거한다.
UNION ALL: 중복을 제거하지 않고 결과를 그대로 이어 붙인다. 중복 확인을 하지 않아 일반적으로UNION보다 빠르다.
INTERSECT: 교집합. 양쪽 결과에 모두 존재하는 행을 반환한다.
MINUS(오라클): 차집합. 첫 번째 결과에는 있고 두 번째 결과에는 없는 행을 반환한다. SQL Server에서는 대응 연산으로EXCEPT를 사용한다.
- 중복 행 처리 시 개별 결과 안의 중복도 고려한다. 집합 연산의 결과는
UNION ALL을 제외하면 중복이 제거된 집합으로 다룬다.
사용 제약과 정렬
- 결합되는
SELECT결과의 열 개수가 같아야 한다.
- 각 결과에서 같은 위치에 있는 열의 데이터 형식이 서로 호환 가능해야 한다.
- 형식이 호환되면 열 이름이나 의미가 달라도 오류가 나지 않을 수 있지만, 의미가 서로 다른 열을 결합하는 것은 바람직하지 않다.
ORDER BY는 집합 연산이 모두 끝난 뒤 문장 맨 마지막에 한 번만 지정한다.
- 정렬에 사용할 수 있는 열은 첫 번째
SELECT결과의 열 이름 또는 별칭을 기준으로 한다. 별칭을 사용했다면 정렬에서도 그 별칭을 사용한다.
다른 방식으로 표현하기
- 교집합은 두 조건을
AND로 결합해 구현할 수 있다.
- 합집합은 조건을
OR로 결합해 구현할 수 있다.
- 차집합은 두 번째 조건을 제외하는 방식으로 표현할 수 있으며, 서브쿼리와
NOT IN등을 사용해 구현할 수도 있다. 세부 문법은 서브쿼리 학습과 함께 다룬다.
- 왼쪽 외부 조인 결과와 오른쪽 외부 조인 결과를 합집합으로 결합하면 완전 외부 조인과 같은 결과를 구성할 수 있다. 중복을 제거하지 않는
UNION ALL을 쓰면 겹치는 행이 중복 출력될 수 있다.