상상해봐, 너가 엄청 큰 학생 데이터베이스를 다루고 있다고 해. 성만으로 정렬하는 것도 이미 쓸만하지만, 만약 테이블에 같은 성을 가진 학생들이 있다면? 그럴 땐 출력을 더 읽기 쉽게 하려고 이름으로도 정렬을 추가할 수 있어. 또 다른 예시로, 주문 목록을 날짜순으로 먼저 정렬하고, 그 다음엔 주문 총액으로 정렬하고 싶을 수도 있지. 이럴 때 여러 컬럼으로 정렬이 딱 필요해.
여러 컬럼으로 정렬하면: 1. 데이터를 명확한 순서로 정렬할 수 있고; 2. 정렬 우선순위를 조절할 수 있어(먼저 한 컬럼, 그 다음 다른 컬럼); 3. 데이터를 더 구조적이고 읽기 쉽게 보여줄 수 있어.
여러 컬럼 정렬 문법
여러 컬럼으로 정렬하려면 익숙한 ORDER BY 연산자를 쓰는데, 이번엔 여러 컬럼을 콤마로 나열해. PostgreSQL은 먼저 첫 번째 컬럼으로 정렬하고, 값이 같으면 두 번째 컬럼, 이런 식으로 쭉 정렬해줘.
기본 문법은 이래:
SELECT 컬럼들
FROM 테이블
ORDER BY 컬럼1 방향1, 컬럼2 방향2, ... ;
여기서:
컬럼1,컬럼2, ... — 정렬하고 싶은 컬럼들이야.방향1,방향2, ... — 정렬 방향 (ASC— 오름차순,DESC— 내림차순).- 이 파라미터는 필수가 아니고, 기본값은
ASC야.
예시 1: 학생을 성, 그 다음 이름으로 정렬하기
students 테이블에 학생 데이터가 있다고 해보자:
| id | first_name | last_name | age |
|---|---|---|---|
| 1 | Anna | Lin | 20 |
| 2 | Victor | Lin | 22 |
| 3 | Maria | Kim | 21 |
| 4 | Otto | Lin | 23 |
| 5 | Anna | Kim | 20 |
우리 목표는 학생들을 먼저 성(last_name)으로, 그 다음 이름(first_name)으로 정렬하는 거야.
SELECT id, first_name, last_name, age
FROM students
ORDER BY last_name ASC, first_name ASC;
결과:
| id | first_name | last_name | age |
|---|---|---|---|
| 5 | Anna | Kim | 20 |
| 3 | Maria | Kim | 21 |
| 1 | Anna | Lin | 20 |
| 4 | Otto | Lin | 23 |
| 2 | Victor | Lin | 22 |
보다시피, 행들은 먼저 성(Kim, 그 다음 Lin)으로, 그리고 이름(Anna, Maria 등)으로 정렬돼 있어. 이런 식으로 하면 리스트에서 사람을 빨리 찾거나 출석부를 정렬할 때 진짜 편해.
예시 2: 주문을 날짜와 금액으로 정렬하기
orders 테이블에 주문 데이터가 있다고 해보자:
| order_id | customer_id | order_date | total |
|---|---|---|---|
| 1 | 101 | 2025-10-01 | 500 |
| 2 | 102 | 2025-10-03 | 200 |
| 3 | 103 | 2025-10-02 | 300 |
| 4 | 104 | 2025-10-01 | 100 |
| 5 | 101 | 2025-10-03 | 600 |
우리는 주문을 먼저 order_date로, 그 다음 주문 금액 total을 내림차순으로 정렬하고 싶어.
SQL 쿼리:
SELECT order_id, customer_id, order_date, total
FROM orders
ORDER BY order_date ASC, total DESC;
결과:
| order_id | customer_id | order_date | total |
|---|---|---|---|
| 1 | 101 | 2025-10-01 | 500 |
| 4 | 104 | 2025-10-01 | 100 |
| 3 | 103 | 2025-10-02 | 300 |
| 5 | 101 | 2025-10-03 | 600 |
| 2 | 102 | 2025-10-03 | 200 |
보다시피, 같은 날짜의 주문도 금액으로 정렬돼 있어.
NULL 정렬: NULLS FIRST와 NULLS LAST
SQL에는 특별한 값인 NULL이 있어. 이건 값이 없다는 뜻이야. 이걸 어떻게 다루는지는 나중에 더 자세히 다룰 거지만, 지금은 정렬할 때 NULL을 어떻게 처리하는지 보여줄게.
컬럼에 NULL이 있으면, PostgreSQL은 빈 값이 어디에 올지 결정해야 해: 앞에 올지, 뒤에 올지.
기본적으로:
ORDER BY ... ASC일 때:NULL은 맨 뒤 (NULLS LAST)ORDER BY ... DESC일 때:NULL은 맨 앞 (NULLS FIRST)
가끔 이 동작이 불편할 때가 있는데, NULLS FIRST나 NULLS LAST로 직접 조절할 수 있어.
문법:
ORDER BY 컬럼 ASC NULLS FIRST
ORDER BY 컬럼 DESC NULLS LAST
예시: 점수로 정렬, NULL은 "아직 점수 없음"
SELECT student_id, grade
FROM grades
ORDER BY grade DESC NULLS LAST;
이렇게 하면 먼저 점수 높은 학생, 그 다음 낮은 학생, 맨 마지막에 아직 점수 없는 학생(NULL)이 나와.
예시: 반대로 — 점수 없는 학생을 먼저 보여주기
grades 테이블에 어떤 학생은 아직 점수가 없다고 해(NULL):
| student_id | grade |
|---|---|
| 101 | NULL |
| 102 | 85 |
| 103 | NULL |
| 104 | 92 |
| 105 | 76 |
우리는 점수 없는 학생을 먼저, 그 다음 점수 있는 학생을 오름차순으로 보고 싶어.
SELECT student_id, grade
FROM grades
ORDER BY grade ASC NULLS FIRST;
결과:
| student_id | grade |
|---|---|
| 101 | NULL |
| 103 | NULL |
| 105 | 76 |
| 102 | 85 |
| 104 | 92 |
NULLS FIRST 연산자랑 ORDER BY grade ASC를 같이 쓰면, NULL이 먼저 나오고 그 다음 점수들이 오름차순으로 정렬돼.
특이점과 흔한 실수들
초보자들이 자주 하는 실수 중 하나는 각 컬럼마다 정렬 방향을 안 적는 거야. 방향을 안 쓰면 PostgreSQL이 기본적으로 ASC를 써. 그리고 ORDER BY에서 컬럼 순서가 중요하다는 걸 자주 까먹어: 먼저 첫 컬럼으로 정렬하고, 값이 같으면 두 번째 컬럼 정렬이 적용돼.
GO TO FULL VERSION