•
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 는 어떻게 정렬하는가?
정답 보기





