> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL UNION

> UNION이 2개의 MySQL 쿼리의 행을 1개의 결과로 쌓는 방식, UNION ALL과의 차이, 그리고 2개의 쿼리가 반드시 지켜야 하는 1가지 규칙입니다.

> [card] [VillageSQL is a drop-in replacement for MySQL with extensions.](https://villagesql.com/docs/en/8.4/stable/install-server.md)
>
> All examples on this page work on VillageSQL. Install Now →

조인은 테이블을 나란히 놓아 결과를 넓힙니다. `UNION`은 결과를 위아래로 쌓아 결과를 길게 만듭니다. 2개의 쿼리가 같은 형태의 행을 만들고 그것을 1개의 목록으로 원할 때 쓰세요.

시작하기 전에 `mysql -u root -p sakila`로 클라이언트를 여세요.

## UNION의 동작 방식

```sql theme={null}
SELECT COLUMN_LIST FROM FIRST_TABLE
UNION
SELECT COLUMN_LIST FROM SECOND_TABLE;
```

각 `COLUMN_LIST`를 원하는 열로, `FIRST_TABLE`과 `SECOND_TABLE`을 읽을 테이블로 바꾸세요.

2개의 쿼리는 같은 수의 열을 반환해야 하고, 서버는 그 열들을 이름이 아니라 위치로 맞춥니다.

`UNION`은 중복 행을 제거합니다. `UNION ALL`은 중복 행을 유지하고, 아무것도 비교할 필요가 없어서 더 빠릅니다.

## 예제

### UNION은 중복을 제거합니다

여기서는 두 부분이 같은 쿼리이므로, 두 번째의 모든 행은 첫 번째에 있는 행의 중복입니다.

```sql theme={null}
SELECT rating FROM film UNION SELECT rating FROM film;
```

```text theme={null}
+--------+
| rating |
+--------+
| PG     |
| G      |
| NC-17  |
| PG-13  |
| R      |
+--------+
5 rows in set (0.00 sec)
```

2,000개에서 5개의 행입니다. `UNION`은 합쳐진 결과의 중복을 1번에 제거하므로, 한 부분 안의 반복도 부분 사이의 반복과 같은 방식으로 처리됩니다. 답은 같은 열에 대한 [SELECT DISTINCT](https://villagesql.com/docs/ko/tutorial/select-distinct.md)와 일치합니다.

### UNION ALL은 중복을 유지합니다

```sql theme={null}
SELECT rating FROM film UNION ALL SELECT rating FROM film;
```

```text theme={null}
+--------+
| rating |
+--------+
| PG     |
| G      |
| NC-17  |
...
+--------+
2000 rows in set (0.00 sec)
```

두 부분의 모든 행입니다. 중복이 없다는 것을 알 때, 또는 중복이 핵심일 때는 언제나 `UNION ALL`을 쓰세요.

### 다른 테이블의 행 쌓기

이것이 `UNION`의 진짜 용도입니다: 같은 종류의 것을 담은 2개의 테이블입니다. 리터럴 열이 각 행이 어느 부분에서 왔는지 말해 줍니다.

```sql theme={null}
SELECT 'staff' AS source, first_name, last_name FROM staff
UNION ALL
SELECT 'actor', first_name, last_name FROM actor WHERE actor_id <= 3;
```

```text theme={null}
+--------+------------+-----------+
| source | first_name | last_name |
+--------+------------+-----------+
| staff  | Mike       | Hillyer   |
| staff  | Jon        | Stephens  |
| actor  | PENELOPE   | GUINESS   |
| actor  | NICK       | WAHLBERG  |
| actor  | ED         | CHASE     |
+--------+------------+-----------+
5 rows in set (0.00 sec)
```

두 번째 쿼리는 리터럴에 별칭을 붙이지 않습니다. 열 제목은 첫 번째 쿼리에서만 오기 때문에 필요하지 않습니다.

## UNION은 순서를 약속하지 않습니다

어느 부분도 통째로, 또는 먼저 도착한다고 보장되지 않습니다. 서버는 플랜이 만들어 낸 순서 그대로 행을 반환하므로, 동일한 2개의 쿼리를 `UNION ALL`하면 서로 섞여 나올 수 있습니다. 끝에 붙이는 `ORDER BY`가 순서를 고정하는 유일한 방법이고, 이는 [LIMIT](https://villagesql.com/docs/ko/tutorial/limit.md) 및 [GROUP BY](https://villagesql.com/docs/ko/tutorial/group-by.md)에서와 같습니다.

## 두 부분의 열 수가 같아야 합니다

```sql theme={null}
SELECT first_name FROM actor UNION SELECT first_name, last_name FROM actor;
```

```text theme={null}
ERROR 1222 (21000): The used SELECT statements have a different number of columns
```

열 이름은 일치하지 않아도 됩니다. 수만 엄격하게 검사되며, 무엇이든 실행되기 전에 검사됩니다.

## ORDER BY는 결과 전체에 적용됩니다

끝에 있는 `ORDER BY`는 마지막 쿼리가 아니라 합쳐진 행을 정렬합니다. 첫 번째 부분의 별칭을 쓰세요. 결과 열이 그 이름으로 불리기 때문입니다.

```sql theme={null}
SELECT first_name AS name FROM staff
UNION
SELECT last_name FROM staff
ORDER BY name;
```

```text theme={null}
+----------+
| name     |
+----------+
| Hillyer  |
| Jon      |
| Mike     |
| Stephens |
+----------+
4 rows in set (0.00 sec)
```

1개의 부분만 따로 정렬하거나 제한하려면, 그 부분을 괄호로 감싸고 `ORDER BY`와 `LIMIT`을 그 안에 넣으세요.

## 요약

* 2개의 쿼리의 행을 1개의 결과로 쌓으려면 `UNION`을 쓰세요.
* `UNION`은 중복을 제거하고 `UNION ALL`은 유지한다고 예상하세요.
* 중복이 없다는 것을 알 때는 `UNION ALL`을 쓰세요. 하는 일이 적습니다.
* 두 부분에 같은 수의 열을 주세요. 아니면 `ERROR 1222`가 납니다.
* 제목은 첫 번째 쿼리에서 오고, 끝의 `ORDER BY`는 전체를 정렬한다고 예상하세요.

## 함께 보기

* [SELECT DISTINCT](https://villagesql.com/docs/ko/tutorial/select-distinct.md) — 1개의 쿼리에서 중복 제거하기
* [조인의 동작 방식](https://villagesql.com/docs/ko/tutorial/joins.md) — 대신 테이블을 나란히 결합하기
* [서브쿼리](https://villagesql.com/docs/ko/tutorial/subqueries.md) — 쌓는 대신 값으로 쓰이는 쿼리


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.