{#order-by-order-by}
# ORDER BY
{bdg-primary-line}`GQL 절`
작업 행을 정렬합니다. 그 자체로 절이므로 끝에서만이 아니라 파이프라인의 어디서나 정렬할 수
있습니다.
{#order-by-synopsis}
## 개요
ORDER BYsort_key[ASC|DESC][NULLS{FIRST|LAST}][, ...]
굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
{#order-by-description}
## 설명
`ORDER BY`는 지금 파이프라인에 있는 행을 정렬합니다. 자기가 정렬할 행을 내놓은 절 뒤에 쓰며, 그
절의 출력에 적용됩니다. 그 절은 [`RETURN`](return.md), [`WITH`](with.md), 또는
[`MATCH`](match.md)입니다.
- 행은 첫 정렬 키로 비교되고, 같으면 다음 키로 넘어가며, 그렇게 이어집니다.
- `DESC`를 쓰지 않으면 각 키는 오름차순으로 정렬됩니다. `ASC`가 명시적인 기본값입니다.
- `NULLS FIRST`나 `NULLS LAST`로 달리 말하지 않으면, null은 `ASC`에서 **맨 뒤**로, `DESC`에서 **맨
앞**으로 갑니다.
- 정렬 키는 컬럼 번호가 아니라 표현식입니다. `ORDER BY 2`는 상수 2로 정렬하므로 아무것도 정렬하지
않습니다. [호환성](#order-by-compatibility)을 보십시오.
- `ORDER BY`는 쿼리를 **시작**할 수도, **끝낼** 수도 없습니다.
- `RETURN DISTINCT` 뒤에서는 모든 정렬 키가 투영에 나타나야 합니다.
홀로 서는 절이므로 파이프라인 가운데에서도 정렬할 수 있습니다. 뒤따르는 절이 처리해야 하는 행을
줄이려고 보통 [`LIMIT`](skip-and-limit.md)이 뒤에 옵니다.
{#order-by-parameters}
## 매개변수
sort_key
: 유효 범위의 바인딩에 대한 표현식입니다. `RETURN`이나 `WITH` 뒤에서는 그 절의 별칭도 포함되며,
아예 투영되지 않은 표현식이어도 됩니다.
ASC, DESC
: 오름차순 또는 내림차순입니다. `ASC`가 기본값입니다.
NULLS FIRST, NULLS LAST
: null 값이 놓이는 자리입니다. 기본값은 오름차순 키에서 `NULLS LAST`, 내림차순 키에서
`NULLS FIRST`입니다.
{#order-by-examples}
## 예제
모든 예제는 [예제 데이터셋](../../get_started/example-dataset.md)에서 실행됩니다.
{#order-by-sort-by-a-projected-column}
### 투영한 컬럼으로 정렬하기
```cypher
MATCH (m:movie) WHERE m.year > 2015
RETURN m.title AS film, m.year AS year
ORDER BY year;
```
```
film | year
----------------------------+------
"Blade Runner 2049" | 2017
"The Matrix Resurrections" | 2021
(2 rows)
```
{#order-by-sort-by-something-you-did-not-project}
### 투영하지 않은 것으로 정렬하기
정렬 키는 평범한 표현식이므로 결과 컬럼일 필요가 없습니다:
```cypher
MATCH (m:movie)
RETURN m.title AS film
ORDER BY m.year
LIMIT 3;
```
```
film
------------------
"Blade Runner"
"The Terminator"
"Total Recall"
(3 rows)
```
```cypher
MATCH (p:person)
RETURN p.name AS person
ORDER BY length(p.name) DESC
LIMIT 3;
```
```
person
-------------------------
"Arnold Schwarzenegger"
"Matthew McConaughey"
"Laurence Fishburne"
(3 rows)
```
{#order-by-sort-by-several-keys-in-different-directions}
### 여러 키로, 서로 다른 방향으로 정렬하기
```cypher
MATCH (m:movie)
RETURN m.genre AS genre, m.year AS year, m.title AS film
ORDER BY genre, year DESC
LIMIT 5;
```
```
genre | year | film
----------+------+----------------------------
"Action" | 2021 | "The Matrix Resurrections"
"Action" | 2012 | "The Avengers"
"Action" | 2003 | "The Matrix Reloaded"
"Action" | 2003 | "The Matrix Revolutions"
"Action" | 1999 | "The Matrix"
(5 rows)
```
`genre`는 오름차순이고, 각 장르 안에서 `year`는 내림차순입니다.
{#order-by-place-the-nulls}
### null의 자리 정하기
`OPTIONAL MATCH`는 null을 남기므로 기본 동작이 눈에 보입니다. 오름차순은 그것을 맨 뒤에
둡니다:
```cypher
MATCH (p:person) WHERE p.born > 1974
OPTIONAL MATCH (p)-[:directed]->(m:movie)
RETURN p.name AS person, m.title AS directed
ORDER BY directed;
```
```
person | directed
-------------------+-----------
"Neill Blomkamp" | "Elysium"
"Ryan Gosling" |
"Sam Worthington" |
(3 rows)
```
내림차순은 그것을 맨 앞에 둡니다:
```cypher
MATCH (p:person) WHERE p.born > 1974
OPTIONAL MATCH (p)-[:directed]->(m:movie)
RETURN p.name AS person, m.title AS directed
ORDER BY directed DESC;
```
```
person | directed
-------------------+-----------
"Ryan Gosling" |
"Sam Worthington" |
"Neill Blomkamp" | "Elysium"
(3 rows)
```
`NULLS FIRST`는 정렬 방향을 뒤집지 않고 그 자리를 요구합니다:
```cypher
MATCH (p:person) WHERE p.born > 1974
OPTIONAL MATCH (p)-[:directed]->(m:movie)
RETURN p.name AS person, m.title AS directed
ORDER BY directed NULLS FIRST;
```
```
person | directed
-------------------+-----------
"Ryan Gosling" |
"Sam Worthington" |
"Neill Blomkamp" | "Elysium"
(3 rows)
```
{#order-by-sort-in-the-middle-of-a-pipeline}
### 파이프라인 가운데에서 정렬하기
`MATCH` 뒤의 `ORDER BY`에 `LIMIT`을 붙이면 쿼리의 나머지가 보는 범위가 좁아집니다:
```cypher
MATCH (m:movie)
ORDER BY m.year DESC LIMIT 2
MATCH (p:person)-[:directed]->(m)
RETURN m.title AS film, p.name AS director
ORDER BY film;
```
```
film | director
----------------------------+--------------------
"Blade Runner 2049" | "Denis Villeneuve"
"The Matrix Resurrections" | "Lana Wachowski"
(2 rows)
```
둘째 `MATCH`는 열여덟 행이 아니라 두 행을 상대로 실행됩니다.
{#order-by-where-order-by-cannot-go}
### ORDER BY가 놓일 수 없는 자리
쿼리를 시작할 수 없습니다:
```cypher
ORDER BY 1;
```
```
ERROR: syntax error at or near "ORDER"
LINE 1: ORDER BY 1;
^
```
그리고 쿼리를 닫을 수도 없습니다. 정렬은 그 자체로 결과를 내놓지 않기 때문입니다:
```cypher
MATCH (m:movie) ORDER BY m.title;
```
```
ERROR: Cypher query must end with RETURN, FINISH or update clause
```
{#order-by-notes}
## 참고
속성을 정렬하는 것은 jsonb 값을 정렬하는 것입니다. jsonb는 값보다 타입을 먼저 정렬합니다. 숫자가
모든 문자열보다 위에 오고, 그 둘이 null보다 위에 옵니다. 그래서 값의 타입이 섞인 키는 타입별로 먼저
묶입니다. 저장된 타입이 섞여 있는데 그 전체를 하나의 순서로 정렬하고 싶다면 그 키를 형 변환하십시오.
{#order-by-compatibility}
## 호환성
{#order-by-a-number-is-a-sort-key-not-a-column-reference}
### 숫자는 컬럼 참조가 아니라 정렬 키다
SQL에서 `ORDER BY 2`는 두 번째 출력 컬럼으로 정렬합니다. 여기서 정렬 키는 값 표현식이므로 그
정수는 상수입니다. 모든 행이 같다고 비교되고, 아무것도 재배열되지 않으며, 오류도 나지 않습니다.
```cypher
MATCH (m:movie) WHERE m.year > 2015
RETURN m.title AS film, m.year AS year
ORDER BY 2;
```
```
film | year
----------------------------+------
"The Matrix Resurrections" | 2021
"Blade Runner 2049" | 2017
(2 rows)
```
행이 연도순이 아니라 스캔 순서로 돌아옵니다. 이 페이지의 첫 예제가 보여 주듯 키를 이름으로 부르면
제대로 정렬됩니다. 이것은 ISO/IEC 39075 §16.17을 따르는 것이며, 거기서 ``는 순번 형태가
없는 ``입니다. 벗어나 있는 것은 SQL 쪽입니다. 정렬 키는 항상 이름으로
부르십시오.
{#order-by-ascending-and-descending-isoiec-39075-1617}
### ASCENDING과 DESCENDING (ISO/IEC 39075 §16.17)
표준은 `ASC`·`DESC`와 함께 `ASCENDING`·`DESCENDING`도 받습니다. AgensGraph는 짧은 표기만 받습니다.
`ORDER BY film ASCENDING`은 구문 오류입니다.
{#order-by-see-also}
## 관련 항목
- [`SKIP`·`LIMIT`](skip-and-limit.md) — 정렬 뒤에 흔히 오는 페이지 나누기 절
- [`RETURN`](return.md), [`WITH`](with.md) — 정렬이 적용되는 투영
- [`MATCH`](match.md) — 작업을 줄이려고 파이프라인 도중에 정렬하기