ORDER BY 절은 SELECT 문으로 조회된 결과의 정렬 순서를 지정하는 역할을 함. SQL 쿼리 문장의 가장 마지막에 위치하며, 최종적으로 사용자에게 보여질 데이터의 순서를 결정함.
ASC (Ascending): 오름차순 정렬. 작은 값에서 큰 값 순서로 정렬됨.DESC (Descending): 내림차순 정렬. 큰 값에서 작은 값 순서로 정렬됨.ORDER BY 절에서 정렬 방식을 명시하지 않으면 ASC가 기본값으로 적용됨./*
* -- 기본 정렬 예시 --
* User 테이블의 사용자를 가입일(registration_date)이 최신인 순서부터(내림차순) 조회함.
*/
SELECT
name,
registration_date
FROM
User
ORDER BY
registration_date DESC;
/*
* -- 오름차순 정렬 예시 (ASC 생략) --
* User 테이블의 사용자를 이름(name) 기준 오름차순으로 조회함.
* ASC는 기본값이므로 생략 가능함.
*/
SELECT
name,
registration_date
FROM
User
ORDER BY
name; -- name ASC 와 동일
,)를 사용하여 여러 개의 정렬 기준을 지정할 수 있음./*
* -- 다중 정렬 예시 --
* 1차적으로 post_type(게시물 종류) 오름차순으로 정렬하고,
* post_type이 같은 게시물 내에서는 creation_date(작성일) 내림차순(최신순)으로 정렬함.
*/
SELECT
post_id,
post_type,
creation_date
FROM
Post
ORDER BY
post_type ASC, -- 1차 정렬 기준
creation_date DESC; -- 2차 정렬 기준
SELECT 절에서 정의한 별칭(Alias)을 ORDER BY 절의 정렬 기준으로 사용할 수 있음.ORDER BY 절에 다시 작성할 필요가 없어 코드가 간결해짐./*
* -- 별칭을 이용한 정렬 --
* 사용자별 게시물 수를 계산하여 'post_count'라는 별칭을 부여하고,
* 이 별칭을 기준으로 내림차순 정렬함.
*/
SELECT
user_id,
COUNT(*) AS post_count
FROM
Post
GROUP BY
user_id
ORDER BY
post_count DESC;
SELECT 절에 나열된 컬럼의 위치 번호(1부터 시작)를 정렬 기준으로 사용할 수 있음./*
* -- 컬럼 위치 번호를 이용한 정렬 --
* SELECT 절의 세 번째 컬럼인 registration_date를 기준으로 내림차순 정렬함.
*/
SELECT
name, -- 1번 컬럼
email, -- 2번 컬럼
registration_date -- 3번 컬럼
FROM
User
ORDER BY
3 DESC;
※ 주의사항: 컬럼 위치 번호를 사용하는 것은 편리하지만,
SELECT절의 컬럼 순서가 변경되면 의도치 않은 기준으로 정렬될 수 있어 유지보수가 어려움. 가독성과 안정성을 위해 컬럼명이나 별칭을 사용하는 것이 권장됨.
CASE 표현식을 이용한 조건부 정렬ORDER BY 절에 CASE 표현식을 사용하여 사용자 정의 정렬 규칙을 만들 수 있음./*
* -- CASE 표현식을 이용한 조건부 정렬 --
* user_id가 21인 사용자의 게시물을 최우선(1순위)으로 정렬하고,
* 나머지 게시물(2순위)을 그 뒤에 정렬함.
* 각 순위 내에서는 작성일(creation_date)이 최신인 순서로 정렬함.
*/
SELECT
post_id,
user_id,
creation_date
FROM
Post
ORDER BY
CASE
WHEN user_id = 21 THEN 1 -- 21번 유저에게 1순위 부여
ELSE 2 -- 나머지 유저에게 2순위 부여
END, -- 1차 정렬 기준
creation_date DESC; -- 2차 정렬 기준
NULL 값의 정렬 순서ORDER BY 절에서 NULL 값은 DBMS에 따라 다르게 처리됨.NULL을 가장 큰 값으로 간주하여, ASC(오름차순)에서는 마지막에, DESC(내림차순)에서는 처음에 정렬됨.NULL을 가장 작은 값으로 간주하여, ASC에서는 처음에, DESC에서는 마지막에 정렬됨.NULLS FIRST 또는 NULLS LAST 옵션을 사용하여 NULL의 정렬 위치를 명시적으로 지정할 수 있음. (주로 Oracle, PostgreSQL에서 사용)-- Oracle에서 manager_id가 NULL인 데이터를 가장 먼저 정렬하고, 나머지는 오름차순 정렬
SELECT name, manager_id FROM User ORDER BY manager_id ASC NULLS FIRST;
ORDER BY의 실행 순서: ORDER BY는 SELECT 문에서 가장 마지막에 실행됨. 이 때문에 SELECT 절에서 정의한 Alias를 ORDER BY 절에서 사용할 수 있음. 반면, WHERE나 GROUP BY에서는 Alias 사용이 불가함. 이 차이점은 단골 출제 포인트임.ASC/DESC)이 생략된 경우, 기본값인 ASC(오름차순)으로 처리된다는 점을 이용한 문제가 출제됨.SELECT *와 함께 ORDER BY 1과 같이 사용될 경우, 테이블 정의 상의 첫 번째 컬럼을 기준으로 정렬됨을 이해해야 함.NULL 값 정렬: DBMS별 NULL 값 정렬 순서의 차이를 묻거나, NULLS FIRST/LAST 옵션의 기능을 묻는 문제가 나올 수 있음. SQLD는 주로 Oracle 기준을 따르는 경향이 있음.| 기능 | Oracle | MySQL | SQL Server | PostgreSQL |
|---|---|---|---|---|
NULL 기본 정렬 | 가장 큰 값 (ASC에서 마지막) | 가장 작은 값 (ASC에서 처음) | 가장 작은 값 (ASC에서 처음) | 가장 작은 값 (ASC에서 처음) |
NULL 위치 지정 | NULLS FIRST / NULLS LAST | IS NULL을 활용한 CASE문 사용 (ORDER BY column IS NULL, column) | IS NULL을 활용한 CASE문 사용 | NULLS FIRST / NULLS LAST |
LIMIT / TOP | FETCH FIRST n ROWS ONLY | LIMIT n | TOP n | LIMIT n |
※ 실전 팁: 상위 N개 데이터 조회와 정렬은 항상 함께 사용됨.
ORDER BY로 정렬한 후, 상위 N개를 가져오는 문법은 DBMS별로 상이하므로,TOP(SQL Server),LIMIT(MySQL),FETCH FIRST(ANSI/Oracle)의 차이를 알아두는 것이 좋음.