데이터 처리 도구/SQL

[MySQL] 집합 연산(1): UNION, UNION ALL 사용하여 조회 결과 결합하기

yourhm 2022. 9. 7. 17:16

집합 연산(Set Operation)이란?

SQL에서 집합 연산이란, 여러 쿼리 블록의 결과들을 하나의 결과로 결합하는 것. 여기서 '쿼리 블록'은 SELECT와 같이 어떤 결과 집합을 반환하는 모든 SQL 문(SQL statement)을 의미하며, 간단한 테이블이라고도 한다. 

 


집합 연산은 3가지로 나눌 수 있다.

 

  Set Operation Definition
1 UNION 두 쿼리 블록의 모든 결과를 중복을 생략하여 하나의 결과로 결합.  합집합
2 INTERSECT 두 쿼리 블록의 결과에서 공통된 행만을 중복을 생략하고 결합. ⇒ 교집합
3 EXCEPT 두 쿼리 블록 A와 B에 대해, B에 존재하지 않는 A의 모든 결과를 중복을 생략하고 반환. ⇒ 차집합

 

  • 세 집합 연산자는 기본적으로 모두 중복을 생략하여 결과를 반환한다. 즉, 중복 생략이 집합 연산자의 기본 동작이기 때문에 일반적으로 DISTINCT를 굳이 명시적으로 지정할 필요가 없다.
  • 각 집합 연산자는 'ALL' 이라는 수정자(modifier)를 지원한다. 집합 연산자 뒤에 ALL 키워드가 오면 결과에 중복이 포함된다. 
  • 일반적으로, 쿼리 블록과 집합 연산은 어떤 순서로든 조합할 수 있다.

 

 

 

UNION

UNION은 두 개 이상의 쿼리 블록들을 결합하여 하나의 결과 집합(result-set)으로 결합할 때 사용된다.

 

 

-- 구조
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

- UNION을 사용하여 결합하려면, 각 결과의 컬럼 수가 반드시 똑같아야한다.

- 결합하려는 결과의 컬럼들은 각각 비슷한 데이터 타입을 가져야한다.
- 결과 컬럼들은 놓인 순서대로 결합한다.

 

 

 

UNION으로 각 결과에 대해 결합할 때, 기본적으로 중복값을 제외한 유니크 값만 반환한다. 만약 중복값을 허용하여 결과를 결합하고 싶으면, UNION 뒤에 ALL을 붙여서 사용하면 된다.

-- 구조
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

 

UNION의 경우 결합된 결과 집합에서 중복된 행을 제거하는 과정이 추가되기 때문에, 중복 제거 과정을 거치지 않는 UNION ALL에 비해서 처리 속도가 더 오래 걸리게 된다. 따라서 필요한 경우에만 중복 제거하고, 중복된 행을 제거할 필요가 없으면 UNION ALL을 사용하는 것이 성능 면에서 더 좋은 선택일 것!

 

 

 

 

[참고 자료]

https://www.w3schools.com/sql/sql_union.asp

 

W3Schools.com

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

https://intomysql.blogspot.com/2011/01/union-union-all.html

 

UNION과 UNION ALL 의 차이 및 주의 사항

ANSI SQL에서 제안하는 집합 연산 "UNION", "INTERSECT", "MINUS" 중에서 MySQL에서는 UNION 집합 연산만 제공 하고 있다. (하지만 MySQL에서 INTERSECT나 MINUS를 다른 형태의 쿼리로 풀어서 사용할 수 ...

intomysql.blogspot.com