굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
{#return-description}
## 설명
`RETURN`은 마지막 투영입니다. 작업 행마다 한 번씩 자기 표현식을 평가해 그것을 쿼리의 결과 컬럼으로
내놓습니다. 읽기 쿼리는 `RETURN`이나 [`FINISH`](finish.md)로 끝나야 합니다. 쓰기 쿼리는 그 둘 중
하나로 끝나거나 쓰기 절 자체로 끝날 수 있습니다.
- **속성에서 끌어낸 컬럼은 jsonb로 돌아옵니다.** `RETURN m.title`은 `"The Matrix"`를 따옴표와 함께
출력하고, `RETURN m.title::text`도 그렇습니다. 평범한 스칼라를 얻으려면 그 쿼리를 SQL로
감싸십시오. [참고](#return-notes)를 보십시오.
- `*`는 유효 범위의 **이름 있는** 바인딩을 모두 투영합니다. 이름을 붙이지 않은 패턴 요소는 투영되지
않습니다.
- 목록 안의 **집계 함수**는 암시적으로 그룹화합니다. 집계되지 않은 표현식이 그룹화 키가 되며, SQL에서
`GROUP BY`를 쓴 것과 같습니다.
- `DISTINCT`는 중복된 결과 행을 없앱니다. `ALL`은 기본값을 명시적으로 적은 것이고 중복을 남깁니다.
- `ORDER BY`, `SKIP`/`OFFSET`, `LIMIT`은 `RETURN`의 일부가 아니라 그 뒤에 오는 **별개의 절**입니다.
각각 자기 페이지가 있습니다. [`ORDER BY`](order-by.md)와 [`SKIP`·`LIMIT`](skip-and-limit.md)입니다.
- [`WITH`](with.md)와 달리 `RETURN`은 같은 출력 이름을 두 번 허용합니다. 그 뒤에서 그것을 해석해야
하는 것이 없기 때문입니다.
{#return-parameters}
## 매개변수
DISTINCT
: 결과에서 중복 행을 없앱니다.
ALL
: 중복 행을 그대로 둡니다. 기본값입니다.
\*
: 지금 유효 범위에 있는 이름 있는 바인딩을 모두 투영합니다.
expression
: 유효 범위의 바인딩에 대한 Cypher 표현식이면 무엇이든 됩니다. 정점·간선 변수, 속성 참조, 경로
변수, 함수 호출, 집계 함수, 산술 표현식이나 `CASE` 표현식, 리스트·맵 생성자, 상수가 그렇습니다.
alias
: 결과 컬럼의 이름입니다. 큰따옴표가 없으면 소문자로 접힙니다. 적은 대소문자를 유지하려면 따옴표로
감싸십시오. 별칭이 없으면 속성 참조는 그 속성의 이름을 가져가고, 그 밖의 것은 `?column?`이
됩니다.
{#return-examples}
## 예제
모든 예제는 [예제 데이터셋](../../get_started/example-dataset.md)에서 실행됩니다.
{#return-return-a-whole-vertex}
### 정점 전체 반환하기
```cypher
MATCH (p:person {name: 'Keanu Reeves'})
RETURN p;
```
```
p
---------------------------------------------------
person[4.1]{"born": 1964, "name": "Keanu Reeves"}
(1 row)
```
정점은 `label[id]{properties}` 형태로 출력됩니다. 간선은 양 끝점을 더해 출력합니다:
```cypher
MATCH (:person {name: 'Keanu Reeves'})-[r:acted_in]->(:movie {title: 'The Matrix'})
RETURN r;
```
```
r
---------------------------------------
acted_in[5.1][4.1,3.1]{"role": "Neo"}
(1 row)
```
{#return-return-properties-with-and-without-an-alias}
### 별칭이 있을 때와 없을 때의 속성 반환
```cypher
MATCH (p:person {name: 'Keanu Reeves'})
RETURN p.born;
```
```
born
------
1964
(1 row)
```
별칭 없는 속성 참조는 그 속성의 이름을 가져갑니다. 계산된 표현식에는 가져갈 이름이 없습니다:
```cypher
MATCH (p:person {name: 'Keanu Reeves'})
RETURN p.born + 1;
```
```
?column?
----------
1965
(1 row)
```
따옴표 없는 별칭은 소문자로 접히고, 따옴표를 붙인 별칭은 그렇지 않습니다:
```cypher
MATCH (p:person {name: 'Keanu Reeves'})
RETURN p.born AS BornIn;
```
```
bornin
--------
1964
(1 row)
```
```cypher
MATCH (p:person {name: 'Keanu Reeves'})
RETURN p.born AS "BornIn";
```
```
BornIn
--------
1964
(1 row)
```
{#return-return-everything-that-has-a-name}
### 이름 있는 것 전부 반환하기
```cypher
MATCH (p:person {name: 'Ryan Gosling'})-[r:acted_in]->(m:movie)
RETURN *;
```
```
p | r | m
----------------------------------------------------+---------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
person[4.10]{"born": 1980, "name": "Ryan Gosling"} | acted_in[5.13][4.10,3.9]{"role": "K"} | movie[3.9]{"plot": "A new blade runner unearths a long-buried secret that has the potential to plunge what's left of society into chaos.", "year": 2017, "genre": "Sci-Fi", "title": "Blade Runner 2049", "embedding": [0.21560573, -0.07505179, -0.01331814, 0.13403069]}
(1 row)
```
이름 있는 요소마다 하나씩 세 컬럼입니다. 그 패턴을
`(p:person {name: 'Ryan Gosling'})-[:acted_in]->(m:movie)`로 적었다면 `RETURN *`은 둘을 줬을
것입니다.
{#return-remove-duplicate-rows}
### 중복 행 없애기
`acted_in` 간선 스물다섯 개가 세 장르의 영화를 가리킵니다:
```cypher
MATCH (p:person)-[:acted_in]->(m:movie)
RETURN DISTINCT m.genre AS genre
ORDER BY genre;
```
```
genre
-------------
"Action"
"Adventure"
"Sci-Fi"
(3 rows)
```
`DISTINCT`가 없으면 같은 쿼리가 25행을 반환합니다. `ALL`이 그 기본값을 명시적으로 적은
형태입니다.
{#return-aggregate}
### 집계
다른 표현식 없이 쓴 집계 함수는 입력 전체를 한 행으로 접습니다:
```cypher
MATCH (m:movie)
RETURN count(*) AS films, min(m.year) AS earliest, max(m.year) AS latest;
```
```
films | earliest | latest
-------+----------+--------
18 | 1982 | 2021
(1 row)
```
그 옆에 다른 표현식을 나열하면 그 표현식이 그룹화 키가 됩니다:
```cypher
MATCH (p:person)-[:acted_in]->(m:movie)
RETURN m.genre AS genre, count(*) AS roles
ORDER BY genre;
```
```
genre | roles
-------------+-------
"Action" | 13
"Adventure" | 1
"Sci-Fi" | 11
(3 rows)
```
`collect()`는 한 그룹을 리스트로 모읍니다:
```cypher
MATCH (p:person)-[:acted_in]->(m:movie {title: 'The Matrix'})
RETURN collect(p.name) AS cast;
```
```
cast
------------------------------------------------------------
["Keanu Reeves", "Laurence Fishburne", "Carrie-Anne Moss"]
(1 row)
```
{#return-return-a-constant}
### 상수 반환하기
`RETURN` 앞에 패턴이 있어야 하는 것은 아닙니다:
```cypher
RETURN 1 + 2 AS sum, 'Hello' AS greeting;
```
```
sum | greeting
-----+----------
3 | "Hello"
(1 row)
```
{#return-notes}
## 참고
속성에서 끌어낸 컬럼이 jsonb로 돌아오므로, 네이티브 타입을 원하는 애플리케이션에게 `RETURN`은
좋지 않은 인터페이스입니다. Cypher를 `SELECT` 서브쿼리에 넣고 거기서 벗겨 내십시오. jsonb 연산자가
그 일을 합니다. `->>`는 키를 텍스트로 읽고, `#>> '{}'`은 jsonb 스칼라 컬럼을 텍스트로 꺼냅니다.
```psql
SELECT d.props ->> 'title' AS film, r.score
FROM (MATCH (p:person)-[:directed]->(m:movie)
WHERE p.name = 'Christopher Nolan'
RETURN properties(m) AS props) d
JOIN rating r ON r.title = d.props ->> 'title'
WHERE r.source = 'critics'
ORDER BY r.score DESC;
```
```
film | score
--------------+-------
Inception | 8.8
Interstellar | 8.7
(2 rows)
```
여기서 영화 제목은 따옴표 없는 텍스트이고, `score`는 그 테이블 자신의 numeric입니다. 이 방식은
[SQL과 Cypher 섞기](../../querying/combining-sql-and-cypher.md)가 온전히 다룹니다.
{#return-compatibility}
## 호환성
{#return-column-types}
### 컬럼 타입
ISO/IEC 39075 §14.11의 ``는 결과 컬럼에 그 표현식의 선언된 타입을 줍니다.
AgensGraph는 표현식의 타입과 무관하게, 명시적으로 형 변환한 뒤에도 모든 Cypher 결과 컬럼을 jsonb로
반환합니다. 위에서처럼 SQL에서 벗겨 내십시오.
{#return-distinct-and-order-by}
### DISTINCT와 ORDER BY
`RETURN DISTINCT` 뒤의 `ORDER BY`는 투영에 나타나는 표현식으로만 정렬할 수 있습니다:
```cypher
MATCH (m:movie) RETURN DISTINCT m.genre AS genre ORDER BY m.year;
```
```
ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list
```
SQL의 `SELECT DISTINCT` 규칙과 같습니다. 정렬 키를 투영하거나, `DISTINCT`를 빼고 그룹화 집계로
중복을 없애십시오.
{#return-see-also}
## 관련 항목
- [`WITH`](with.md) — 파이프라인 가운데에 있는, 같은 투영
- [`ORDER BY`](order-by.md), [`SKIP`·`LIMIT`](skip-and-limit.md) — `RETURN` 뒤에 오는 절들
- [`FINISH`](finish.md) — 행을 반환하지 않고 쿼리 끝내기
- [`UNION`](union.md) — 여러 쿼리의 결과 합치기
- [SQL과 Cypher 섞기](../../querying/combining-sql-and-cypher.md) — 네이티브 타입으로 꺼내기