alt

(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을 쓰면 겹치는 행이 중복 출력될 수 있다.
공개 노트 모두 보기