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. 예제를 통해 살펴보자
아래와 같이 온라인, 오프라인 세일즈를 기록하는 테이블이 각각 있다고 하자.
4. UNION을 사용해보자
아래와 같이 결과를 확인할 수 있다.
- sales_onlin 테이블의 (2, 170)과 sales_offline 테이블의 (2, 170)의 중복이 삭제되어 (2, 170)은 1개만 결합되었다. sales_offline 테이블 (3, 160)의 값도 2개가 있는데 중복이 삭제되어 1개만 최종적으로 결합되었다.
- 중복을 제거하기 위해 자동으로 오름차순으로 정렬(ORDER BY)되어 있다. 그래서 UNION ALL 보다 연산이 느리다.
5. UNION ALL을 사용해보자
아래와 같이 결과를 확인할 수 있다.
- 중복여부와 순서는 무시하고 기계적으로 붙여놓았다.
6. SQL 구문의 칼럼 순서를 바꿔보자
아래와 같이 결과를 확인할 수 있다.
- 칼럼 이름의 일치 여부가 아닌 칼럼의 순서대로 결합됨을 확인할 수 있다.
- 샘플 DB의 column인 id와 sales가 모두 integer로 일치하기 때문에 UNION이 실행되었다. 만약 TEXT와 INTEGER을 가지는 칼럼을 UNION을 하면 오류가 발생한다.
7. UNION을 써야된다는 말은 통합되어야 할 테이블이 분리되어 있다는 뜻이다. UNION을 되도록 사용하지 않도록 미리 잘 모델링하는 게 좋다.
끝.
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을 되도록 사용하지 않도록 미리 잘 모델링하는 게 좋다.
끝.
댓글
댓글 쓰기