반응형
본 글은 책 "칼퇴족 김대리는 알고 나만 모르는 SQL 기초 편"의 정리 내용입니다.
UNION 연산자는 두 개 이상의 테이블의 행을 합칠 때 사용

UNION 연산자
SELECT 열이름들 FROM 테이블명1 WHERE 조건절
UNION
SELECT 열이름들 FROM 테이블명2 WHERE 조건절;
예제
- 총 3가지 테이블을 사용
1. 고객원장 테이블: CUSTOMERS
CUST_ID | CUST_NM | HOME_TEL |
5464 | JH KIM | 02-333-1111 |
6570 | LY KIM | 031-111-1133 |
8780 | AR KIM | 032-998-5555 |
5632 | KK LEE | 02-6677-8888 |
2445 | HJ WANG | 055-4444-5666 |
3210 | HH AN | 031-888-0111 |
2596 | DK SUNG | 02-113-3331 |
>테이블 생성 쿼리문
CREATE TABLE CUSTOMERS
(
CUST_ID INT NOT NULL,
CUST_NM CHAR(20) NOT NULL,
HOME_TEL CHAR(20) NOT NULL,
PRIMARY KEY('CUST_ID')
);
INSERT INTO CUSTOMERS
VALUES
(5464, 'JH KIM', '02-333-1111'),
(6570, 'LY KIM', '031-111-1133'),
(8780, 'AR KIM', '032-998-5555'),
(5632, 'KK LEE', '02-6677-8888'),
(2445, 'HJ WANG', '055-4444-5666'),
(3210, 'HH AN', '031-888-0111'),
(2596, 'DK SUNG', '02-113-3331');
2. 주문 테이블: ORDERS
ORDER_ID | CUST_ID | EMP_ID | ORDER_DT |
10000 | 2596 | 23480 | 2013-12-06 |
10001 | 5464 | 16780 | 2013-11-01 |
10002 | 3210 | 63278 | 2014-03-02 |
10003 | 2445 | 15501 | 2014-02-23 |
10004 | 5632 | 15687 | 2013-11-13 |
>테이블 생성 쿼리문
CREATE TABLE ORDERS (
ORDER_ID INTEGER NOT NULL,
CUST_ID INTEGER NOT NULL,
EMP_ID INTEGER NOT NULL,
ORDER_DT TEXT NOT NULL,
PRIMARY KEY("ORDER_ID")
);
INSERT INTO ORDERS
VALUES
(10000, 2596, 23480, '2013-12-06'),
(10001, 5464, 16780, '2013-11-01'),
(10002, 3210, 63278, '2014-03-02'),
(10003, 2445, 15501, '2014-02-23'),
(10004, 5632, 15687, '2013-11-13');
3. 직원 정보 테이블:테이블: EMPLOYEE
EMP_ID | GRADE | NM | TELNO |
15501 | 8 | YK MO | 5740 |
15687 | 8 | SS CHANG | 5547 |
16780 | 5 | HY YOO | 2327 |
63278 | 7 | JW PARK | 2304 |
87871 | 7 | SW HONG | 2367 |
23578 | 6 | JI CHOI | 4654 |
32480 | 6 | JM CHA | 1270 |
23480 | 5 | KE LEE | 5466 |
>테이블 생성 쿼리문
CREATE TABLE EMPLOYEE
(
EMP_ID INT NOT NULL,
GRADE INT NOT NULL,
NM CHAR(20) NOT NULL,
TELNO INT NOT NULL,
PRIMARY KEY('EMP_ID'));
INSERT INTO EMPLOYEE
VALUES
(15501, 8, 'YK MO', 5740),
(15687, 8, 'SS CHANG', 5547),
(16780, 5, 'HY YOO', 2327),
(63278, 7, 'JW PARK', 2304),
(87871, 7, 'SW HONG', 2367),
(23578, 6, 'JI CHOI', 4654),
(32480, 6, 'JM CHA', 1270),
(23480, 5, 'KE LEE', 5466);
Q1. CUSTOMERS와 EMPLOYEE 테이블을 이용하여 직원 이름과 고객 이름을 합쳐서 하나의 열로 오름차순으로 출력
NM |
AR KIM |
DK SUNG |
HH AN |
HJ WANG |
HY YOO |
JH KIM |
JI CHOI |
JM CHA |
JW PARK |
KE LEE |
KK LEE |
LY KIM |
SS CHANG |
SW HONG |
YK MO |
>정답
SELECT CUSTOMERS.CUST_NM AS NM FROM CUSTOMERS
UNION
SELECT EMPLOYEE.NM AS NM FROM EMPLOYEE
ORDER BY 1;
Q2. 위 문제에서 ‘NM’이라는 별칭을 주지 않고 아래와 같이 출력한다면 결과는?
SELECT CUSTOMERS.CUST_NM FROM CUSTOMERS
UNION
SELECT EMPLOYEE.NM FROM EMPLOYEE
ORDER BY 1;
> 정답
CUST_NM |
AR KIM |
DK SUNG |
HH AN |
HJ WANG |
HY YOO |
JH KIM |
JI CHOI |
JM CHA |
JW PARK |
KE LEE |
KK LEE |
LY KIM |
SS CHANG |
SW HONG |
YK MO |
주의할 점
1. UNION 연산자를 사용할 때 합쳐지는 SELECT 문의 열의 숫자는 반드시 동일해야 함

- 위와 같이 CUSTOMERS 테이블에서는 2개의 열, EMPLOYEE 테이블에서는 1개의 열을 선택하여 UNION 연산하면 에러 발생
- Result: SELECTs to the left and right of UNION do not have the same number of result columns
UNION ALL 연산자
SELECT 열이름들 FROM 테이블명1 WHERE 조건절
UNION ALL
SELECT 열이름들 FROM 테이블명2 WHERE 조건절;
- UNION과 달리, UNION ALL은 중복된 행도 모두 출력
예시 - CUSTOMERS와 ORDERS 테이블 이용하여 고객아이디를 합쳐서 출력
1) UNION 사용
- 중복되는 행을 출력하지 않음
SELECT CUSTOMERS.CUST_ID FROM CUSTOMERS
UNION
SELECT ORDERS.CUST_ID FROM ORDERS;
CUST_ID |
2445 |
2596 |
3210 |
5464 |
5632 |
6570 |
8780 |
2) UNION ALL 사용
- 중복되는 행 모두 출력
SELECT CUSTOMERS.CUST_ID FROM CUSTOMERS
UNION ALL
SELECT ORDERS.CUST_ID FROM ORDERS;
CUST_ID |
2445 |
2596 |
3210 |
5464 |
5632 |
6570 |
8780 |
2596 |
5464 |
3210 |
2445 |
5632 |
반응형
'SQL' 카테고리의 다른 글
[SQL] 데이터 삽입 (INSERT INTO) (0) | 2022.02.22 |
---|---|
[SQL] 하위 쿼리( Sub-query) (0) | 2022.02.22 |
[SQL] 테이블 합치기 (FULL OUTER JOIN) (0) | 2022.02.17 |
[SQL] 테이블 합치기 (RIGHT OUTER JOIN) (0) | 2022.02.17 |
[SQL] 테이블 합치기 (LEFT OUTER JOIN) (0) | 2022.02.17 |