Search
moon
sun

12.ORDER BY

•
ASC · DESC 로 결과를 정렬하고, 여러 기준으로 정렬할 수 있다.
•
정렬 기준을 컬럼명 · 별칭 · 컬럼 순번으로 표기할 수 있다.
•
NULL의 정렬 위치(Oracle 기본값과 NULLS FIRST/LAST)를 제어할 수 있다.
•
지금까지 배운 SELECT 문의 전체 구조와 실행 순서를 정리할 수 있다.

1. ORDER BY 기본

1) 오름차순과 내림차순

SELECT 컬럼 FROM 테이블 ORDER BY 정렬기준 [ASC | DESC]; -- ASC(오름차순)가 기본값, 생략 가능
SQL
복사
방향
키워드
의미
생략하면
오름차순
ASC
작은 값 → 큰 값 (1,2,3 / A,B,C)
ASC 가 기본
내림차순
DESC
큰 값 → 작은 값
명시해야 함
-- ============================================================ -- 【이해용 예제】 급여 순으로 정렬하기 -- ============================================================ -- 오름차순 (ASC 생략 가능) SELECT ENAME, SAL FROM EMP ORDER BY SAL; -- = ORDER BY SAL ASC -- ENAME SAL -- ------ ----- -- SMITH 800 ← 가장 적은 급여부터 -- JAMES 950 -- ... -- KING 5000 -- 내림차순 SELECT ENAME, SAL FROM EMP ORDER BY SAL DESC; -- 큰 값부터 -- ENAME SAL -- ------ ----- -- KING 5000 ← 가장 많은 급여부터 -- SCOTT 3000 -- FORD 3000 -- ... -- SMITH 800
SQL
복사

2) ORDER BY는 실행 순서상 맨 마지막 ⭐

⭐ ORDER BY 가 SELECT 다음에 실행되기 때문에, SELECT 에서 만든 별칭을 쓸 수 있습니다. (반면 WHERE 는 SELECT 보다 먼저라 별칭을 못 씁니다)

2. 여러 기준 정렬 ⭐

1) 1차 정렬이 같으면 2차 정렬로

-- ============================================================ -- 【이해용 예제】 부서별로 묶되, 같은 부서 안에서는 급여 높은 순 -- ============================================================ SELECT DEPTNO, ENAME, SAL FROM EMP ORDER BY DEPTNO ASC, -- ① 1차: 부서번호 오름차순 SAL DESC; -- ② 2차: 같은 부서 안에서 급여 내림차순 -- DEPTNO ENAME SAL -- ------ ------ ----- -- 10 KING 5000 ┐ -- 10 CLARK 2450 │ 10번 부서 안에서 급여 높은 순 -- 10 MILLER 1300 ┘ -- 20 SCOTT 3000 ┐ -- 20 FORD 3000 │ 20번 부서 안에서 급여 높은 순 -- 20 JONES 2975 │ -- 20 ADAMS 1100 │ -- 20 SMITH 800 ┘ -- 30 BLAKE 2850 ┐ -- 30 ALLEN 1600 │ 30번 부서 안에서 급여 높은 순 -- 30 TURNER 1500 │ -- 30 WARD 1250 │ -- 30 MARTIN 1250 │ ← WARD 와 MARTIN 은 급여가 같다 -- 30 JAMES 950 ┘ -- -- ⭐ 정렬 방향은 컬럼마다 '따로' 지정한다 (DEPTNO는 ASC, SAL은 DESC) -- ⚠️ 급여가 같은 WARD/MARTIN 의 순서는 보장되지 않는다 -- → 순서를 확정하려면 3차 정렬 기준(예: ENAME)을 추가한다
SQL
복사

3. 정렬 기준 표기법 ⭐⭐

1) 세 가지로 표기할 수 있다

