CodeGym /행동 /SQL SELF /여러 컬럼으로 정렬하기: 정렬 순서와 우선순위

여러 컬럼으로 정렬하기: 정렬 순서와 우선순위

SQL SELF
레벨 6 , 레슨 2
사용 가능

상상해봐, 너가 엄청 큰 학생 데이터베이스를 다루고 있다고 해. 성만으로 정렬하는 것도 이미 쓸만하지만, 만약 테이블에 같은 성을 가진 학생들이 있다면? 그럴 땐 출력을 더 읽기 쉽게 하려고 이름으로도 정렬을 추가할 수 있어. 또 다른 예시로, 주문 목록을 날짜순으로 먼저 정렬하고, 그 다음엔 주문 총액으로 정렬하고 싶을 수도 있지. 이럴 때 여러 컬럼으로 정렬이 딱 필요해.

여러 컬럼으로 정렬하면: 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 FIRSTNULLS LAST

SQL에는 특별한 값인 NULL이 있어. 이건 값이 없다는 뜻이야. 이걸 어떻게 다루는지는 나중에 더 자세히 다룰 거지만, 지금은 정렬할 때 NULL을 어떻게 처리하는지 보여줄게.

컬럼에 NULL이 있으면, PostgreSQL은 빈 값이 어디에 올지 결정해야 해: 앞에 올지, 뒤에 올지.

기본적으로:

  • ORDER BY ... ASC일 때: NULL맨 뒤 (NULLS LAST)
  • ORDER BY ... DESC일 때: NULL맨 앞 (NULLS FIRST)

가끔 이 동작이 불편할 때가 있는데, NULLS FIRSTNULLS 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에서 컬럼 순서가 중요하다는 걸 자주 까먹어: 먼저 첫 컬럼으로 정렬하고, 값이 같으면 두 번째 컬럼 정렬이 적용돼.

2
과제
SQL SELF, 레벨 6, 레슨 2
잠금
학생 나이와 이름으로 정렬하기
학생 나이와 이름으로 정렬하기
2
과제
SQL SELF, 레벨 6, 레슨 2
잠금
주문을 날짜와 고객 ID로 정렬하기
주문을 날짜와 고객 ID로 정렬하기
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION