UNION 연산자

1. UNION 연산자

UNION 연산자는 SQL에서 여러 SELECT 문의 결과를 하나의 결과 집합으로 결합할 때 사용된다. 즉, 서로 다른 테이블이나 같은 테이블의 다른 조건에서 검색된 데이터를 하나의 결과로 볼 수 있도록 하기 위해 사용한다.

  • 기능 : UNION은 두 개 이상의 SELECT 결과를 결합한다.
  • 조건 : 모든 SELECT 문은 동일한 수의 열을 가져야 하며, 열의 데이터 타입이 호환 가능해야 한다.
  • 중복 제거 : 기본적으로 UNION은 중복된 행을 제거한다.
  • 중복 포함 : 중복된 행을 포함하려면 UNION ALL을 사용한다.

사용 예시

SELECT name, email FROM customers
UNION
SELECT name, email FROM suppliers;

-----------------------------------------

SELECT name, email FROM customers
UNION ALL
SELECT name, email FROM suppliers;
시나리오 코드 1
-- students 테이블 생성
CREATE TABLE students (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(50)
);

-- students 테이블에 샘플 데이터 삽입
INSERT INTO students (name, email) VALUES ('김철수', 'chulsoo@example.com');
INSERT INTO students (name, email) VALUES ('이영희', 'younghee@example.com');
INSERT INTO students (name, email) VALUES ('박민수', 'minsoo@example.com');

-- alumni 테이블 생성
CREATE TABLE alumni (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(50)
);

-- alumni 테이블에 샘플 데이터 삽입
INSERT INTO alumni (name, email) VALUES ('김철수', 'chulsoo@example.com');
INSERT INTO alumni (name, email) VALUES ('최영수', 'youngsoo@example.com');
INSERT INTO alumni (name, email) VALUES ('이영희', 'younghee@example.com');


select name, email from students
union  
select name, email from alumni;


select name, email from students
union all
select name, email from alumni;

2. UNION과 JOIN의 차이점

UNION과 JOIN은 모두 MySQL에서 여러 테이블의 데이터를 결합하는 데 사용되지만, 그 사용 목적과 방식이 다르다.

UNION은 여러 SELECT 문의 결과를 수직으로 결합하여 하나의 결과 집합을 만든다. 중복된 행은 기본적으로 제거되며, UNION ALL을 사용하면 중복된 행도 포함된다. JOIN 여러 테이블의 데이터를 공통된 열을 기준으로 수평으로 결합한다. 다양한 종류의 JOIN이 있으며, 각각 결합 방식이 다르다.

시나리오 코드 2
-- reservations 테이블 생성
CREATE TABLE reservations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    room_id INT,
    reservation_date DATE,
    guest_name VARCHAR(50)
);

-- rooms 테이블 생성
CREATE TABLE rooms (
    room_id INT AUTO_INCREMENT PRIMARY KEY,
    room_number INT
);

-- reservations 테이블에 샘플 데이터 삽입
INSERT INTO reservations (room_id, reservation_date, guest_name) VALUES (1, '2024-06-01', '김철수');
INSERT INTO reservations (room_id, reservation_date, guest_name) VALUES (2, '2024-06-02', '이영희');
INSERT INTO reservations (room_id, reservation_date, guest_name) VALUES (3, '2024-06-03', '박민수');

-- rooms 테이블에 샘플 데이터 삽입
INSERT INTO rooms (room_number) VALUES (101);
INSERT INTO rooms (room_number) VALUES (102);
INSERT INTO rooms (room_number) VALUES (103);

select * from reservations;

-- 특정 월의 일자별 예약 가능 정보를 조회
-- 6월 1일부터 5일 까지 예약 가능한 정보 조회
select room_number, d.date, 
case
	when guest_name is null then '가능'
    else '불가능'
	end as status
from (
	select '2024-06-01' as date
    union
	select '2024-06-02'
    union
	select '2024-06-03'
    union
	select '2024-06-04'
    union
	select '2024-06-05'
) as d
join rooms as ro
left join reservations as re on re.reservation_date = d.date and re.room_id = ro.room_id;

MySQL 기본 목차로 돌아가기

 

'MySQL > 정리' 카테고리의 다른 글

MySQL 목차  (1) 2024.07.08
제 3정규형(Third Normal Form, 3NF)  (0) 2024.07.08
제 2정규화(Second Normal Form, 2NF)  (0) 2024.06.13
제 1정규화(First Normal Form, 1NF)  (0) 2024.06.13
서브 쿼리란 - 7  (0) 2024.06.13