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는 차집합을 구합니다.