굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
{#union-description}
## 설명
집합 연산자는 각각 자기 `RETURN`을 가진 온전한 두 쿼리를 하나의 결과로 잇습니다:
| 연산자 | 결과 |
| --- | --- |
| `UNION` | 두 쿼리 중 어느 쪽에든 있는 행. |
| `INTERSECT` | 두 쿼리 모두에 있는 행. |
| `EXCEPT` | 첫 쿼리에는 있고 둘째 쿼리에는 없는 행. |
셋 모두에 적용되는 규칙입니다:
- 모든 쿼리가 **같은 수의 컬럼**을 반환해야 하고, 서로 대응하는 컬럼은 비교할 수 있어야 합니다.
이름은 같지 않아도 됩니다. 결과는 첫 쿼리의 이름을 가져갑니다.
- `DISTINCT`가 기본값입니다. 중복 행은 없어집니다. `ALL`은 중복을 남깁니다. `UNION`과
`UNION DISTINCT`는 같은 뜻입니다.
- 연산자는 **이어 쓸 수 있고**, 이어진 것은 왼쪽에서 오른쪽으로 평가됩니다.
- 행 순서는 정해져 있지 않습니다. 집합 연산 뒤에 쓴 `ORDER BY`는 합쳐진 결과를 정렬하지
**않습니다.** 무엇이 정렬하는지는 [참고](#union-notes)를 보십시오.
- 각 쿼리는 `RETURN`으로 끝나는 온전한 쿼리여야 합니다. 한쪽 갈래가 쓰기 절이나 `MATCH`만으로
끝날 수는 없습니다.
{#union-parameters}
## 매개변수
query
: `RETURN`으로 끝나는 온전한 쿼리이며, 이어진 다른 모든 쿼리와 컬럼 수가 같아야 합니다.
ALL
: 중복 행을 남깁니다.
DISTINCT
: 중복 행을 없앱니다. 이것이 기본값입니다.
{#union-examples}
## 예제
모든 예제는 [예제 데이터셋](../../get_started/example-dataset.md)에서 실행됩니다.
{#union-combine-two-result-sets}
### 두 결과 집합 합치기
`Inception`에 연결된 모든 사람이며, 연결 방식이 무엇이든 포함합니다:
```cypher
MATCH (p:person)-[:directed]->(:movie {title: 'Inception'}) RETURN p.name AS name
UNION
MATCH (p:person)-[:acted_in]->(:movie {title: 'Inception'}) RETURN p.name AS name;
```
```
name
---------------------
"Christopher Nolan"
"Leonardo DiCaprio"
(2 rows)
```
{#union-keep-or-drop-the-duplicates}
### 중복을 남기거나 버리기
여기서 두 갈래 모두 영화마다 하나씩 같은 18개 장르를 반환합니다. `UNION`이 그것을 셋으로
줄입니다:
```cypher
MATCH (m:movie) RETURN m.genre AS genre
UNION
MATCH (m:movie) RETURN m.genre AS genre;
```
```
genre
-------------
"Action"
"Sci-Fi"
"Adventure"
(3 rows)
```
`UNION DISTINCT`는 같은 문장을 온전히 적은 것입니다. `UNION ALL`은 두 갈래의 모든 행을
남깁니다:
```cypher
MATCH (m:movie {genre: 'Adventure'}) RETURN m.title AS film
UNION ALL
MATCH (m:movie) WHERE m.year = 2021 RETURN m.title AS film;
```
```
film
----------------------------
"Jurassic Park"
"The Matrix Resurrections"
(2 rows)
```
그 두 행은 어차피 서로 다르므로 `ALL`은 비용에만 드러납니다. 중복 제거를 건너뜁니다.
{#union-take-the-rows-in-both-queries}
### 두 쿼리 모두에 있는 행 취하기
```cypher
MATCH (m:movie {genre: 'Action'}) RETURN m.title AS film
INTERSECT
MATCH (m:movie) WHERE m.year < 1995 RETURN m.title AS film;
```
```
film
------------------------------
"The Terminator"
"Terminator 2: Judgment Day"
(2 rows)
```
{#union-subtract-one-query-from-another}
### 한 쿼리에서 다른 쿼리를 빼기
무언가를 연출했지만 연기한 적은 없는 사람들입니다:
```cypher
MATCH (p:person)-[:directed]->(m:movie) RETURN p.name AS name
EXCEPT
MATCH (p:person)-[:acted_in]->(m:movie) RETURN p.name AS name;
```
```
name
---------------------
"Andrew Niccol"
"Neill Blomkamp"
"Lana Wachowski"
"Lilly Wachowski"
"Joss Whedon"
"James Cameron"
"Luc Besson"
"Denis Villeneuve"
"Christopher Nolan"
"Paul Verhoeven"
"Ridley Scott"
"Steven Spielberg"
(12 rows)
```
행은 특정한 순서 없이 돌아옵니다.
{#union-sort-and-page-the-combined-result}
### 합쳐진 결과를 정렬하고 페이지로 나누기
집합 연산을 [`NEXT`](next.md) 사슬에 넣고, 합쳐진 행을 받는 사슬의 뒤쪽 절반에서 정렬하십시오:
```cypher
MATCH (m:movie) WHERE m.genre = 'Adventure' RETURN m.title AS film
UNION
MATCH (m:movie) WHERE m.genre = 'Sci-Fi' RETURN m.title AS film
NEXT ORDER BY film LIMIT 3 RETURN film;
```
```
film
---------------------
"Avatar"
"Blade Runner"
"Blade Runner 2049"
(3 rows)
```
[`CALL { subquery }`](call-subquery.md)로 감싸도 같은 일을 합니다:
```cypher
CALL { MATCH (m:movie) WHERE m.genre = 'Adventure' RETURN m.title AS film
UNION
MATCH (m:movie) WHERE m.genre = 'Sci-Fi' RETURN m.title AS film }
RETURN film ORDER BY film LIMIT 3;
```
```
film
---------------------
"Avatar"
"Blade Runner"
"Blade Runner 2049"
(3 rows)
```
{#union-reject-a-mismatched-column-count}
### 컬럼 수가 맞지 않으면 거부된다
```cypher
MATCH (m:movie) RETURN m.title AS t
UNION
MATCH (p:person) RETURN p.name AS n, p.born AS b;
```
```
ERROR: each UNION query must have the same number of columns
```
이 메시지는 세 연산자 모두에 대해 `UNION`을 이름으로 부릅니다.
{#union-notes}
## 참고
집합 연산 뒤에 쓴 `ORDER BY`·`SKIP`·`LIMIT`은 합쳐진 결과가 아니라 **이어진 것 중 마지막
쿼리**에 붙습니다. 그래서 집합이 합쳐지기 전에 그 한 갈래를 정렬하거나 페이지로 나눕니다. 여기서
`LIMIT 1`은 한 행을 내놓지 않습니다:
```cypher
MATCH (m:movie) WHERE m.genre = 'Adventure' RETURN m.title AS film
UNION
MATCH (m:movie) WHERE m.genre = 'Sci-Fi' RETURN m.title AS film
LIMIT 1;
```
```
film
-----------------
"Inception"
"Jurassic Park"
(2 rows)
```
공상 과학 갈래에서 `LIMIT`을 넘어 한 행이 살아남았고, 그 갈래는 `LIMIT`이 없으면 영화 10편을
반환합니다. 그 뒤에 Adventure 영화 한 편이 그 행에 합쳐졌습니다. 별칭 해석도 같은 규칙을 따르므로,
정렬 키는 마지막 갈래의 컬럼을 이름으로 불러야 합니다:
```cypher
MATCH (m:movie) RETURN m.title AS first_col
UNION
MATCH (p:person) RETURN p.name AS second_col
ORDER BY first_col LIMIT 2;
```
```
ERROR: variable does not exist
LINE 4: ORDER BY first_col LIMIT 2;
^
```
합쳐진 행을 정렬하거나 페이지로 나눠야 할 때는 언제든 위에 보인 `NEXT`나 `CALL` 형태를 쓰십시오.
SQL에서는 그 집합 연산 위의 `SELECT`도 같은 일을 합니다:
```psql
SELECT * FROM (
MATCH (m:movie) WHERE m.genre = 'Adventure' RETURN m.title AS film
UNION
MATCH (m:movie) WHERE m.genre = 'Sci-Fi' RETURN m.title AS film
) q ORDER BY film LIMIT 3;
```
```
film
---------------------
"Avatar"
"Blade Runner"
"Blade Runner 2049"
(3 rows)
```
{#union-compatibility}
## 호환성
{#union-set-operators-isoiec-39075-142}
### 집합 연산자 (ISO/IEC 39075 §14.2)
표준의 ``는
`UNION [ ] | EXCEPT [ ] | INTERSECT [ ]`이고,
수량자를 주지 않으면 `DISTINCT`가 암시됩니다. AgensGraph는 세 연산자와 두 수량자를 모두, 정확히 그
규칙대로 구현합니다. openCypher에는 `UNION`과 `UNION ALL`만 있으므로, `INTERSECT`와 `EXCEPT`는
여기서는 쓸 수 있고 거기서는 쓸 수 없습니다.
첫 쿼리가 아무것도 반환하지 않을 때만 둘째 쿼리의 행을 취하는 표준의 `OTHERWISE` 접속은 구현돼
있지 않습니다.
{#union-sorting-a-combined-result-isoiec-39075-149}
### 합쳐진 결과 정렬하기 (ISO/IEC 39075 §14.9)
표준은 ``를 현재 작업 표에 적용하는데, 복합 쿼리 뒤에서 그것은 합쳐진
결과입니다. AgensGraph는 그것을 대신 이어진 것의 마지막 쿼리에 붙이며, [참고](#union-notes)에 그것이
나옵니다. 그 연산이 내놓은 것을 정렬하거나 페이지로 나누려면 집합 연산을 `NEXT`, `CALL { }`, 또는
SQL의 `SELECT`로 감싸십시오.
{#union-see-also}
## 관련 항목
- [`RETURN`](return.md) — 집합 연산의 모든 갈래가 이것으로 끝난다
- [`NEXT`](next.md) {bdg-primary-line}`GQL` — 합쳐진 행에 쿼리를 더 이어 붙이기
- [`CALL { subquery }`](call-subquery.md) — 집합 연산을 감싸는 또 다른 방법
- [`ORDER BY`](order-by.md), [`SKIP`·`LIMIT`](skip-and-limit.md) — 여기서 그것들이 붙는 대상
- [SQL과 Cypher 섞기](../../querying/combining-sql-and-cypher.md) — SQL에서 집합 연산을 정렬하기