> For the complete documentation index, see [llms.txt](https://docs.sysout.co.kr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.sysout.co.kr/database/oracle/structure-query-language/user-query/set-operation.md).

# 집합 연산

## 집합연산

이 문서에서는 집합연산의 개념과 이용방법에 대해서 다룬다.

### 집합연산이란

집합연산은 말 그대로 서로다른 집합 간의 연산을 말한다.\
예를 들어 철수와 영희가 각각 좋아하는 색상이 다음과 같다고 가정해본다.

* 철수 : 빨강, 파랑, 초록, 노랑
* 영희 : 검정, 보라, 노랑, 빨강, 분홍

이를 집합으로 표현하면 다음 그림과 같다.

![](/files/-MgsimjFeGHWYlsT6Rrh)

색상들은 다음과 같이 분류될 수 있다.

* 철수와 영희가 모두 좋아하는 색 : 빨강, 노랑
* 철수만 좋아하는 색 : 파랑, 초록
* 영희만 좋아하는 색 : 검정, 분홍, 보라
* 철수와 영희 둘 중 한명이라도 좋아하는 색 : 파랑, 초록, 빨강, 노랑, 검정, 분홍, 보라

집합연산 용어로 설명하면 다음과 같다.

* 합집합 : 철수와 영희 둘 중 한명이라도 좋아하는 색, 철수∪영희
* 교집합 : 철수와 영희 둘 다 좋아하는 색, 철수∩영희
* 차집합 : 철수만 좋아하는 색(철수-영희), 영희만 좋아하는 색(영희-철수)

### 데이터 준비

> table favorite

| name | color |
| ---- | ----- |
| 철수   | 빨강    |
| 철수   | 파랑    |
| 철수   | 초록    |
| 철수   | 노랑    |
| 영희   | 검정    |
| 영희   | 보라    |
| 영희   | 노랑    |
| 영희   | 빨강    |
| 영희   | 분홍    |

```sql
create table favorite(
name varchar2(6) not null,
color varchar2(6) not null
);

insert into favorite values('철수', '빨강');
insert into favorite values('철수', '파랑');
insert into favorite values('철수', '초록');
insert into favorite values('철수', '노랑');
insert into favorite values('영희', '검정');
insert into favorite values('영희', '보라');
insert into favorite values('영희', '노랑');
insert into favorite values('영희', '빨강');
insert into favorite values('영희', '분홍');
commit;
```

### 합집합(UNION)

![](/files/-Mgsiqv9V7PtQ0jjYsnU)

합집합은 다음 두 가지로 구분한다

* UNION ALL : 중복을 허용하는 합집합
* UNION : 중복을 제거한 합집합

```sql
select color from favorite where name = '철수'
union all
select color from favorite where name = '영희';
```

| color |
| ----- |
| 빨강    |
| 파랑    |
| 초록    |
| 노랑    |
| 검정    |
| 보라    |
| 노랑    |
| 빨강    |
| 분홍    |

union을 사용하면 중복을 제거한 합집합을 확인할 수 있다.

```sql
select color from favorite where name = '철수'
union
select color from favorite where name = '영희';
```

| color |
| ----- |
| 검정    |
| 노랑    |
| 보라    |
| 분홍    |
| 빨강    |
| 초록    |
| 파랑    |

```
select * from favorite where name = '철수'
union
select * from favorite where name = '영희';
```

union은 union distinct와 같은 의미라는 것을 결과로 확인할 수 있다.

### 교집합

![](/files/-MgsiudFsy07t7YEd6lF)

교집합은 `intersect` 키워드를 사용한다.

```
select * from favorite where name = '철수'
intersect
select * from favorite where name = '영희';
```

| color |
| ----- |
| 노랑    |
| 빨강    |

### 차집합

차집합은 `minus` 키워드를 사용한다.

#### 철수 - 영희

![](/files/-MgsixNEQpUpeK4GcThh)

```
select * from favorite where name = '철수'
minus
select * from favorite where name = '영희';
```

| color |
| ----- |
| 초록    |
| 파랑    |

#### 영희 - 철수

![](/files/-MgsiyZcW9GX0-cXnD0w)

```
select * from favorite where name = '영희'
minus
select * from favorite where name = '철수';
```

| color |
| ----- |
| 검정    |
| 보라    |
| 분홍    |
