Menu
Coddy logo textTech

Union

Coddy SQL 여정의 기초 섹션에 포함된 레슨 — 72개 중 48번째.

유니언은 조인과 다릅니다. 조인은 조건을 사용하여 테이블을 결합하지만 유니언은 두 테이블을 하나 위에 하나를 더합니다. UNION을 사용하면 다음과 같이 작성합니다:

SELECT col1, col2, ... FROM table1
UNION
SELECT col1, col2, ... FROM table2

두 select 모두 다음 규칙을 준수해야 합니다:

  • 필드의 수가 같아야 합니다
  • 순서가 중요합니다
  • 같은 위치에 있는 열은 데이터 타입이 일치해야 합니다

예를 들어, 다음과 같은 테이블이 있다고 가정해 보겠습니다:

germany_people

idname
1Lena
2Leonie

england_people

idname
1George
2Lena

문제: 우리가 가진 모든 이름을 하나의 큰 테이블로 만들고 싶습니다.

SELECT name from germany_people
UNION
SELECT name from england_people

결과:

이름
Lena
Leonie
George

UNION중복되지 않은 값만 반환하는 반면 UNION ALL은 모든 레코드를 그대로 반환합니다:

SELECT name from germany_people
UNION ALL
SELECT name from england_people

결과:

이름
Lena
Leonie
George
Lena

또한 UNION ALLGROUP BY, 집계 함수, 그리고 ORDER BY와 결합할 수 있습니다. 이를 위해 해당 합집합을 서브쿼리로 감싸면 됩니다. 예를 들어, 두 테이블에 걸쳐 각 이름이 나타난 횟수를 세기 위해:

SELECT name, COUNT(*) AS total
FROM (
    SELECT name FROM germany_people
    UNION ALL
    SELECT name FROM england_people
) AS all_people
GROUP BY name
ORDER BY total DESC

결과:

이름총계
Lena2
Leonie1
George1

여기서, UNION ALL은 모든 행(중복 포함)을 유지하므로 COUNT가 실제 발생 횟수를 반영합니다. 외부 쿼리는 그 후 결합된 결과를 그룹화하고 정렬합니다.

challenge icon

챌린지

쉬움

사용 가능한 테이블 및 컬럼:

  • <strong>sales_2009</strong>: <strong>product_id</strong>, <strong>quantity_sold</strong>
  • <strong>sales_2010</strong>: <strong>product_id</strong>, <strong>quantity_sold</strong>
  • <strong>sales_2011</strong>: <strong>product_id</strong>, <strong>quantity_sold</strong>

판매 테이블이 3개 있습니다.

모든 테이블을 합쳐서 각 제품의 판매 합계를 구하세요.

결과에는 product_id와 총 판매량이 포함되어야 합니다.

이 컬럼의 이름을 total_sales로 지정하세요.

총 판매량 기준으로 결과를 내림차순 정렬하세요.

치트 시트

UNION은 테이블을 세로로 쌓아 결합합니다. 조인과 달리, UNION은 조건을 사용하지 않습니다 - 단순히 테이블을 위아래로 붙일 뿐입니다.

기본 UNION 구문:

SELECT col1, col2, ... FROM table1
UNION
SELECT col1, col2, ... FROM table2

UNION 규칙:

  • 필드 수가 같아야 합니다
  • 순서가 중요합니다
  • 같은 위치의 열은 데이터 타입이 일치해야 합니다

UNION vs UNION ALL:

  • UNION은 중복을 제거한 고유 값만 반환합니다
  • UNION ALL은 중복을 포함한 모든 레코드를 반환합니다
SELECT name FROM germany_people
UNION
SELECT name FROM england_people
SELECT name FROM germany_people
UNION ALL
SELECT name FROM england_people

UNION ALL을 서브쿼리 내부에서 사용할 수 있으며, 결합된 결과에 GROUP BY, ORDER BY, 그리고 집계 함수를 적용할 수 있습니다:

SELECT name, COUNT(*) AS total
FROM (
  SELECT name FROM germany_people
  UNION ALL
  SELECT name FROM england_people
) AS all_people
GROUP BY name
ORDER BY total DESC

이것은 두 테이블에 걸쳐 각 이름이 나타나는 횟수를 중복을 포함하여 계산합니다.

직접 해보기

quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

기초의 모든 레슨