표기 방식
예
설명
컬럼명
ORDER BY SAL
가장 명확
별칭
ORDER BY 급여
SELECT의 별칭 사용 가능 ⭐
컬럼 순번
ORDER BY 2
SELECT의 2번째 컬럼 기준
표현식
ORDER BY SAL * 12
계산식도 가능
-- ============================================================ -- 【시험용 예제】 같은 정렬을 세 가지 방법으로 ★ -- SELECT 의 2번째 컬럼(SAL*12) 기준으로 내림차순 정렬 -- ============================================================ SELECT ENAME, SAL * 12 AS 연봉 -- 이것이 SELECT 의 2번째 컬럼 FROM EMP ORDER BY 연봉 DESC; -- ① 별칭으로 정렬 -- 위와 완전히 동일한 결과 SELECT ENAME, SAL * 12 AS 연봉 FROM EMP ORDER BY 2 DESC; -- ② 컬럼 순번 SELECT ENAME, SAL * 12 AS 연봉 FROM EMP ORDER BY SAL * 12 DESC; -- ③ 표현식 -- ENAME 연봉 -- ------ ------ -- KING 60000 -- SCOTT 36000 -- FORD 36000 -- ... -- -- ⭐ 07강 회수 : WHERE 에서는 별칭을 못 쓰지만, ORDER BY 에서는 쓸 수 있다. -- 실행 순서상 ORDER BY 가 SELECT 다음이라 별칭이 이미 만들어져 있기 때문이다. -- ⚠️ 컬럼 순번(ORDER BY 2)은 SELECT 컬럼 순서가 바뀌면 정렬 기준도 바뀌므로 주의
SQL
복사

2) GROUP BY 결과도 정렬할 수 있다 (11강 연결)

-- ============================================================ -- 【이해용 예제】 부서별 급여합계를 합계 큰 순으로 -- ============================================================ SELECT DEPTNO, SUM(SAL) AS 급여합계 FROM EMP GROUP BY DEPTNO ORDER BY SUM(SAL) DESC; -- ORDER BY 에도 집계함수를 쓸 수 있다 -- DEPTNO 급여합계 -- ------ -------- -- 20 10875 -- 30 9400 -- 10 8750
SQL
복사

4. NULL의 정렬 위치 ⭐⭐⭐

1) Oracle의 기본 동작

ASC → NULL이 맨 뒤 / DESC → NULL이 맨 앞
-- ============================================================ -- 【시험용 예제】 DESC 로 정렬하면 NULL이 맨 위로 올라온다 ★★ -- ============================================================ SELECT ENAME, COMM FROM EMP WHERE DEPTNO = 30 ORDER BY COMM DESC; -- 커미션 높은 순 ... 인데? -- ENAME COMM -- ------ ------ -- BLAKE (NULL) ← NULL이 맨 위! ⚠️ (커미션 없는 사람이 1등처럼 보인다) -- JAMES (NULL) -- MARTIN 1400 -- WARD 500 -- ALLEN 300 -- TURNER 0 -- -- ⚠️ "커미션 많이 받는 순" 을 원했는데 NULL이 위에 와서 이상하다. -- → NULLS LAST 로 NULL 을 뒤로 보내야 한다.
SQL
복사

2) NULLS FIRST · NULLS LAST — 위치를 강제

-- ============================================================ -- 【시험용 예제】 정렬 방향과 무관하게 NULL 위치를 지정 ★★ -- ============================================================ -- 커미션 높은 순, 단 NULL은 맨 뒤로 SELECT ENAME, COMM FROM EMP WHERE DEPTNO = 30 ORDER BY COMM DESC NULLS LAST; -- 큰 값부터, NULL은 맨 뒤로 강제 -- ENAME COMM -- ------ ------ -- MARTIN 1400 ← 이제 실제 최고액이 1등 -- WARD 500 -- ALLEN 300 -- TURNER 0 -- BLAKE (NULL) ← NULL은 맨 뒤로 -- JAMES (NULL) -- -- ⭐ NULLS FIRST / NULLS LAST 는 기본 동작을 '덮어쓴다' -- ORDER BY COMM ASC NULLS FIRST → NULL을 맨 앞으로 (기본은 뒤인데 강제로 앞) -- ORDER BY COMM DESC NULLS LAST → NULL을 맨 뒤로 (기본은 앞인데 강제로 뒤)
SQL
복사
정리표 ⭐
정렬
Oracle 기본 NULL 위치
강제하려면
ORDER BY COMM ASC
맨 뒤
NULLS FIRST 로 앞으로
ORDER BY COMM DESC
맨 앞
NULLS LAST 로 뒤로
⭐ 암기: 오름차순(ASC)이면 NULL이 뒤, 내림차순(DESC)이면 NULL이 앞. 실무에서는 대부분 "값을 큰 순으로, NULL은 뒤로" 원하므로 DESC NULLS LAST 를 자주 씁니다.

