JOIN
과 집합 연산자는 SQL에서 여러 테이블의 데이터를 결합하는 필수적인 방법입니다. JOIN
은 컬럼을 가로로, 집합 연산자는 행을 세로로 결합한다는 근본적인 차이가 있으며, SQLD 시험에서는 이 둘을 명확히 구분하는 능력을 요구합니다.
두 테이블의 특정 컬럼을 기준으로 행을 연결합니다.
유형 | 설명 | 시험 포인트 |
---|---|---|
INNER JOIN | 조인 조건에 맞는 공통된 행만 반환. | 가장 기본적인 조인. 두 테이블의 교집합. |
OUTER JOIN | 조건에 맞지 않는 행도 포함. | LEFT , RIGHT , FULL 이 있으며, NULL 값이 포함됩니다. |
LEFT JOIN | 왼쪽 테이블의 모든 행 + 오른쪽의 일치하는 행. | LEFT JOIN + WHERE B.col IS NOT NULL 은 INNER JOIN 과 동일. |
NATURAL JOIN | 공통된 이름의 모든 컬럼을 기준으로 자동 조인. | 의도치 않은 결과를 낳을 수 있어 주의 필요. USING 과 유사. |
두 SELECT
문의 결과 집합을 합칩니다. 두 쿼리의 컬럼 수와 데이터 타입이 동일해야 합니다.
유형 | 설명 | 시험 포인트 |
---|---|---|
UNION | 두 쿼리 결과의 중복을 제거하고 합침. | **자동으로 ORDER BY **가 실행되어 정렬됩니다. |
UNION ALL | 두 쿼리 결과를 중복을 포함하여 모두 합침. | UNION 보다 빠릅니다. |
INTERSECT | 두 쿼리 결과의 공통된 행만 반환. | 두 쿼리의 교집합 . |
MINUS | 첫 번째 쿼리에서 두 번째 쿼리의 겹치는 행을 제외. | Oracle 전용. ANSI SQL은 EXCEPT . 순서에 따라 결과가 달라짐. |
구분 | JOIN | 집합 연산자 |
---|---|---|
결합 방향 | 가로 (컬럼 추가) | 세로 (행 추가) |
필요 조건 | 조인 키(컬럼) | 두 쿼리의 컬럼 수 와 데이터 타입 |
사용 목적 | 테이블 간 관계 탐색 | 여러 쿼리 결과의 집합 연산 |
예시 | A INNER JOIN B ON A.id = B.id | SELECT * FROM A UNION SELECT * FROM B |
JOIN
은 ON
또는 USING
조건을 기준으로 컬럼
을 연결하고, 집합 연산자
는 두 쿼리 결과를 행
단위로 결합합니다.INNER JOIN
과 INTERSECT
는 모두 교집합 개념이지만, INNER JOIN
은 테이블의 특정 컬럼을, INTERSECT
는 쿼리 결과의 전체 행을 비교합니다.UNION
은 DISTINCT
가 포함된 것처럼 중복을 제거하지만, 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. JOIN
은 WHERE
절을 통해 구현할 수 있지만, 집합 연산자는 불가능하다.
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;
MINUS
는 첫 번째 쿼리 결과에서 두 번째 쿼리의 결과와 겹치는 부분을 제외한 나머지를 반환합니다. 따라서 employees
에는 있지만 retired_employees
에는 없는 행, 즉 현재 직원들의 정보만 남게 됩니다.JOIN
은 ON
조건에 따라 테이블의 컬럼을 가로로 연결하고, 집합 연산자
는 두 쿼리 결과의 행을 세로로 합칩니다.UNION
을 사용해야 합니다. UNION ALL
은 중복을 허용하고, INTERSECT
는 교집합, MINUS
는 차집합을 구합니다.