2과목 · SQL 기본 및 활용·10장
ORDER BY
ORDER BY 구조, 정렬 안정성, NULL 위치, LIMIT/OFFSET·FETCH와의 결합을 다룹니다.
1. ORDER BY의 위치
ORDER BY는 SELECT 문의 마지막 단계에서 평가됩니다. 이유: SELECT가 끝난 결과 집합을 정렬하기 때문.
SELECT name, salary FROM emp WHERE dept_id = 10 ORDER BY salary DESC, name ASC;
정렬 키의 참조 방법
-- 컬럼 이름
ORDER BY salary DESC
-- SELECT 별칭 (허용)
SELECT salary * 12 AS annual FROM emp ORDER BY annual DESC;
-- 컬럼 위치(열 순번) — 비추천
ORDER BY 2 DESC
2. 오름차순 / 내림차순
ASC(기본, 생략 가능)DESC
ORDER BY salary DESC, hired_at ASC
여러 키를 주면 앞의 키로 먼저 정렬하고, 동률이면 다음 키로.
3. NULL의 위치
| DBMS | ASC 기본 | DESC 기본 |
|---|---|---|
| Oracle | NULL 마지막 | NULL 먼저 |
| PostgreSQL | NULL 마지막 | NULL 먼저 |
| MySQL | NULL 먼저 | NULL 마지막 |
고정하려면 NULLS FIRST / NULLS LAST (Oracle, PostgreSQL).
ORDER BY bonus ASC NULLS FIRST;
4. 정렬 안정성 (Stable Sort)
ANSI 표준은 "정렬 키가 같은 행들끼리의 순서"를 보장하지 않습니다. 즉 같은 값이면 실행마다 다른 순서가 나올 수 있음.
-- 안정성을 확보하려면 타이브레이커를 명시
ORDER BY salary DESC, emp_id ASC;
5. 페이징과의 결합
표준 ANSI — OFFSET ... FETCH
SELECT name, salary FROM emp
ORDER BY salary DESC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
MySQL/PostgreSQL — LIMIT
SELECT name, salary FROM emp
ORDER BY salary DESC
LIMIT 10 OFFSET 20;
Oracle 12c+ 이전 — ROWNUM
SELECT *
FROM (SELECT emp.*, ROWNUM rnum FROM (
SELECT * FROM emp ORDER BY salary DESC
) emp WHERE ROWNUM <= 30)
WHERE rnum > 20;
6. TOP-N과 ORDER BY
"급여가 가장 높은 3명" 같은 쿼리는 ORDER BY ... FETCH FIRST n 형식이 표준.
SELECT name, salary FROM emp ORDER BY salary DESC FETCH FIRST 3 ROWS ONLY;
-- WITH TIES 옵션: 3등과 동일 급여자는 모두 포함
FETCH FIRST 3 ROWS WITH TIES;
7. 성능: 인덱스와 ORDER BY
정렬이 인덱스 순서와 일치하면 별도의 정렬 단계(sort operation)를 피할 수 있습니다.
CREATE INDEX idx_emp_sal ON emp(salary DESC);
SELECT * FROM emp ORDER BY salary DESC FETCH FIRST 10 ROWS ONLY;
-- 인덱스 스캔만으로 Top-10 반환
8. 자주 출제되는 포인트
ORDER BY는 SELECT 뒤에 평가 → SELECT에서 만든 별칭 사용 가능.- NULLS FIRST/LAST 옵션.
- 정렬 키가 같으면 순서 보장 없음 → 타이브레이커 필요.
- 여러 키 정렬은 앞 키 우선.
WITH TIES는 동점자 포함.
9. 요약 체크리스트
- ORDER BY가 평가되는 시점과 별칭 사용 가능 여부를 안다.
- DBMS별 NULL 위치 기본값과 고정 방법을 안다.
- OFFSET/FETCH로 페이징 쿼리를 쓸 수 있다.
- Top-N 쿼리에서 WITH TIES 옵션의 효과를 안다.