기본 콘텐츠로 건너뛰기

SQL UNION, UNION ALL - 행 결합

1. 다른 테이블을 결합해야 할 때가 있다. 특정 조건을 기준으로 column(열)을 결합시킬 때는 JOIN을 사용한다. 하지만 row(행)을 결합시킬 때는 UNION 또는 UNION ALL을 사용하면 된다. 두 개의 SELECT문을 합치는 것이라 생각하면 된다.

2. UNION과 UNION ALL은 차이가 있다.
UNION은 중복되는 row를 제거하고 결합 시키지만, UNION ALL은 중복도 포함하여 결합시킨다.

3. UNION과 UNION ALL을 사용할 때의 주의점은 아래와 같다.
- SELECT문의 column 수가 같아야 한다.
- column의 자료형이 같거나 호환되어야 한다.
- column 이름은 최상위 SQL문의 이름을 따른다.
- column 이름이 아니라 column 순서를 기준으로 결합된다. 이름이 같아도 순서가 다르면 다른 순서대로 결합된다.

4. 예제를 통해 살펴보자
아래와 같이 온라인, 오프라인 세일즈를 기록하는 테이블이 각각 있다고 하자.

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
CREATE TABLE sales_online(id integer, sales integer);

INSERT INTO sales_online VALUES(1, 100);
INSERT INTO sales_online VALUES(2, 170);
INSERT INTO sales_online VALUES(3, 250);
INSERT INTO sales_online VALUES(4, 300);
INSERT INTO sales_online VALUES(5, 120);

CREATE TABLE sales_offline(id integer, sales integer);

INSERT INTO sales_offline VALUES(1, 185);
INSERT INTO sales_offline VALUES(2, 170);
INSERT INTO sales_offline VALUES(3, 160);
INSERT INTO sales_offline VALUES(2, 170);
INSERT INTO sales_offline VALUES(3, 160);

4. UNION을 사용해보자

1
2
3
4
5
6
select *
from sales_online
union
select *
from sales_offline
;

아래와 같이 결과를 확인할 수 있다.
- sales_onlin 테이블의 (2, 170)과 sales_offline 테이블의 (2, 170)의 중복이 삭제되어 (2, 170)은 1개만 결합되었다. sales_offline 테이블 (3, 160)의 값도 2개가 있는데 중복이 삭제되어 1개만 최종적으로 결합되었다.
- 중복을 제거하기 위해 자동으로 오름차순으로 정렬(ORDER BY)되어 있다. 그래서 UNION ALL 보다 연산이 느리다.

5. UNION ALL을 사용해보자

1
2
3
4
5
6
select *
from sales_online
union all
select *
from sales_offline
;

아래와 같이 결과를 확인할 수 있다.

- 중복여부와 순서는 무시하고 기계적으로 붙여놓았다.

6. SQL 구문의 칼럼 순서를 바꿔보자

1
2
3
4
5
6
select id, sales
from sales_online
union all
select sales, id
from sales_offline
;

아래와 같이 결과를 확인할 수 있다.

- 칼럼 이름의 일치 여부가 아닌 칼럼의 순서대로 결합됨을 확인할 수 있다.
- 샘플 DB의 column인 id와 sales가 모두 integer로 일치하기 때문에 UNION이 실행되었다. 만약 TEXT와 INTEGER을 가지는 칼럼을 UNION을 하면 오류가 발생한다.

7. UNION을 써야된다는 말은 통합되어야 할 테이블이 분리되어 있다는 뜻이다. UNION을 되도록 사용하지 않도록 미리 잘 모델링하는 게 좋다.

끝.

댓글

이 블로그의 인기 게시물

파이썬(Python)을 이용한 산점도(scatter) 그리기

파이썬의 Matplotlib를 이용해 데이터의 산점도(scatter plot)를 그릴 수 있다. 예시를 통해 살펴보자. 먼저 아래와 같이 데이터 프레임 예시를 만든다. 1 2 3 4 5 6 7 8 9 10 import pandas as pd height = [ 170 , 168 , 177 , 181 , 172 , 171 , 169 , 175 , 174 , 178 , 170 , 167 , 177 , 182 , 173 , 171 , 170 , 179 , 175 , 177 , 186 , 166 , 183 , 168 ] weight = [ 70 , 66 , 73 , 77 , 74 , 73 , 69 , 79 , 77 , 80 , 74 , 68 , 71 , 76 , 78 , 72 , 68 , 79 , 77 , 81 , 84 , 73 , 78 , 69 ] # DataFrame 만들기 body = pd . DataFrame( { 'height' : height, 'weight' : weight} ) body라는 이름의 데이터 프레임(테이블)이 만들어졌다. 이제, body 테이블의 데이터들의 분포를 산점도로 그려보자. 산점도를 그리는 코드는 아래와 같다. 1 2 3 4 5 6 7 8 9 10 # 산점도(scatter) 그리기 import matplotlib.pylab as plt plt . scatter( body[ 'weight' ], body[ 'height' ], label = "data" ) plt . legend(loc = "best" ) plt . xlabel( 'weight' ) plt . ylabel( 'height'

웨딩 드레스 스케치 도안

웨딩 드레스샵 투어를 다니면서 샘플로 드레스를 입는 경우에는 드레스 사진을 찍지 못하게 하는 샵이 많다. ​ 그래서 투어를 돌고 나면 어떤 샵의 어떤 스타일이 신부에게 잘 어울렸는지 헷갈릴 수가 있다. ​ 하지만 투어를 다닐 때 드레스샵에서 입은 드레스의 특징과 느낌을 잘 기록하면 샵을 선택하는 데 도움이 될 수 있다. ​ 드레스 투어를 다닐 때 드레스를 기록할 스케치 도안은 아래 링크에서 확인/다운로드 할 수 있다. 웨딩 드레스 스케치 도안 확인/다운로드 하기 투어를 마친 후 드레스샵과 계약을 하고, 드디어 본식 드레스를 고를 때에는 사진을 찍을 수 있는 경우가 많다. ​ 이 땐 사진을 잘 찍어서 어떤 드레스를 입을지 잘 선택하도록 하자. ​ ​

DEMOS Calculator - 웹에서 그래프 그리기

수식의 그래프를 그려보고 싶을 때 편리한 웹 서비스가 있어서 소개한다. DEMOS Calculator(https://www.desmos.com/calculator) DEMOS Calculator는 수식을 입력하면 자동으로 그래프를 그려준다. 아래는 로그함수를 입력한 모습이다. 좌측 영역의 수식 입력창에 수식을 입력하면 실시간으로 그래프를 확인할 수 있다. 좌측 상단의 햄버거 바를 클릭하면 아래와 같이 다양한 예시 그래프들도 확인할 수 있다. 수학식에 따라 그래프를 깔끔하게 그려야 할 때 요긴하게 사용할 수 있는 웹 서비스이다. 끝.