5. 타입별 정렬 순서

타입
오름차순(ASC) 순서
숫자
작은 수 → 큰 수
날짜
과거 → 미래
문자
사전 순 (DB 문자셋 코드값 순)
-- ============================================================ -- 【이해용 예제】 문자·날짜 정렬 -- ============================================================ -- 이름을 사전 순으로 SELECT ENAME FROM EMP ORDER BY ENAME; -- ADAMS, ALLEN, BLAKE, CLARK, FORD, ... (알파벳 순) -- 입사일이 오래된 순으로 SELECT ENAME, HIREDATE FROM EMP ORDER BY HIREDATE; -- SMITH 1980-12-17 ← 가장 먼저 입사 -- ALLEN 1981-02-20 -- ... -- SCOTT 1987-07-13 ← 가장 늦게 입사
SQL
복사
⚠️ 문자 정렬의 함정 문자는 문자셋 코드값 순으로 정렬됩니다. 일반적으로 숫자 → 대문자 → 소문자 순이며, '10' 이 '9' 보다 앞에 옵니다 (문자 '1' 이 '9' 보다 코드값이 작으므로). 숫자를 문자로 저장하면 정렬이 꼬이는 이유입니다.

6. 출제 포인트 한눈에 정리

#
꼭 외울 것
핵심
1
기본 정렬 방향
ASC(오름차순)가 기본
2
내림차순
DESC 명시 필요
3
여러 기준 정렬
컬럼마다 ASC/DESC 따로 지정
4
정렬 기준 표기
컬럼명 / 별칭 / 컬럼 순번 / 표현식
5
ORDER BY 2
SELECT의 2번째 컬럼 기준
6
ORDER BY와 별칭
사용 가능 (WHERE는 불가) ⭐
7
ORDER BY와 집계함수
GROUP BY 결과에 사용 가능
8
실행 순서
ORDER BY가 가장 마지막
9
NULL 기본 위치 (ASC)
맨 뒤
10
NULL 기본 위치 (DESC)
맨 앞 ⭐
11
NULLS FIRST/LAST
기본 위치를 덮어씀
12
문자 정렬
문자셋 코드값 순 ('10' < '9')

7. 확인 문제

Q1. ORDER BY SAL 과 ORDER BY SAL ASC 의 차이는?
정답 보기
Q2. SELECT ENAME, SAL*12 AS 연봉 FROM EMP ORDER BY 2 DESC 에서 2 는 무엇을 의미하는가?
정답 보기
Q3. 아래 SQL이 정상 동작하는 이유는?
SELECT ENAME, SAL*12 AS 연봉 FROM EMP ORDER BY 연봉 DESC;
SQL
복사
정답 보기
Q4. ORDER BY COMM DESC 로 정렬하면 NULL은 어디에 오는가? ① 맨 뒤 ② 맨 앞 ③ 중간 ④ 제외됨
정답 보기
Q5. "급여 높은 순으로 정렬하되 커미션이 NULL인 사원은 맨 뒤로" 보내려면?
정답 보기
Q6. 부서별 급여합계를 합계가 큰 순으로 정렬하려면 ORDER BY 에 무엇을 쓰는가?
정답 보기
Q7. ORDER BY DEPTNO ASC, SAL DESC 는 어떻게 정렬하는가?
정답 보기