{#order-by-order-by} # ORDER BY {bdg-primary-line}`GQL 절` 작업 행을 정렬합니다. 그 자체로 절이므로 끝에서만이 아니라 파이프라인의 어디서나 정렬할 수 있습니다. {#order-by-synopsis} ## 개요
ORDER BY sort_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) — 작업을 줄이려고 파이프라인 도중에 정렬하기