DB 다루다 보면 데이터에 순서가 필요할 때가 진짜 많아. 예를 들어:
- "가장 비싼 상품 10개만 보여줘."
- "최근 주문이 뭐야?"
- "학생들 나이, 어린 순서대로 알려줘."
데이터를 정렬하고 싶은 건 당연한 거지. 아무리 프로 개발자여도, 뒤죽박죽인 데이터 보는 건 별로잖아. 그래서 SQL에서는 결과를 정렬할 수 있게 ORDER BY라는 도구를 줘.
ORDER BY로 정렬하는 기본
ORDER BY는 결과 집합에서 행을 정렬해주는 마법 같은 키워드야. 이거 없으면 데이터는 "아무 순서"로 나와 (이건 DB 오류가 아니라, 그냥 순서가 보장 안 된다는 뜻이야).
ORDER BY 문법은 이렇게 생겼어:
SELECT 컬럼1, 컬럼2
FROM 테이블
ORDER BY 컬럼1 DESC;
컬럼1: 정렬하고 싶은 컬럼 이름.ASC: 오름차순 정렬 (이게 기본값이라서 생략해도 돼).DESC: 내림차순 정렬.
예시
예를 들어, students 테이블이 있다고 해보자:
| id | name | age |
|---|---|---|
| 1 | Alex | 22 |
| 2 | Maria | 19 |
| 3 | Otto | 21 |
학생들을 나이 오름차순으로 정렬해보자:
SELECT name, age
FROM students
ORDER BY age ASC;
결과:
| name | age |
|---|---|
| Maria | 19 |
| Otto | 21 |
| Alex | 22 |
정렬 방향을 내림차순으로 바꾸면:
SELECT name, age
FROM students
ORDER BY age DESC;
결과는 이렇게 나와:
| name | age |
|---|---|
| Alex | 22 |
| Otto | 21 |
| Maria | 19 |
여러 컬럼으로 정렬하기
가끔은 컬럼 하나만으론 부족할 때가 있어. 예를 들어, 같은 나이의 학생이 여러 명이면 이름으로도 추가 정렬하고 싶을 수 있지.
여러 컬럼으로 정렬하는 방법:
SELECT 컬럼1, 컬럼2
FROM 테이블
ORDER BY 컬럼1 DESC, 컬럼2 ASC;
다음 테이블로 예시 들어볼게:
| id | name | age |
|---|---|---|
| 1 | Alex | 22 |
| 2 | Maria | 19 |
| 3 | Otto | 21 |
| 4 | Anna | 19 |
쿼리:
SELECT name, age
FROM students
ORDER BY age ASC, name ASC;
결과:
| name | age |
|---|---|
| Anna | 19 |
| Maria | 19 |
| Otto | 21 |
| Alex | 22 |
여기서는 먼저 나이(오름차순)로 정렬하고, 같은 나이끼리는 이름(알파벳순)으로 정렬한 거야.
별칭으로 정렬하기
컬럼에 alias(별칭) 썼으면, 그 별칭으로도 정렬 가능해.
SELECT name AS "이름", age AS "나이"
FROM students
ORDER BY "나이" DESC;
결과:
| 이름 | 나이 |
|---|---|
| Alex | 22 |
| Otto | 21 |
| Maria | 19 |
이게 왜 중요하냐면, 예전엔 계산 컬럼에 별칭 붙이고 정렬하는 게 좀 복잡했거든.
계산 컬럼으로 정렬하기
SQL에서는 쿼리 안에서 계산도 할 수 있고, 그 결과로 정렬도 할 수 있어.
예시 1. 간단한 계산
SELECT name, age, age * 2 AS doubled_age
FROM students
ORDER BY doubled_age DESC;
결과:
| name | age | doubled_age |
|---|---|---|
| Alex | 22 | 44 |
| Otto | 21 | 42 |
| Maria | 19 | 38 |
예시 2. 함수 사용하기 예를 들어, products 테이블에 상품 가격이 있다고 해보자:
| product_name | price |
|---|---|
| 상품 A | 100 |
| 상품 B | 200 |
| 상품 C | 150 |
이제 가격에 0.9 곱해서(예: 할인 적용) 반올림한 값으로 정렬해보자. ROUND 함수는 소수점 자리까지 반올림해줘.
SELECT product_name, price, ROUND(price * 0.9, 1) AS discounted_price
FROM products
ORDER BY discounted_price ASC;
결과는 이렇게 나와:
| product_name | price | discounted_price |
|---|---|---|
| 상품 A | 100 | 90 |
| 상품 C | 150 | 135 |
| 상품 B | 200 | 180 |
정렬의 실전 활용
정렬은 이런 상황에서 특히 중요해:
- 월간 TOP 10 판매 같은 리포트 만들 때.
- UI에 데이터 뿌릴 때, 예를 들어 주문 목록을 날짜순으로 보여줄 때.
- 분석용 리스트 만들 때, 예를 들어 우선순위별로 그룹 나눌 때.
ORDER BY 쓸 때 흔한 실수
실수는 언제든 할 수 있어. 아래는 꼭 신경 써야 할 포인트야:
- 존재하지 않는 컬럼으로 정렬하면 에러 나:
column "not_a_column" does not exist. - 계산 컬럼에 alias 썼는데, 그 alias가 상위 쿼리에서만 정의돼 있으면 헷갈릴 수 있어.
- 정렬 방향(ASC/DESC) 안 쓰면 PostgreSQL은 기본적으로
ASC로 정렬해. 이건 에러는 아니지만, 예상과 다를 수 있어.
이제 ORDER BY로 PostgreSQL에서 정렬하는 법 알았지? 데이터 정렬 잘 하면 SQL 쿼리 효율이 확 올라가. 다음 주제로 고고! 😉
GO TO FULL VERSION