UNION 연산자는 여러 개의 쿼리 결과를 위아래로 결합하여 하나의 결과로 출력하는 방법입니다. UNION ALL과의 차이점은 중복된 데이터가 제거된다는 점입니다.
실무에서 쓰이는 이유
실무에서 UNION은 여러 테이블에서 데이터를 가져와 결합하거나, 동일한 테이블 내에서 서로 다른 조건의 데이터를 하나로 합쳐야 할 때 자주 사용됩니다.
실무에서 구체적으로 사용되는 상황 예측
예를 들어, 매출 데이터와 환불 데이터를 각각 조회한 후 이를 하나의 보고서로 결합할 때 UNION을 사용할 수 있습니다.
또 다른 예시는, 직원 테이블에서 서로 다른 직급의 직원 데이터를 하나의 결과로 결합해 보고할 때 사용될 수 있습니다.
자주 사용되는 윈도우 표시 및 설명
ROW_NUMBER() OVER (PARTITION BY column ORDER BY column): 결과 집합의 각 행에 고유한 순번을 부여합니다. 주로 페이징 쿼리나 순위 매기기에서 사용됩니다.
SELECT column, ROW_NUMBER() OVER (PARTITION BY column ORDER BY column) AS RowNum
FROM table;
RANK() OVER (ORDER BY column): 동일한 값에 대해 동일한 순위를 부여하고, 순위 간의 격차가 발생할 수 있습니다.
SELECT column, RANK() OVER (ORDER BY column) AS Rank
FROM table;
DENSE_RANK() OVER (ORDER BY column): 동일한 값에 대해 동일한 순위를 부여하고, 순위 간의 격차가 발생하지 않습니다.
SELECT column, DENSE_RANK() OVER (ORDER BY column) AS DenseRank
FROM table;
연습 문제
부서별로 직원들의 총 급여를 계산한 후, UNION을 사용하여 전체 총 급여를 함께 출력하는 SQL 쿼리를 작성하세요.
연습 문제 해답 및 테이블 표시
SELECT deptno, sum(sal)
FROM emp
GROUP BY deptno
UNION
SELECT null as deptno, sum(sal)
FROM emp;
DEPTNO
SUM(SAL)
10
9400
20
8750
30
10875
NULL
29025
응용 문제
특정 조건을 만족하는 직원의 데이터를 조회한 후, UNION을 사용하여 조건을 만족하지 않는 직원의 데이터와 결합하여 하나의 결과로 출력하는 쿼리를 작성하세요.
응용 문제 해답 및 테이블 표시
SELECT ename, job, sal
FROM emp
WHERE sal > 3000
UNION
SELECT ename, job, sal
FROM emp
WHERE sal <= 3000;
ENAME
JOB
SAL
KING
PRESIDENT
5000
FORD
ANALYST
3000
SCOTT
ANALYST
3000
…
…
…
전자상거래 업계에서 쓰일 수 있는 경우 예측
제품 카테고리별 매출 데이터를 조회한 후, 전체 매출 데이터를 추가하여 총 매출 보고서를 생성할 때 UNION을 사용할 수 있습니다.
특정 기간 동안의 신규 고객과 기존 고객의 매출 데이터를 각각 조회한 후, 이를 결합하여 전체 매출 보고서를 생성할 때도 사용될 수 있습니다.
전자상거래 업계에서 사용할 수 있는 경우 예상 상황 문제 2가지 및 그 경우에 대한 SQL 코드 작성
(1) 특정 카테고리에서 가장 많이 판매된 제품과 적게 판매된 제품을 조회한 후 이를 하나의 결과로 결합하는 쿼리
SELECT product_name, sales
FROM sales
WHERE category = 'Electronics' AND sales = (SELECT MAX(sales) FROM sales WHERE category = 'Electronics')
UNION
SELECT product_name, sales
FROM sales
WHERE category = 'Electronics' AND sales = (SELECT MIN(sales) FROM sales WHERE category = 'Electronics');
(2) 특정 기간 동안 신규 고객의 매출과 기존 고객의 매출을 각각 조회한 후, 이를 결합하여 전체 매출 보고서를 생성하는 쿼리
SELECT customer_type, SUM(sales)
FROM orders
WHERE customer_type = 'New'
GROUP BY customer_type
UNION
SELECT customer_type, SUM(sales)
FROM orders
WHERE customer_type = 'Existing'
GROUP BY customer_type;