본문 바로가기

Language/MySQL

[MySQL] 집합 연산 - UNION

RDBMS의 창시자인 에드거 커드(Edgar F. Codd)는 관계형 모델을 고안한 인물이다.

관계형 모델을 채택한 데이터베이스를 관계형 데이터베이스라 부른다.

관계형 모델에서의 관계형은 수학 집합론의 관계형 이론에서 유래했다.

데이터베이스에서 하나의 테이블이 집합이고, 테이블의 행이 요소에 해당한다.

행은 여러 개의 열로 구성되는 경우도 있으므로, 수치 상으로는 복수의 값이 존재하나,

집합의 요소라는 측면에서 보면 하나의 행이 곧 하나의 요소가 된다.

 

 

집합의 연산에는 '합집합'이 있는데 이는 집합을 서로 더한 것을 말한다.

SQL에서 합집합을 계산할 경우 UNION 키워드를 사용한다.

 

[SYNTAX]
SELECT 명령 UNION SELECT 명령

 

 

위의 예시에서 보이듯 2라는 요소가 a와 b의 테이블에 모두 포함되어 있다. 

수학의 집합에서와 동일하게 두 개의 집합에서 겹쳐지는 교집합 부분은 distinct로 처리되어 결과는 하나만 출력된다.

두 개의 SELECT 명령을 하나의 명령으로 합치는 만큼, 세미콜론은 맨 나중에 붙이는 점을 주의해야 한다.

즉, 한 번의 쿼리 실행으로 두 개의 SELECT 명령이 내부적으로 실행되어 결과를 합집합으로 계산하여 반환하는 것이다.

 

UNION을 이용하면 여러 개의 SELECT 명령을 하나로 묶을 수 있다.

이때 각각의 SELECT 명령의 열의 내용은 서로 일치해야 한다.

위의 예시처럼 열 이름은 서로 다르지만 열 개수와 자료형이 서로 같기 때문에 일치한다고 할 수 있다.

 

열 구성이 다른 테이블은 UNION으로 묶을 수 없다.

 

하지만 열을 따로 지정하여 각 SELECT 명령에서 집합의 요소가 될 데이터를 서로 맞춰주면 UNION으로 묶을 수 있다.

 

 

UNION으로 SELECT 명령을 결합해 합집합을 구하는 경우 각 SELECT 명령에 ORDER BY를 지정할 수 없다.

첫 번째 SELECT 명령에 ORDER BY를 지정할 수 없다.

 

마지막의 SELECT 명령에 ORDER BY 지정이 가능하지만, 마지막 SELECT 명령의 결과만 정렬하는 것이 아니고 합집합의 결과를 정렬하는 것이기 때문에 에러가 발생한다.

 

만약 두 개의 SELECT 명령에서 열 이름이 서로 일치한다면 에러는 발생하지 않는다.

그렇지 않으면 서로 동일하게 별명을 붙여 정렬하면 ORDER BY를 사용해도 에러가 발생하지 않는다.

 

 

UNION에서 공통 요소는 DISTINCT 처리되어 하나의 요소만 결과로 출력된다.

수학에서 말하는 집합은 중복 값이 존재하지 않는 것을 전제로 하기에 UNION 결과도 중복 값이 제거되어 있다.

하지만, 경우에 따라 중복을 제거하지 않고 결괏값을 출력하고 싶을 경우 UNION ALL을 사용하면 된다.

실행 결과를 보면 2라는 값을 가진 행이 중복되어 표시된 것을 볼 수 있다.

UNION ALL은 두 개의 집합을 단순하게 합치는 것이다.

UNION에서 이미 존재하는 값인지 검사하는 처리가 필요한 만큼, 

중복 값이 없는 경우 UNION ALL을 사용하는 편이 좋은 성능을 보여줄 수 있다.

 

 

'Language > MySQL' 카테고리의 다른 글

[MySQL] 관계형 모델  (0) 2022.12.21
[MySQL] 테이블 결합 - JOIN  (0) 2022.12.20
[MySQL] 뷰 작성과 삭제  (0) 2022.12.14
[MySQL] 인덱스 작성과 삭제  (0) 2022.12.13
[MySQL] 인덱스 구조  (0) 2022.11.24