Union
결합
· Union 이란
Union은 두 개 이상의 Select 문의 결과를 하나의 결과 집합으로 결합하는 SQL 연산자이다.
각 Select 문의 결과는 일련의 행으로 구성되며, Union은 이러한 행동을 하나로 결합한다.
이를 통해 여러 쿼리의 결과를 단일 쿼리로 통합하여 조회할 수 있다.
· Union을 사용하는 이유는?
- 데이터 통합 : 서로 다른 테이블이나 데이터베이스에서 얻은 결과를 하나의 테이블로 합치는 데 사용된다. 이는 데이터를 조직화하고 관리하는 데 유용하게 사용된다.
- 중복 제거 : Union은 기본적으로 중복된 결과를 제거한다. 따라서 중복된 결과를 피하고 싶을 때 유용하게 사용할 수 있다.
- 복잡한 쿼리 단순화 : 여러 개의 복잡한 쿼리를 각 각 실행하는 대신, Union을 사용하여 한 번에 실행할 수 있다. 이는 쿼리의 복잡성을 줄이고 가독성을 높이는 데 도움이 된다.
이러한 이유로 Union은 데이터베이스 쿼리 작성 시 매우 유용한 도구로 활용된다.
· Union 기본 형태 및 표현 방식
Union 기본 형태
Select 컬럼1, ..., 컬럼n
From 테이블1
Union
Select 컬럼1, ..., 컬럼n
From 테이블2
Union은 테이블 1과 테이블 2에서 Select 된 컬럼의 결과를 하나로 합친다. 주의해야 할 점은 Union을 사용할 때 각 테이블의 Select 문에서 가져온 컬럼의 수와 데이터의 유형이 서로 일치해야 한다는 것이다.
이 SQL 문은 회원(member) 테이블과 주문내역(cart) 테이블에 대해 각기 조회한 결과를 Union 연산자를 통해 통합하여 하나의 결과로 반환하고 있다. Union은 기본적으로 중복된 결과를 제거하므로 총 '163'개의 데이터가 아닌 중복된 데이터를 제외한 '155'개의 데이터를 반환하는 것을 볼 수 있다. 만약에 중복된 결과를 포함시키고자 한다면 'Union All'을 사용할 수 있다.
Union All 형태
Select 컬럼1, ..., 컬럼n
From 테이블1
Union All
Select 컬럼1, ..., 컬럼n
From 테이블2
'Union All'은 테이블 1과 테이블 2에서 Select 된 컬럼의 결과를 하나로 합치되, 중복된 결과를 제거하는 것이 아니라 그대로 포함시켜 하나의 결과로 반환한다.
이 SQL 문은 위의 Union 연산자를 사용한 결과와 반대로 각 테이블의 중복된 값을 포함하여 하나의 결과로 반환한다. 따라서, 중복된 값을 제거한 155개의 데이터가 아니라 중복된 값을 포함한 '163' 개의 데이터가 출력된 모습을 볼 수 있다.
· Union과 Union All의 차이점
'Union'과 'Union All'은 조금 다른 작동 방식을 가지고 있다.
'Union'은 두 개 이상의 Select 문의 결과를 결합할 때 중복된 결과를 제거하는 반면, 'Union All'은 중복된 결과를 그대로 포함한다.
일반적으로 'Union All'이 'Union' 보다 더 사용되는 주요 이유는 성능과 관련이 있다.
- 성능 향상 : 'Union'은 중복된 결과를 제거하기 위해 내부적으로 정렬 작업을 수행한다. 따라서 결과 집합이 크거나, 데이터베이스 서버에 부하가 있을 경우, 'Union'은 'Union All'에 비해 느릴 수 있다.'Union All'은 중복 제거 작업을 수행하지 않으므로 더 빠른 성능을 제공한다.
- 중복된 결과 포함 : 경우에 따라서는 중복된 결과를 포함하는 것이 필요하거나 원하는 결과일 수 있다. 예를 들어, 여러 테이블에서 동일한 데이터를 가져와야 하는 경우 'Union All'을 사용하면 중복된 데이터도 모두 조회할 수 있다.
이러한 이유로 'Union All'이 'Union'보다 더 일반적으로 사용되는 경우가 많다. 하지만 사용자의 요구사항과 데이터의 특성에 따라 적절하게 선택하는 것이 중요하다.
· 예시
<예제_Union 활용하기> 전체 회원별 총 구매금액과 총 구매금액의 합계를 조회하기
- 조회 컬럼 : 회원ID(mem_id), 회원이름(mem_name), 총 구매금액
Union 연산자는 두 개의 Select 문의 결과를 결합하는 데 사용된다. 이 쿼리에서 Union은 두 개의 Select 문을 결합하며, 첫 번째 쿼리는 "각 회원별로 총 구매금액을 계산"하고, 두 번째 쿼리는 "모든 회원의 총 구매금액"을 계산한다.
첫 번째 Select 문에서는 'Left Outer Join' 방식을 사용하여 회원(member) 테이블과 주문내역(cart) 테이블, 상품(prod) 테이블을 연결하였다. 이는 조인 조건(PK = FK)을 통해 "회원 테이블의 모든 정보와 각 회원의 주문 내역", "주문내역이 존재하는 상품"에 대한 정보를 가져오는 데 사용된다.
두 번째 Select 문에서는 동일한 방식의 Join 방식 및 조건을 사용하지만, Group By 절은 공백('')으로 두어 모든 회원의 총 구매금액을 합산한다. 여기서 Group By 절을 공백으로 둔 이유는 특정 컬럼을 기준으로 그룹화하지 않고 전체 데이터를 하나의 그룹으로 간주하여 처리하겠다는 의미로, 총 구매금액의 합계가 계산된다.
회원ID(mem_id)와 회원 이름(mem_name)은 공백('')으로 처리되어, 결과 집합에서 이 컬럼은 모든 회원의 총 구매금액을 나타내는 합계 행으로 표시된다. 여기서 회원ID(mem_id)와 회원 이름(mem_name)은 공백으로 둔 이유는 해당 컬럼의 값이 특정 값이 아니라 빈 문자열이라는 것을 의미한다. 이렇게 하면 특정 회원을 나타내지 않으며, 총 구매금액(total_price) 컬럼의 값은 모든 회원의 구매금액 합계를 나타낸다. 즉, 이 행은 "모든 회원의 총 구매금액"을 나타내는 것으로 해석할 수 있다.
마지막으로 Order By 절을 총 구매금액(total_price)에 적용하여 총 구매금액이 높은 회원부터 낮은 회원까지 내림차순 정렬한다.
이렇게 Union을 사용하여 두 개의 쿼리 결과를 결합하면, 각 회원별 총 구매금액과 모든 회원의 총 구매금액을 한 번의 쿼리로 얻을 수 있다.
Union 연산자는 두 개 이상의 Select 문의 결과를 결합할 때 중복된 결과를 제거한다.
만약 중복된 결과를 유지하고 싶다면 Union All을 사용해야 한다.
Union을 사용한 결과는 기본적으로 첫 번째 Select 문의 컬럼 순서에 따라 결정된다.
만약 다른 컬럼을 기준으로 정렬하고 싶다면 Order By를 사용해야 한다.
Union을 사용할 때, 모든 Select 문은 동일한 수의 컬럼을 가져야 하며,
각 컬럼의 데이터 타입이 서로 일치해야 한다.
Union 연산은 내부적으로 중복 제거를 위한 정렬 작업을 수행한다.
따라서 대량의 데이터를 처리할 때에는 Union All이 더 효율적일 수 있다.
'[파이썬] > 데이터베이스' 카테고리의 다른 글
[MariaDB] With Rollup (1) | 2023.11.27 |
---|---|
[MariaDB] Exists 함수 (3) | 2023.11.27 |
[MariaDB] 가상 테이블(Inline View) (1) | 2023.11.26 |
[MariaDB] Join (Inner Join, Outer Join) (1) | 2023.11.26 |
[MariaDB] If 함수 (0) | 2023.11.25 |