MySQL

UNION

mintuchel 2026. 2. 25. 17:50

JOIN과 UNION의 차이점을 알고 가야한다.

굉장히 쉽다.

JOIN은 수평결합. 새로운 칼럼으로 결합된다.
UNION은 수직결합. 새로운 테이블 하나가 붙는 것이다.

 


 

그냥 두 쿼리의 결과를 합쳐서 보여주는 것이다

 

UNION DISTINCT = 합친 후 중복 제거

UNION ALL = 그냥 합침 (중복제거 X)

 

UNION = UNION DISTINCT

그냥 UNION을 하게 되면 자동으로 DISTINCT가 붙어 중복제거를 해준다!

 


각 쿼리문은 MySQL 쿼리 실행 순서에 따라 구문들을 실행하고

맨 마지막에 UNION으로 결과가 합쳐지게 된다.

 

정상적으로 합치기 위해서 당연히 각 쿼리의 칼럼 갯수는 동일해야한다

칼럼명은 동일하지 않아도 돌아간다고 한다.

맨 첫번째 쿼리를 기준으로 UNION 결과 테이블의 칼럼명이 정해진다.

 

SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE YEAR(SALES_DATE) = '2022' AND MONTH(SALES_DATE) = '3'

UNION

SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE YEAR(SALES_DATE) = '2022' AND MONTH(SALES_DATE) = '3'

ORDER BY SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC

 

https://school.programmers.co.kr/learn/courses/30/lessons/131537

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

SELECT
    'Low Salary' as category,
    COUNT(*) AS accounts_count
FROM Accounts
WHERE income < 20000

UNION ALL

SELECT
    'Average Salary' as category,
    COUNT(*) AS accounts_count
FROM Accounts
WHERE income >= 20000 AND income <= 50000

UNION ALL

SELECT
    'High Salary' as category,
    COUNT(*) AS accounts_count
FROM Accounts
WHERE income > 50000

 

https://leetcode.com/problems/count-salary-categories/?envType=study-plan-v2&envId=top-sql-50

 

Count Salary Categories - LeetCode

Can you solve this real interview question? Count Salary Categories - Table: Accounts +-------------+------+ | Column Name | Type | +-------------+------+ | account_id | int | | income | int | +-------------+------+ account_id is the primary key (column wi

leetcode.com