SQL JOIN & 집합 연산자 정리

TJK·2025년 8월 22일
0

SQL JOIN & 집합 연산자 정리

JOIN집합 연산자는 SQL에서 여러 테이블의 데이터를 결합하는 필수적인 방법입니다. JOIN컬럼을 가로로, 집합 연산자는 행을 세로로 결합한다는 근본적인 차이가 있으며, SQLD 시험에서는 이 둘을 명확히 구분하는 능력을 요구합니다.


1. JOIN (가로 결합) (★★★★★)

두 테이블의 특정 컬럼을 기준으로 행을 연결합니다.

유형설명시험 포인트
INNER JOIN조인 조건에 맞는 공통된 행만 반환.가장 기본적인 조인. 두 테이블의 교집합.
OUTER JOIN조건에 맞지 않는 행도 포함.LEFT, RIGHT, FULL이 있으며, NULL이 포함됩니다.
LEFT JOIN왼쪽 테이블의 모든 행 + 오른쪽의 일치하는 행.LEFT JOIN + WHERE B.col IS NOT NULLINNER JOIN과 동일.
NATURAL JOIN공통된 이름의 모든 컬럼을 기준으로 자동 조인.의도치 않은 결과를 낳을 수 있어 주의 필요. USING과 유사.

2. 집합 연산자 (세로 결합) (★★★★★)

SELECT 문의 결과 집합을 합칩니다. 두 쿼리의 컬럼 수와 데이터 타입이 동일해야 합니다.

유형설명시험 포인트
UNION두 쿼리 결과의 중복을 제거하고 합침.**자동으로 ORDER BY**가 실행되어 정렬됩니다.
UNION ALL두 쿼리 결과를 중복을 포함하여 모두 합침.UNION보다 빠릅니다.
INTERSECT두 쿼리 결과의 공통된 행만 반환.두 쿼리의 교집합.
MINUS첫 번째 쿼리에서 두 번째 쿼리의 겹치는 행을 제외.Oracle 전용. ANSI SQL은 EXCEPT. 순서에 따라 결과가 달라짐.

3. JOIN vs 집합 연산자 비교 (★★★★★)

구분JOIN집합 연산자
결합 방향가로 (컬럼 추가)세로 (행 추가)
필요 조건조인 키(컬럼)두 쿼리의 컬럼 수데이터 타입
사용 목적테이블 간 관계 탐색여러 쿼리 결과의 집합 연산
예시A INNER JOIN B ON A.id = B.idSELECT * FROM A UNION SELECT * FROM B

4. SQLD 시험 핵심 포인트

  • JOINON 또는 USING 조건을 기준으로 컬럼을 연결하고, 집합 연산자는 두 쿼리 결과를 단위로 결합합니다.
  • INNER JOININTERSECT는 모두 교집합 개념이지만, INNER JOIN은 테이블의 특정 컬럼을, INTERSECT는 쿼리 결과의 전체 행을 비교합니다.
  • UNIONDISTINCT가 포함된 것처럼 중복을 제거하지만, UNION ALL은 중복을 그대로 둡니다.

실전 기출 문제 스타일

1. 다음 쿼리의 실행 결과는?

SELECT employee_id, employee_name
FROM employees
MINUS
SELECT employee_id, employee_name
FROM retired_employees;

A. employees 테이블의 모든 행이 반환된다.
B. retired_employees 테이블의 모든 행이 반환된다.
C. employees 테이블에만 존재하는 행이 반환된다.
D. 두 테이블에 공통으로 존재하는 행만 반환된다.

2. JOIN집합 연산자의 차이점을 설명한 것으로 가장 올바른 것은?
A. JOIN은 행을 세로로, 집합 연산자는 컬럼을 가로로 결합한다.
B. JOIN은 두 테이블의 공통 컬럼이 필요하고, 집합 연산자는 필요하지 않다.
C. JOIN은 테이블의 컬럼을 기준으로 가로로 결합하고, 집합 연산자는 쿼리 결과의 행을 기준으로 세로로 결합한다.
D. JOINWHERE 절을 통해 구현할 수 있지만, 집합 연산자는 불가능하다.

3. 다음 중 employees 테이블에 있는 모든 직원의 이름과 retired_employees 테이블에 있는 모든 은퇴 직원의 이름을 중복 없이 합쳐서 조회하는 SQL 문은?
A. SELECT name FROM employees INTERSECT SELECT name FROM retired_employees;
B. SELECT name FROM employees UNION ALL SELECT name FROM retired_employees;
C. SELECT name FROM employees UNION SELECT name FROM retired_employees;
D. SELECT name FROM employees MINUS SELECT name FROM retired_employees;

정답 및 해설

  • 문제 1 정답: C
    • 해설: MINUS는 첫 번째 쿼리 결과에서 두 번째 쿼리의 결과와 겹치는 부분을 제외한 나머지를 반환합니다. 따라서 employees에는 있지만 retired_employees에는 없는 행, 즉 현재 직원들의 정보만 남게 됩니다.
  • 문제 2 정답: C
    • 해설: JOINON 조건에 따라 테이블의 컬럼을 가로로 연결하고, 집합 연산자는 두 쿼리 결과의 행을 세로로 합칩니다.
  • 문제 3 정답: C
    • 해설: "중복 없이 합쳐서"라는 조건은 UNION을 사용해야 합니다. UNION ALL은 중복을 허용하고, INTERSECT는 교집합, MINUS는 차집합을 구합니다.
profile
Hello world!

0개의 댓글