MariaDB | SET 연산자와 JOIN의 차이
2025. 1. 31. 10:11ㆍDatabase/SQL
SET 연산자
두 개 이상의 SELECT 결과를 합치거나 비교하는 역할을 한다.
두 쿼리는 컬럼 개수와 데이터 타입이 동일해야 한다.
연산자 | 설명 | 중복제거 | MySQL 지원 |
UNION | 두 SELECT 결과를 합쳐서 반환 | O | O |
UNION ALL | 두 SELECT 결과를 합쳐서 반환 (중복 포함) | X | O |
INTERSECT | 두 SELECT 결과에서 공통된 값만 반환 | O | X ( INNER JOIN, IN 활용) |
EXCEPT/ MINUS(Oracle) | 첫 번째 SELECT에서 두 번째 SELECT의 값을 제외한 결과 반환 | O | X (LEFT JOIN, NOT IN 활용) |
UNION과 JOIN의 차이
연산자 | 동작 방식 | 언제 사용? |
UNION | '두 개의 SELECT 결과'를 '위아래(수직)로' 합침 | 컬럼 구조가 같은 두 개의 테이블을 단순히 합칠 때 |
JOIN | '두 개의 테이블'을 특정 컬럼을 기준으로 '옆으로(수평)' 합침 | 두 테이블의 관계를 활용해서 데이터 결합할 때 |
1. UNION이 필요한 경우
-- employees와 customers에서
-- 같은 구조(컬럼명 동일)의 데이터를 가져와
-- 하나의 리스트처럼 결합
SELECT name, email FROM employees
UNION -- 중복 제거
SELECT name, email FROM customers;
- 같은 유형의 데이터를 하나의 리스트로 합칠 때
예) employees(직원)와 customers(고객) 테이블이 있는데, 둘 다 name과 email이 있어서 하나의 사용자 목록처럼 출력하고 싶을 때 사용. - 완전히 다른 테이블에서 유사한 데이터를 가져와야 할 때
예) 국내여행 예약 테이블 + 해외여행 예약 테이블 → 전체 예약 목록을 만들고 싶을 때 사용.
2. JOIN이 필요한 경우
-- employees(직원 테이블)과 departments(부서 테이블)를
-- department_id 기준으로 옆으로 붙여서
-- 하나의 테이블처럼 결합한다.
-- 직원 정보 + 부서 정보를 같이 가져오는 게 핵심!
SELECT employees.name, employees.email, departments.department_name
FROM employees
JOIN departments ON employees.department_id = departments.id;
- 서로 다른 테이블에서 관계가 있는 데이터를 합칠 때
예) 직원 테이블 + 부서 테이블 → 직원이 속한 부서까지 함께 조회하고 싶을 때 - 중복되는 데이터를 포함하여 상세 정보를 가져올 때
예) 주문 테이블 + 고객 테이블 → 특정 고객이 한 주문 내역까지 보고 싶을 때
3. JOIN을 써야 할 것 같은데 UNION을 써야 하는 경우
- 두 테이블 간에 공통된 컬럼이 있지만, 서로 다른 데이터셋일 때
- 예: employees(직원) + customers(고객) → 같은 name, email이 있어도 JOIN할 관계가 없음
- JOIN을 사용하면 두 테이블의 연결고리(FK 같은 키 값)가 필요하지만, UNION은 그런 거 없이 그냥 결과를 합칠 수 있음.
- 한 개의 테이블을 조건에 따라 나눠서 합쳐야 할 때
- 예: 2023년 데이터와 2024년 데이터가 다른 테이블로 저장된 경우
- 하나의 통합된 리스트를 만들고 싶을 때
- 예: 직원과 고객을 한꺼번에 보여줘야 하는 경우 (유저 목록처럼)
- JOIN을 하면 직원과 고객을 연결하는 키가 없어서 결과가 나오지 않음.