반응형

본 글은 책 "칼퇴족 김대리는 알고 나만 모르는 SQL 기초 편"의 정리 내용입니다.

 

UNION 연산자는 두 개 이상의 테이블의 행을 합칠 때 사용

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 문의 열의 숫자는 반드시 동일해야 함

테이블 열의 수가 다르면 UNION 연산자 사용 불가능

  • 위와 같이 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
반응형

+ Recent posts