Learning SQL 6장 요약 - 집합 연산자

SQL

2022. 11. 24. 22:35


6장 집합 연산자

 

다양한 집합 연산자를 사용해서 결과를 결합하는 방법을 알아본다.

 

집합 이론

연산 의미
union 합집합
intersect 교집합
except 차집합

 

집합 연산을 수행할 때는 공통점이 있어야 한다.

  1. 두 데이터셋 모두 같은 수의 열을 가져야 한다.
  2. 두 데이터셋의 각 열의 자료형은 서로 동일해야 한다.(또는 서버가 변환할 수 있어야 한다.)

 

집합 이론 실습

SELECT 1 num, 'abc' str
UNION
SELECT 9 num, 'xyz' str;

 

union 연산자

union은 결합된 집합을 정렬하고 중복을 제거

union all은 그렇지 않다.

 

union all 예시 - 결과셋에 중복값이 있다.

SELECT c.first_name, c.last_name
FROM customer c
WHERE c.first_name LIKE 'J%' AND c.last_name LIKE 'D%'
UNION ALL
SELECT a.first_name, a.last_name
FROM actor a
WHERE a.first_name LIKE 'J%' AND a.last_name LIKE 'D%';

 

union 예시 - 중복 제거됨

SELECT c.first_name, c.last_name
FROM customer c
WHERE c.first_name LIKE 'J%' AND c.last_name LIKE 'D%'
UNION
SELECT a.first_name, a.last_name
FROM actor a
WHERE a.first_name LIKE 'J%' AND a.last_name LIKE 'D%';

 

intersect 연산자

SELECT c.first_name, c.last_name
FROM customer c
WHERE c.first_name LIKE 'D%' AND c.last_name LIKE 'T%'
INTERSECT
SELECT a.first_name, a.last_name
FROM actor a
WHERE a.first_name LIKE 'D%' AND a.last_name LIKE 'T%';

(Empty Set)

 

except 연산자

SELECT a.first_name, a.last_name
FROM actor a
WHERE a.first_name LIKE 'J%' AND a.last_name LIKE 'D%'
EXCEPT
SELECT c.first_name, c.last_name
FROM customer c
WHERE c.first_name LIKE 'J%' AND c.last_name LIKE 'D%';

 

except all 연산자

집합 A가

{10, 10, 10, 11, 12}

이고

 

집합 B가

{10, 10}

이라면,

 

A except B는 다음과 같다.

{11, 12}

 

A except all B는 다음과 같다.

{10, 11, 12}

 

except는 A에서 모든 중복 데이터를 제거하는 반면,

except all은 A에 대한 중복 데이터가 발생할 때만 제거한다.

 

집합 연산 규칙

복합 쿼리의 결과 정렬

맨 마지막에 order by 절을 추가하면 된다.

SELECT a.first_name fname, a.last_name lname
FROM actor a
WHERE a.first_name LIKE 'J%' AND a.last_name LIKE 'D%'
UNION ALL
SELECT c.first_name, c.last_name
FROM customer c
WHERE c.first_name LIKE 'J%' AND c.last_name LIKE 'D%'
ORDER BY lname, fname;

 

집합 연산의 순서

union all → union 실행

SELECT a.first_name, a.last_name
FROM actor a
WHERE a.first_name LIKE 'J%' AND a.last_name LIKE 'D%'
UNION ALL
SELECT a.first_name, a.last_name
FROM actor a
WHERE a.first_name LIKE 'M%' AND a.last_name LIKE 'T%'
UNION
SELECT c.first_name, c.last_name
FROM customer c
WHERE c.first_name LIKE 'J%' AND c.last_name LIKE 'D%';

6개 행이 반환된다.

 

union → union all 실행

SELECT a.first_name, a.last_name
FROM actor a
WHERE a.first_name LIKE 'J%' AND a.last_name LIKE 'D%'
UNION
SELECT a.first_name, a.last_name
FROM actor a
WHERE a.first_name LIKE 'M%' AND a.last_name LIKE 'T%'
UNION ALL
SELECT c.first_name, c.last_name
FROM customer c
WHERE c.first_name LIKE 'J%' AND c.last_name LIKE 'D%';

7개 행이 반환된다.