{#finish-finish}
# FINISH
{bdg-primary-line}`GQL 절` {bdg-secondary-line}`2.18에 추가`
아무것도 투영하지 않고 쿼리를 끝냅니다. 작업은 실행되고, 쿼리는 빈 결과를 반환합니다.
{#finish-synopsis}
## 개요
FINISH
굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
{#finish-description}
## 설명
모든 쿼리는 `RETURN`, `FINISH`, 또는 쓰기 절로 끝나야 합니다. `FINISH`는 "결과를 내놓지 않는다"고
말하는 끝맺음입니다. 인자를 받지 않고, 컬럼을 투영하지 않으며, 문장을 닫습니다.
- `FINISH`는 **마지막** 절이어야 합니다. 그 뒤에 무엇이 오면
`FINISH must be at the end of the query`가 나옵니다.
- 읽기 뒤의 `FINISH`는 행을 버립니다. 플래너가 그것을 `LIMIT 0`으로 적용하므로, 스캔은 열리지만
행은 하나도 가져오지 않습니다.
- 쓰기 뒤에서도 쓰기는 그대로 일어납니다. `FINISH`는 투영만 억제합니다.
- `FINISH`로 끝나는 쿼리는 **빈 결과**를 반환합니다. 컬럼도 행도 없습니다. `psql`은 그것을 `--`
머리와 그 뒤의 `(0 rows)`로 출력하고, `\gdesc`는
`The command has no result, or the result has no columns.` 라고 보고합니다.
- `FINISH`로 끝나는 쓰기는 결과 대신 자기 명령 태그를 보고합니다. 정점 하나를 만들었다면
`UPDATE 1` 같은 것입니다.
{#finish-examples}
## 예제
모든 예제는 [예제 데이터셋](../../get_started/example-dataset.md)에서 실행됩니다.
실행 계획만 보려고 읽기를 실행하는 경우입니다. 이것을 표기하는 Cypher 방식은 없습니다. `RETURN`도
쓰기 절도 없는 Cypher 쿼리는 거부됩니다:
```cypher
MATCH (m:movie) FINISH;
```
```
--
(0 rows)
```
{#finish-perform-a-write-without-reading-the-result-back}
### 결과를 다시 읽지 않고 쓰기
만들어진 요소를 클라이언트로 보내고 싶지 않을 때 꺼내 쓸 형태가 `CREATE … FINISH`입니다:
```cypher
CREATE (:movie {title: 'Tenet', year: 2020, genre: 'Action'}) FINISH;
```
```
UPDATE 1
```
그 정점은 만들어져 있습니다:
```cypher
MATCH (m:movie {title: 'Tenet'}) RETURN m.title AS film, m.year AS year;
```
```
film | year
---------+------
"Tenet" | 2020
(1 row)
```
{#finish-confirm-that-a-read-costs-nothing-after-finish}
### FINISH 뒤의 읽기가 비용을 들이지 않음을 확인하기
실행 계획에 이 절이 컴파일된 `LIMIT 0`이 보이고, 그 아래에는 한 번도 값을 가져가지 않는 스캔이
있습니다:
```cypher
EXPLAIN (COSTS OFF) MATCH (m:movie) FINISH;
```
```
QUERY PLAN
---------------------------
Limit
-> Seq Scan on movie m
(2 rows)
```
쓰기 계획은 쓰기 노드를 유지합니다. 그 쓰기는 선택이 아니기 때문입니다:
```cypher
EXPLAIN (COSTS OFF) CREATE (:movie {title: 'Tenet'}) FINISH;
```
```
QUERY PLAN
--------------
Graph Create
-> Result
(2 rows)
```
{#finish-end-a-sorted-query-that-projects-nothing}
### 아무것도 투영하지 않는, 정렬된 쿼리 끝맺기
`ORDER BY`, `SKIP`, `OFFSET`, `LIMIT`은 그 자체로 절이지만 어느 것도 쿼리를 끝낼 수 없습니다.
`FINISH`가 그런 절로 끝나는 파이프라인을 닫아 줍니다:
```cypher
MATCH (m:movie) ORDER BY m.year LIMIT 3 FINISH;
```
```
--
(0 rows)
```
`FINISH`가 없으면 같은 쿼리가
`Cypher query must end with RETURN, FINISH or update clause`를 냅니다.
{#finish-notes}
## 참고
결과가 필요한 자리에서는 `FINISH`가 받아들여지지 않습니다. `CALL { }` 본문은 무언가를 투영해야
하므로, `FINISH`로 끝나는 본문은 `CALL subquery must RETURN at least one variable`을 냅니다.
`FINISH`로 끝나는 쿼리는 [`NEXT`](next.md)의 왼쪽 피연산자가 될 수도 없습니다. 그 경우
`FINISH cannot be followed by NEXT`가 나옵니다.
```{note}
`finish`는 2.18에서 예약 키워드가 됐습니다. 패턴 안의 레이블 이름으로는 따옴표 없이도 여전히
받아들여지며(`MATCH (n:finish)`), 업그레이드한 데이터베이스에 필요한 것이 그것입니다. 변수 이름,
`CREATE VLABEL` 이름, SQL 식별자로는 받아들여지지 않습니다. 그 자리에는 `"finish"`로 쓰거나 이름을
바꾸십시오. 속성 키와 `RETURN` 별칭은 영향을 받지 않습니다.
```
{#finish-compatibility}
## 호환성
```{admonition} GQL 적합성
:class: gql-conformance
GQL *기본 결과 문장*(ISO/IEC 39075:2024 §14.10)의 `FINISH`를 구현합니다. 표준은 `FINISH`가 "빈
타입"을 가지며 실행 결과를 "결과가 생략된 성공"으로 설정한다고 규정하는데, 위의 컬럼 없는 빈 결과가
그것을 나타냅니다.
- **지원** — 읽기 쿼리와 데이터를 바꾸는 쿼리의 마지막 문장으로 쓰는 `FINISH`. 후자의 경우 표준은
그것을 어차피 암시적인 것으로 봅니다(§13.1).
- **미지원** — 집합 연산의 한 갈래로 쓰는 `FINISH`. 표준도 그것을 금지합니다(§14.2, 구문 규칙 5).
AgensGraph는 컬럼 수 불일치로 거부합니다: `each UNION query must have the same number of columns`.
진행 상황은 [GQL 적합성 표](../../appendix/gql-conformance.md)에서 확인하십시오.
```
{#finish-opencypher}
### openCypher
openCypher에는 `FINISH`가 없습니다. 거기서는 읽기 쿼리가 `RETURN`으로 끝나야 하고, 쓰기 쿼리는
자기 쓰기 절로 끝날 수 있습니다. AgensGraph는 두 번째 형태도 받으므로, `FINISH`는 무언가를 대체하는
것이 아니라 읽기 경우를 더해 줍니다.
{#finish-see-also}
## 관련 항목
- [`RETURN`](return.md) — 쿼리를 끝내는 또 다른 방법
- [`ORDER BY`](order-by.md)와 [`SKIP`·`LIMIT`](skip-and-limit.md) — 끝맺는 절이 필요한 절들
- [`NEXT`](next.md) {bdg-secondary-line}`GQL` — `FINISH`가 앞설 수 없는 유일한 절
- [`INSERT`](insert.md) {bdg-secondary-line}`GQL` — `FINISH`로 끝낼 만한 쓰기
- [GQL 적합성 표](../../appendix/gql-conformance.md)