🖇 UNION
🖇 중복 포함: UNION ALL
🖇 중복 제거: UNION
🖇 UNION 중복 제거 기준
🖇 UNION 사용 시 주의사항
SQL에서 테이블을 세로 방향으로 연결하고 싶을 때는 UNION 을 사용해야 한다.
UNION 은 같은 구조를 가진 테이블 데이터를 아래로 이어 붙여
마치 하나의 테이블처럼 조회할 수 있게 해주는 문법이다.
또한, 중복된 행을 제거하면서 테이블을 연결할 수 있는데
이때 헷갈리기 쉬운 부분이 바로
"어떤 기준으로 행이 중복이라고 판단되는가?"
라는 점이다.
이 글에서는
UNION 과 UNION ALL 의 기본 개념부터 사용 시 주의사항, 그리고 중복 제거 기준을 예제를 통해 정확히 이해할 수 있도록 정리해 보았다.
유익한 글이 되기를 바란다 😊
두 개 이상의 SELECT 결과를 세로로 연결하여 하나의 결과로 합친다.
테이블을 행 단위로 합쳐서 데이터를 확장하는 방식이다.
테이블을 아래로, 세로로 붙이는 형태
데이터를 합치면서 새로운 행을 생성
데이터가 너무 많으면 테이블을 쪼개서 관리할 수 있다.

이미지를 참고하여 UNION 이 사용되는 경우를 생각해 보자.
SELECT * FROM 테이블1 UNION ALL SELECT * FROM 테이블2
UNION ALL
중복 행도 포함해서
데이터셋을 모두 합쳐서 하나의 결과로 조회할 수 있게 한다.
아래의 예제를 살펴보면 중복과 관계 없이 두 테이블이 세로 방향으로 연결된 걸 확인할 수 있다.
-- 2020년과 2021년 데이터셋을 모두 합쳐서 하나의 결과로 조회하기
SELECT *
FROM ds_2020
UNION ALL
SELECT *
FROM ds_2021

위의 코드에서는 두 테이블의 모든 컬럼을 가져왔다면
이번에는 일부 컬럼만 가져와서 연결해 보자.
컬럼 일부만 합쳐보기
2020년 테이블과 2021년 테이블을 합치고,
공통된 컬럼 3개(work_year, experience_level, job_title)만 추출한다.
SELECT work_year,
experience_level,
job_title
FROM ds_2020
UNION ALL
SELECT work_year,
experience_level,
job_title
FROM ds_2021

공통된 컬럼 work_year, experience_level, job_title 만 추출하여 연결된 것을 확인할 수 있다.
그런데 뜬금없이 컬럼 일부만 합쳐보는 예제는 왜 살펴본 걸까?
이제부터 알아볼 UNION 까지 정리하고 나면 그 이유를 알게 될 것이다 :)
SELECT * FROM 테이블1 UNION SELECT * FROM 테이블2
UNION
중복된 행을 제거하고 반환한다.
하나의 레코드로 중복 없이 합친 결과를 보고 싶을 때 사용한다.
2020년 테이블과 2021년 테이블에서 중복된 행을 제거하여 연결하는데,
마찬가지로 work_year, experience_level, job_title 컬럼만 조회해 보자.
SELECT work_year,
experience_level,
job_title
FROM ds_2020
UNION
SELECT work_year,
experience_level,
job_title
FROM ds_2021

[참고]
다른 DBMS에서는 UNION DISTINCT 를 사용해도 데이터를 합칠 때 중복이 제거되지만, pandasql에서는 에러가 발생하기 때문에 UNION 을 사용해야 합니다.
🧐 UNION을 사용하면 중복된 행을 제거하여 테이블을 합치게 되는데,
이때 중복된 행이 무엇을 의미하는지 혼동이 왔다.
1. 전체 컬럼 에서 모든 행이 중복되면 제거하는 것인지,
2. SELECT 절에서 지정한 컬럼 에서 모든 행이 중복되면 제거하는 것인지
위에서 살펴본 예제와 비교해 보고 무엇이 정답인지 알아보자.
2020년 테이블과 2021년 테이블에서 에서 중복된 행을 제거하여 연결하는데,
이번에는 work_year 컬럼을 제외한 experience_level, job_title 컬럼만 조회해 보자.
SELECT experience_level,
job_title
FROM ds_2020
UNION
SELECT experience_level,
job_title
FROM ds_2021

세 컬럼을 모두 조회했을 때는 104개의 행(row)이 출력되었는데, 한 컬럼을 제외한 두 컬럼을 조회했을 때는 80개의 행(row)이 출력되는 것을 확인할 수 있다.
이 결과는
지정한 컬럼에 따라 중복으로 간주되어 제거되는 행이 다르다는 것을 보여준다.
만약 지정한 컬럼과 관계 없이 일단 모든 컬럼의 행이 중복되면 제거하는 것이라면 두 예제에서 출력되는 행의 개수가 같았을 것이다.
즉,
지정한 컬럼과 관계 없이 일단 모든 컬럼의 행이 중복되면 제거하는 것이 아니라,
SELECT 절에서 지정한 컬럼의 행이 완전히 일치해야 중복으로 간주하는 것이다.
다시 위로 돌아가서 UNION ALL 의 두 예제를 살펴보면
전체 컬럼을 조회할 때와, 지정한 컬럼만 조회할 때 출력되는 행(row)이 245개로 같은 것을 볼 수 있다. 이를 통해 UNION ALL 과 UNION 의 차이 또한 직관적으로 확인할 수 있다.
UNION을 사용할 때는💡
SELECT절에서 지정한 컬럼 전체가 완전히 일치해야 중복으로 간주된다 !
UNION 을 사용하려면 반드시 다음 조건을 만족해야 한다.
✓ 컬럼 수가 같아야 한다
✓ 각 컬럼의 데이터 타입이 호환 가능해야 한다
✓ 컬럼명은 달라도 된다 (결과는 첫 SELECT 문의 컬럼명 사용)
위 테이블과 아래 테이블 데이터 타입과 컬럼수가 같으면 UNION을 적용할 수 있다.
여러 테이블을 UNION 할 때 위의 포맷을 반복한다.
-- 컬럼 수가 다르면 에러 발생
SELECT a, b FROM table1
UNION
SELECT a FROM table2
-- 컬럼명은 달라도 가능 (데이터 타입과 컬럼수가 같으면)
SELECT id, name FROM table1
UNION
SELECT emp_id, emp_name FROM table2
지금까지 테이블을 아래로 연결할 수 있는 UNION 을 알아보았다.
기억해야 할 것은
UNION을 사용하면
두 개 이상의 SELECT 결과를 세로로 이어 붙일 수 있고
UNION은 중복 제거,UNION ALL은 중복 포함또한, 컬럼 수와 타입이 일치해야 정상 작동한다는 것
실제로 연도별, 지역별, 카테고리별 등 동일한 구조를 가진 테이블을 하나로 통합할 때 자주 사용되기 때문에
UNION 을 잘 사용하면 데이터를 깔끔하게 합칠 수 있을 것이다.