유니온
Coddy SQL 여정의 기초 섹션에 포함된 레슨. 72개 중 48번째.
유니온은 조인과 다릅니다. 조인은 조건을 사용해 테이블을 결합하지만, 유니온은 두 테이블을 위아래로 단순히 추가합니다. UNION을 사용하려면 다음과 같이 작성합니다.
SELECT col1, col2, ... FROM table1
UNION
SELECT col1, col2, ... FROM table2두 SELECT 문은 모두 다음 규칙을 따라야 합니다.
- 열의 개수는 같아야 합니다.
- 순서가 중요합니다.
- 같은 위치에 있는 열은 같은 종류의 데이터를 담아야 합니다(SQLite는 열의 자료형을 확인하지 않습니다).
예를 들어, 다음과 같은 테이블이 있다고 가정해 봅시다.
germany_people
| id | name |
| 1 | Lena |
| 2 | Leonie |
england_people
| id | name |
| 1 | George |
| 2 | Lena |
문제: 우리가 가진 모든 이름으로 하나의 큰 테이블을 만들고 싶습니다.
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 ALL을 집계 함수, GROUP BY, ORDER BY와 결합해 여러 테이블의 데이터를 요약할 수도 있습니다. 핵심은 UNION ALL을 서브쿼리로 감싼 다음, 그 위에 그룹화와 정렬을 적용하는 것입니다.
예를 들어, 두 테이블 전체에서 각 이름이 몇 번 나타나는지 세고 싶다고 가정해 봅시다.
SELECT name, COUNT(*) AS total_count
FROM (
SELECT name FROM germany_people
UNION ALL
SELECT name FROM england_people
) AS combined
GROUP BY name
ORDER BY total_count DESC결과:
| 이름 | total_count |
| Lena | 2 |
| Leonie | 1 |
| George | 1 |
여기서는 UNION이 아니라 UNION ALL을 사용하여 Lena와 같은 중복 항목을 유지합니다. 그렇지 않으면 집계하기 전에 중복 항목이 제거됩니다. 하위 쿼리가 모든 행을 합친 다음, GROUP BY와 COUNT로 행을 요약합니다. ORDER BY는 최종 결과를 정렬합니다.
챌린지
쉬움사용 가능한 테이블과 열:
sales_2009:product_id,quantity_soldsales_2010:product_id,quantity_soldsales_2011:product_id,quantity_sold
판매 테이블은 3개입니다.
모든 테이블을 합쳐 각 제품의 판매량 합계를 구하세요.
결과에는 product_id와 총 판매량이 포함되어야 합니다.
이 열의 이름을 total_sales로 지정하세요.
총 판매량을 기준으로 결과를 내림차순 정렬하세요.
직접 해보기
-- 모든 행을 유지하면서 세 테이블을 하나의 결과로 합칩니다
SELECT product_id, ____ AS total_sales
FROM (
SELECT * FROM sales_2009
____
SELECT * FROM sales_2010
____
SELECT * FROM sales_2011
)
-- 제품별로 한 행씩 표시하고, 합계가 큰 순서대로 정렬합니다
GROUP BY ____
ORDER BY ____ DESC;이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
직접 연습해 보세요: SQL 플레이그라운드