Database/MySQL

[MySQL] 집합 연산자 - UNION / UNION ALL / INTERSECT / EXCEPT

루루23 2024. 10. 16. 17:23
반응형

집합연산자는 여러 쿼리의 결과를 하나로 결합할 때 사용됩니다.

대표적인 집합 연산자는 UNION, UNION ALL, INTERSECT, EXCEPT 네가지가 있습니다.

 

1. UNION

  • 두 개 이상의 SELECT 문의 결과를 합치면서, 중복된 결과는 제거

흔히 배운 합집합과 같습니다.

JOIN 배울 때 잠깐 나왔는데, LEFT JOIN과 RIGHT JOIN 결과를 합쳐서 OUTER JOIN 처럼 이용했습니다.

 

 

[MySQL] 테이블 연결하기 (JOIN) - INNER / OUTER / LEFT / RIGHT / CROSS / SELF

JOIN 은 SQL에서 테이블 간의 관계를 정의하고 데이터를 결합할 때 사용됩니다.INNER JOIN, OUTER JOIN, LEFT JOIN, RIGHT JOIN, CROSS JOIN, SELF JOIN 여섯가지를 알아보도록 하겠습니다!   실습할 테이블 만들기

newj23.tistory.com

 

SELECT name FROM heros
UNION
SELECT name FROM villains;

 

heros 테이블과 villains 테이블에 있는 모든 사람의 이름 가져옵니다.

 

 

 

2. UNION ALL

  • UNION과 비슷하지만 중복된 값도 포함하여 모든 결과를 반환
  • 예를 들어, RURU이라는 이름이 두 테이블에 모두 있다면, 결과에는 RURU 두 번 나오게 됨

 

3. INTERSECT

  • 두 SELECT 문의 결과에서 겹치는 데이터만 반환

말 그대로 교집합이 되겠습니다. (그런데 왜 실행할 때 빨간 줄이 나오는 건가요?)

 

> 히어로이면서 악당인 사람 골라내기

SELECT name FROM heros
INTERSECT
SELECT name FROM villains;

 

heros 테이블과 villains 테이블에서 겹치는 이름만 가져올 수 있습니다. 

그리고 아래와 같은 방법으로 INTERSECT를 대체할 수 있습니다.

SELECT name FROM heros
WHERE name IN (SELECT name FROM villains);

 

 

4. EXCEPT

  • 첫 번째 SELECT문의 결과에서 두 번째 SELECT 문의 결과를 제외한 값을 반환

차집합처럼 한쪽에 포함되고 다른쪽에 포함되지 않는 값들을 가져옵니다.

 

> 완전한 히어로 찾기

SELECT name FROM heros
EXCEPT
SELECT name FROM villains;

 

아래와 같은 방법으로도 구할 수 있습니다.

SELECT name FROM heros
WHERE name NOT IN (SELECT name FROM villains);

 

 

5. 마무리

  • UNION: 중복을 제거하고 두 쿼리의 결과를 합침
  • UNION ALL: 중복을 포함하여 두 쿼리의 결과를 합침
  • INTERSECT: 두 쿼리의 공통 데이터를 반환
  • EXCEPT: 첫 번째 쿼리의 결과에서 두 번째 쿼리의 결과를 제외한 데이터를 반환

그리고 주의사항 두 가지와 함께 끝 !

  1. 집합 연산자를 사용할 때는 각 SELECT 문의 컬럼 수와 데이터 타입이 일치해야 함
  2. UNION과 UNION ALL을 사용할 때, 결과를 정렬하고 싶다면 전체 쿼리 끝에 ORDER BY를 추가해야 함

 

반응형