ORDER BY 절

ORDER BY 절 (ORDER BY Clause)

쿼리 결과를 어떤 순서로 정렬하고 싶을 때 ORDER BY 절을 써요. ORDER BY는 출력 수정자예요. 논리적으로는 쿼리의 맨 끝부분(가까이)에 적용되죠 — LIMIT이나 OFFSET이 있다면 그 직전에 적용돼요. ORDER BY 절은 정렬 기준에 따라 행을 오름차순 또는 내림차순으로 정렬해요. 또한 각 정렬 조항은 NULL 값을 앞으로 이동시킬지 뒤로 이동시킬지 지정할 수 있어요.

ORDER BY 절은 콤마로 구분된 하나 이상의 표현식을 포함할 수 있어요. 표현식이 포함되지 않으면 오류가 발생해요 — 그런 상황에서는 ORDER BY 절 자체를 제거해야 하니까요. 표현식은 임의의 스칼라 표현식(열 이름일 수도 있음), 열 위치 번호(1부터 시작하는 인덱스), 또는 키워드 ALL로 시작할 수 있어요. 각 표현식은 선택적으로 순서 수정자(ASC 또는 DESC, 기본값은 ASC) 및/또는 NULL 순서 수정자(NULLS FIRST 또는 NULLS LAST, 기본값은 NULLS LAST)가 뒤에 올 수 있어요.

출처: DuckDB 공식 문서 — ORDER BY

ORDER BY ALL

ALL 키워드는 왼쪽에서 오른쪽으로 모든 열을 기준으로 출력을 정렬해야 함을 나타내요. 이 정렬 방향은 ORDER BY ALL ASC 또는 ORDER BY ALL DESC 및/또는 NULLS FIRST 또는 NULLS LAST를 사용하여 수정할 수 있어요.

참고: ALLORDER BY 절에서 다른 표현식과 함께 사용할 수 없어요 — 반드시 단독으로 사용해야 해요. 아래 예제를 보세요.

NULL 순서 수정자

기본적으로 DuckDB는 ASCNULLS LAST로 정렬해요. 즉, 값은 오름차순으로 정렬되고 NULL 값은 마지막에 배치돼요. 기본 ASC 방향에서는 이 동작이 PostgreSQL과 일치해요. 하지만 DuckDB는 DESC 정렬에서도 NULLS LAST를 유지하는 반면, PostgreSQL은 DESC에서 NULL을 먼저 배치한다는 점(NULL을 가장 큰 값으로 취급)을 참고하세요. 두 방향 모두에서 PostgreSQL과 일치시키려면 default_null_order = 'NULLS_LAST_ON_ASC_FIRST_ON_DESC'로 설정하세요.

기본 정렬 순서는 다음 구성 옵션으로 변경할 수 있어요.

default_null_order 옵션을 사용해 기본 NULL 정렬 순서를 NULLS_FIRST, NULLS_LAST, NULLS_FIRST_ON_ASC_LAST_ON_DESC 또는 NULLS_LAST_ON_ASC_FIRST_ON_DESC 중 하나로 변경해요:

SET default_null_order = 'NULLS_FIRST';

default_order 옵션을 사용해 기본 정렬 순서의 방향을 DESC 또는 ASC로 변경해요:

SET default_order = 'DESC';

콜레이션 (Collations)

텍스트는 기본적으로 이진 비교 콜레이션(binary comparison collation)으로 정렬돼요. 즉 값이 이진 UTF-8 값에 따라 정렬된다는 뜻이에요. 이는 ASCII 텍스트(예: 영어 데이터)에는 잘 작동하지만, 다른 언어에서는 정렬 순서가 틀릴 수 있어요. 이를 위해 DuckDB는 콜레이션을 제공해요. 콜레이션에 대한 자세한 내용은 Collation 페이지를 참고하세요.

예제 (Examples)

모든 예제는 다음 예제 테이블을 사용해요:

CREATE OR REPLACE TABLE addresses AS
    SELECT '123 Quack Blvd' AS address, 'DuckTown' AS city, '11111' AS zip
    UNION ALL
    SELECT '111 Duck Duck Goose Ln', 'DuckTown', '11111'
    UNION ALL
    SELECT '111 Duck Duck Goose Ln', 'Duck Town', '11111'
    UNION ALL
    SELECT '111 Duck Duck Goose Ln', 'Duck Town', '11111-0001';

기본 NULL 순서와 기본 순서를 사용해 도시 이름으로 정렬한 주소를 선택해요:

SELECT *
FROM addresses
ORDER BY city;

도시 이름을 내림차순, NULL을 끝에 두고 정렬한 주소를 선택해요:

SELECT *
FROM addresses
ORDER BY city DESC NULLS LAST;

도시 이름, 그다음 우편번호 순으로 정렬하는데 둘 다 기본 순서를 사용해요:

SELECT *
FROM addresses
ORDER BY city, zip;

독일어 콜레이션 규칙을 사용해 도시 이름으로 정렬해요:

SELECT *
FROM addresses
ORDER BY city COLLATE DE;

ORDER BY ALL 예제

왼쪽에서 오른쪽으로(주소, 그다음 도시, 그다음 우편번호) 오름차순 정렬해요:

SELECT *
FROM addresses
ORDER BY ALL;
address city zip
111 Duck Duck Goose Ln Duck Town 11111
111 Duck Duck Goose Ln Duck Town 11111-0001
111 Duck Duck Goose Ln DuckTown 11111
123 Quack Blvd DuckTown 11111

왼쪽에서 오른쪽으로(주소, 그다음 도시, 그다음 우편번호) 내림차순 정렬해요:

SELECT *
FROM addresses
ORDER BY ALL DESC;
address city zip
123 Quack Blvd DuckTown 11111
111 Duck Duck Goose Ln DuckTown 11111
111 Duck Duck Goose Ln Duck Town 11111-0001
111 Duck Duck Goose Ln Duck Town 11111

더 알아보기 (Learn more)