컴퓨터/데이터베이스

[데이터 베이스] UNION & GROUPING SETS & ROLLUP

sidedoor 2024. 2. 11. 00:17

UNION

두 개 이상의 SELECT 문의 결과를 하나의 결과 세트로 결합하는 데 사용되는 연산자이다.

따라서 이는 여러 데이터 소스로부터 관련된 데이터를 수집하여 하나의 쿼리 결과로 통합할 때 유용하게 사용된다.

UNION을 사용하면 각 SELECT 문에서 반환된 행들을 모두 포함하는 새로운 결과 테이블을 생성할 수 있다.

 

SELECT name 
FROM products_a

UNION

SELECT name 
FROM products_b;

 

이와 같이 코드를 실행하면 products_a에 있는 name을 출력한 다음 products_b에 있는 name을 출력한다.

이때 두 쿼리 결과에서 중복된 행을 한 번만 표시하기 때문에 두 출력값이 붙여서 출력이 된다.

 

UNION을 사용할때는 결합하는 각 SELECT 문에서 선택하는 열의 수와 타입이 일치해야 한다.

 

- UNION ALL

 

UNION 연산자는 기본적으로 중복된 결과를 제거한다.

따라서 중복된 결과를 포함하고 싶은 경우 UNION ALL을 사용해야 한다.

UNION ALL은 중복된 결과를 포함하여 모든 행을 반환한다.

여기서 중복 제거 과정이 없기 때문에 UNION보다 일반적으로 더 빠르다.

GROUPING SETS

복잡한 집계 쿼리를 단순화하기 위해 사용되는 기능으로 여러 그룹화 수준에서 집계를 한 번에 계산할 수 있다.

 

실제 데이터가 아래와 같이 주어졌을 때 

 

year region sales
2020 East 100
2020 West 150
2021 East 200
2021 West 100

 

SELECT year, region, SUM(sales)
FROM sales
GROUP BY GROUPING SETS ((year, region), (year), (region), ());

 

결과는 이와 같이 나온다.

 

year region total_sales
2020 East 100
2020 West 150
2021 East 200
2021 West 100
2020 NULL 250
2021 NULL 300
NULL East 300
NULL West 250
NULL NULL 550

 

위의 예시를 보면 각각의 column에 대해서 함께 그룹화도 가능하고 개별로 그룹화도 가능하다.

그리고 ()를 사용하여 모든 행을 하나의 그룹으로 취급하여 전체 집계를 계산할 수 있다.

 

결과적으로  위의 구문은 year와 region의 조합별로 판매량을 집계하고, year별 region별로 전체 판매량을 집계하고, 전체 판매량을 집계한다.

UNION VS GROUPING SETS

UNION을 통해서도 GROUPING SETS의 결과가 동일하게 코드를 작성할 수 있다.

하지만 UNION과 GROUPING SETS는 서로 다른 목적과 사용 사례를 가지고 있어 내부적으로 수행하는 작업은 다르다.

 

UNION은 두 개 이상의 SELECT 쿼리 결과를 합치는 데 사용된다.

따라서 주로 서로 다른 테이블이나 데이터 세트에서 비슷한 구조의 데이터를 하나의 결과 세트로 결합할 때 사용한다.

 

GROUPING SETS는 하나의 쿼리 내에서 여러 그룹화 수준에 대한 집계 결과를 계산하는 데 사용된다.

이는 복잡한 집계 연산을 단순화하고, 여러 GROUP BY 쿼리를 조합할 수 있는 유연성을 제공한다.

따라서 GROUPING SETS는 주로 분석 쿼리에서 사용고, 다양한 차원에서 데이터를 요약하고 싶을 때 유용하다.

ROLLUP

GROUP BY 절과 함께 사용되어 계층적인 집계 데이터를 생성하는데 사용되는 확장 기능이다.

ROLLUP을 사용하면 지정된 column에 대해 요약된 결과를 포함한 다중 레벨의 집계를 손쉽게 생성할 수 있다.

 

실제 데이터가 아래와 같이 주어졌을 때 

 

year region sales
2020 East 100
2020 West 150
2021 East 200
2021 West 100

 

SELECT year, region, SUM(sales) AS total_sales
FROM sales
GROUP BY ROLLUP (year, region);

 

실행 결과가 아래와 같이 나온다.

 

year region total_sales
2020 East 100
2020 West 150
2020 NULL 250
2021 East 200
2021 West 100
2021 NULL 300
NULL NULL 550

 

 

위에서 ROLLUP각각의 column을 기준으로 다양한 레벨의 집계 결과를 생성한다.

먼저 yearregion의 조합에 대한 집계, 그 다음 year에 대한 집계, 마지막으로 전체 집계를 계산한다.

 

즉, ROLLUP을 사용하면 가장 상세한 레벨인 year과 region의 조합에서 시작하여 점차 상위 레벨인 연도별 총합과 전체 집계 순서로 데이터를 생성한다.