기본 콘텐츠로 건너뛰기

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' ...

파이썬(Python)을 이용한 피어슨 상관계수 구하기

피어슨 상관계수(Pearson correlation coefficient)는 두 변수 간의 상관관계를 확인하기 위한 가장 기본적인 방법이다. 피어슨 상관계수를 사용할 때 주의해야할 사항은 아래와 같다. - 상관관계가 인과관계를 의미하는 것은 아니다. 단순히 두 변수의 연관성을 확인하는 것이다. - 두 변수가 정규분포일 때 잘 작동한다.  - 이상치(outlier)에 민감하므로, 이상치는 제거하는 것이 좋다. - 두 변수가 완전히 동일하면 피어슨 상관계수는 1.0이다. 완전히 반대방향으로 동일하면 -1.0, 전혀 상관 없으면 0이다. 세부적인 해석은 아래와 같이 한다. - -1.0과 -0.7 사이이면, 강한 음적 선형관계 - -0.7과 -0.3 사이이면, 뚜렷한 음적 선형관계 - -0.3과 -0.1 사이이면, 약한 음적 선형관계 - -0.1과 +0.1 사이이면, 거의 무시될 수 있는 선형관계 - +0.1과 +0.3 사이이면, 약한 양적 선형관계 - +0.3과 +0.7 사이이면, 뚜렷한 양적 선형관계 - +0.7과 +1.0 사이이면, 강한 양적 선형관계 파이썬을 통해 피어슨 상관계수를 쉽게 구할 수 있다. 예시를 통해 알아보자. height, weight의 두 변수를 가지는 body라는 DataFrame을 만들었다. DataFrame을 만드는 과정은 아래의 포스트에서 확인할 수 있다.  "파이썬(Python) Pandas를 이용한 데이터프레임(DataFrame) 만들기" body 데이터프레임으로 피어슨 상관계수를 구하는 코드는 아래와 같다.  1 2 corr = body . corr(method = 'pearson' ) corr Jupyter Notebook으로 구하면 아래와 같은 결과를 얻는다. 표의 행과 열을 살펴보면 "height - height", "weight - weight"는 1이...