ORDER BY#
GQL 절
작업 행을 정렬합니다. 그 자체로 절이므로 끝에서만이 아니라 파이프라인의 어디서나 정렬할 수 있습니다.
개요#
굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
설명#
ORDER BY는 지금 파이프라인에 있는 행을 정렬합니다. 자기가 정렬할 행을 내놓은 절 뒤에 쓰며, 그
절의 출력에 적용됩니다. 그 절은 RETURN, WITH, 또는
MATCH입니다.
행은 첫 정렬 키로 비교되고, 같으면 다음 키로 넘어가며, 그렇게 이어집니다.
DESC를 쓰지 않으면 각 키는 오름차순으로 정렬됩니다.ASC가 명시적인 기본값입니다.NULLS FIRST나NULLS LAST로 달리 말하지 않으면, null은ASC에서 맨 뒤로,DESC에서 맨 앞으로 갑니다.정렬 키는 컬럼 번호가 아니라 표현식입니다.
ORDER BY 2는 상수 2로 정렬하므로 아무것도 정렬하지 않습니다. 호환성을 보십시오.ORDER BY는 쿼리를 시작할 수도, 끝낼 수도 없습니다.RETURN DISTINCT뒤에서는 모든 정렬 키가 투영에 나타나야 합니다.
홀로 서는 절이므로 파이프라인 가운데에서도 정렬할 수 있습니다. 뒤따르는 절이 처리해야 하는 행을
줄이려고 보통 LIMIT이 뒤에 옵니다.
매개변수#
- sort_key
유효 범위의 바인딩에 대한 표현식입니다.
RETURN이나WITH뒤에서는 그 절의 별칭도 포함되며, 아예 투영되지 않은 표현식이어도 됩니다.- ASC, DESC
오름차순 또는 내림차순입니다.
ASC가 기본값입니다.- NULLS FIRST, NULLS LAST
null 값이 놓이는 자리입니다. 기본값은 오름차순 키에서
NULLS LAST, 내림차순 키에서NULLS FIRST입니다.
예제#
모든 예제는 예제 데이터셋에서 실행됩니다.
투영한 컬럼으로 정렬하기#
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)
투영하지 않은 것으로 정렬하기#
정렬 키는 평범한 표현식이므로 결과 컬럼일 필요가 없습니다:
MATCH (m:movie)
RETURN m.title AS film
ORDER BY m.year
LIMIT 3;
film
------------------
"Blade Runner"
"The Terminator"
"Total Recall"
(3 rows)
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)
여러 키로, 서로 다른 방향으로 정렬하기#
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는 내림차순입니다.
null의 자리 정하기#
OPTIONAL MATCH는 null을 남기므로 기본 동작이 눈에 보입니다. 오름차순은 그것을 맨 뒤에
둡니다:
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)
내림차순은 그것을 맨 앞에 둡니다:
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는 정렬 방향을 뒤집지 않고 그 자리를 요구합니다:
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)
파이프라인 가운데에서 정렬하기#
MATCH 뒤의 ORDER BY에 LIMIT을 붙이면 쿼리의 나머지가 보는 범위가 좁아집니다:
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가 놓일 수 없는 자리#
쿼리를 시작할 수 없습니다:
ORDER BY 1;
ERROR: syntax error at or near "ORDER"
LINE 1: ORDER BY 1;
^
그리고 쿼리를 닫을 수도 없습니다. 정렬은 그 자체로 결과를 내놓지 않기 때문입니다:
MATCH (m:movie) ORDER BY m.title;
ERROR: Cypher query must end with RETURN, FINISH or update clause
참고#
속성을 정렬하는 것은 jsonb 값을 정렬하는 것입니다. jsonb는 값보다 타입을 먼저 정렬합니다. 숫자가 모든 문자열보다 위에 오고, 그 둘이 null보다 위에 옵니다. 그래서 값의 타입이 섞인 키는 타입별로 먼저 묶입니다. 저장된 타입이 섞여 있는데 그 전체를 하나의 순서로 정렬하고 싶다면 그 키를 형 변환하십시오.
호환성#
숫자는 컬럼 참조가 아니라 정렬 키다#
SQL에서 ORDER BY 2는 두 번째 출력 컬럼으로 정렬합니다. 여기서 정렬 키는 값 표현식이므로 그
정수는 상수입니다. 모든 행이 같다고 비교되고, 아무것도 재배열되지 않으며, 오류도 나지 않습니다.
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을 따르는 것이며, 거기서 <sort key>는 순번 형태가
없는 <aggregating value expression>입니다. 벗어나 있는 것은 SQL 쪽입니다. 정렬 키는 항상 이름으로
부르십시오.
ASCENDING과 DESCENDING (ISO/IEC 39075 §16.17)#
표준은 ASC·DESC와 함께 ASCENDING·DESCENDING도 받습니다. AgensGraph는 짧은 표기만 받습니다.
ORDER BY film ASCENDING은 구문 오류입니다.
관련 항목#
SKIP·LIMIT— 정렬 뒤에 흔히 오는 페이지 나누기 절MATCH— 작업을 줄이려고 파이프라인 도중에 정렬하기