[SQL] 데이터 이어붙이기: UNION

jul ee·2025년 4월 4일

데이터 성장기

목록 보기
17/139

🖇  UNION
🖇  중복 포함: UNION ALL
🖇  중복 제거: UNION
🖇  UNION 중복 제거 기준
🖇  UNION 사용 시 주의사항


SQL에서 테이블을 세로 방향으로 연결하고 싶을 때는 UNION 을 사용해야 한다.

    UNION 은 같은 구조를 가진 테이블 데이터를 아래로 이어 붙여
    마치 하나의 테이블처럼 조회할 수 있게 해주는 문법이다.

    또한, 중복된 행을 제거하면서 테이블을 연결할 수 있는데
    이때 헷갈리기 쉬운 부분이 바로

            "어떤 기준으로 행이 중복이라고 판단되는가?"

    라는 점이다.

이 글에서는
UNIONUNION ALL 의 기본 개념부터 사용 시 주의사항, 그리고 중복 제거 기준을 예제를 통해 정확히 이해할 수 있도록 정리해 보았다.

유익한 글이 되기를 바란다 😊



🖇  UNION

두 개 이상의 SELECT 결과를 세로로 연결하여 하나의 결과로 합친다.
테이블을 행 단위로 합쳐서 데이터를 확장하는 방식이다.

  • 테이블을 아래로, 세로로 붙이는 형태

  • 데이터를 합치면서 새로운 행을 생성

  • 데이터가 너무 많으면 테이블을 쪼개서 관리할 수 있다.

이미지를 참고하여 UNION 이 사용되는 경우를 생각해 보자.

  • 연도별로 분리된 테이블을 하나로 모을 때
  • 테스트 테이블과 실제 데이터를 합칠 때
  • 중복을 제거하거나 포함한 전체 데이터를 조회할 때



🖇  중복 포함: UNION ALL

완전한 쿼리문 2개를 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 까지 정리하고 나면 그 이유를 알게 될 것이다 :)



🖇  중복 제거: 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 중복 제거 기준

🧐  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 ALLUNION 의 차이 또한 직관적으로 확인할 수 있다.

UNION 을 사용할 때는

💡  SELECT 절에서 지정한 컬럼 전체가 완전히 일치해야 중복으로 간주된다 !




🖇  UNION 사용 시 주의사항

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 을 잘 사용하면 데이터를 깔끔하게 합칠 수 있을 것이다.

profile
AI에 관심을 가지고, 데이터로 가치를 만들어 나가는 과정을 기록합니다.

0개의 댓글