ORDER BY 절은 결과 행을 정한 기준에 따라 줄 세웁니다. 기본은 작은 값부터 세우는 오름차순이고, Oracle은 NULL을 가장 큰 값으로 봅니다.
테이블의 행에는 정해진 순서가 없어서, "월급이 많은 사원부터"처럼 순서가 필요하면 ORDER BY로 기준을 적어야 합니다. 기준 열에 NULL이 있으면 NULL 행이 서는 자리도 알아야 하는데, 이 자리는 DBMS(데이터베이스 관리 시스템)마다 다릅니다.
1오름차순과 내림차순
기준 열만 적으면 작은 값이 위로 가는 오름차순(ascending, ASC)이라, ASC는 적지 않아도 됩니다. 기준 뒤에 DESC를 붙이면 큰 값이 위로 가는 내림차순(descending, DESC)입니다. ORDER BY 없이 EMPNO 차례로 나와도, 그 차례는 보장되지 않습니다.
2기준 여럿과 NULL의 자리
ORDER BY DEPTNO에서 20번 세 행이 1006·1002·1003으로 선 것은 Oracle이 이번에 돌려준 순서일 뿐, 같은 값끼리의 순서는 정해져 있지 않습니다.
기준을 쉼표로 더 적으면 앞 기준이 같은 행끼리 다음 기준으로 줄을 세웁니다.
ASC·DESC는 기준마다 따로 붙어서, ORDER BY DEPTNO, SAL DESC의 DESC는 SAL에만 걸리고 DEPTNO는 오름차순입니다.
Oracle은 NULL을 어느 값보다 크게 보므로 오름차순에서는 맨 뒤, 내림차순에서는 맨 앞에 둡니다.
기준 뒤에 NULLS FIRST·NULLS LAST를 붙이면 방향과 상관없이 NULL 자리를 정합니다. ORDER BY DEPTNO NULLS FIRST는 오름차순인데도 정하늘이 맨 앞입니다.
3SQL Server와 다른 점
SQL Server는 거꾸로 NULL을 어느 값보다 작게 보아서, 같은 ORDER BY DEPTNO라도 정하늘이 맨 앞에 섭니다.
| NULL | Oracle | SQL Server |
|---|---|---|
| 보는 값 | 가장 큰 값 | 가장 작은 값 |
| 오름차순 | 맨 뒤 | 맨 앞 |
| 내림차순 | 맨 앞 | 맨 뒤 |
| 자리 바꾸기 | NULLS FIRST, NULLS LAST | 없음 |
예제
기준을 둘 쓴 쿼리입니다.
SELECT EMPNO,
ENAME,
SAL,
DEPTNO
FROM EMP
ORDER BY DEPTNO, SAL DESC;
| EMPNO | ENAME | SAL | DEPTNO |
|---|---|---|---|
| 1001 | 김민준 | 520 | 10 |
| 1006 | 강도윤 | 470 | 20 |
| 1003 | 박지호 | 410 | 20 |
| 1002 | 이서연 | 380 | 20 |
| 1004 | 최유나 | 450 | 30 |
| 1005 | 정하늘 | 300 | NULL |
ORDER BY는 SELECT보다 나중에 처리되어 SELECT에서 붙인 별칭(alias)도 쓸 수 있습니다.
아래는 연봉 SAL * 12의 별칭 YEAR_SAL로 정렬합니다.
SELECT ENAME,
SAL * 12 AS YEAR_SAL
FROM EMP
ORDER BY YEAR_SAL DESC;
| ENAME | YEAR_SAL |
|---|---|
| 김민준 | 6240 |
| 강도윤 | 5640 |
| 최유나 | 5400 |
| 박지호 | 4920 |
| 이서연 | 4560 |
| 정하늘 | 3600 |
SELECT 목록의 두 번째 항목을 뜻하는 ORDER BY 2 DESC나, 식을 그대로 쓴 ORDER BY SAL * 12 DESC도 결과가 같습니다.
열 번호가 SELECT 목록의 개수를 넘으면 Oracle은 ORA-01785 오류를 냅니다.
ORDER BY SAL처럼 SELECT에 없는 열로도 정렬할 수 있지만, SELECT DISTINCT를 쓰면 SELECT 목록에 있는 것으로만 정렬할 수 있습니다(ORA-01791).
시험 포인트
- ASC가 기본이고, ASC·DESC는 기준마다 따로 붙습니다.
ORDER BY DEPTNO, SAL DESC의 DEPTNO는 오름차순입니다. - 오름차순에서 NULL은 Oracle이면 맨 뒤, SQL Server면 맨 앞입니다. 내림차순이면 둘 다 반대입니다.
- SQL Server에는
NULLS FIRST·NULLS LAST가 없습니다. - 별칭·열 번호·식, SELECT에 없는 열로도 정렬됩니다. 다만
SELECT DISTINCT면 SELECT 목록에 있는 것만 됩니다. - 기준값이 같은 행끼리의 순서와 ORDER BY가 없는 결과의 순서는 보장되지 않습니다.
확인 문제
1. Oracle에서 다음 쿼리 결과의 첫 줄과 끝 줄에 오는 사원은 누구일까요? SQL Server에서 같은 순서로 줄 세우려면 ORDER BY 절을 어떻게 써야 할까요?
SELECT ENAME,
DEPTNO
FROM EMP
ORDER BY DEPTNO DESC
NULLS LAST;
정답
첫 줄은 최유나, 끝 줄은 정하늘이고, SQL Server에서는 ORDER BY DEPTNO DESC로 씁니다.
- Oracle: DEPTNO가 큰 30번 최유나부터 20번 세 사람, 10번 김민준 순서로 섭니다. 내림차순에서 NULL은 원래 맨 앞이지만,
NULLS LAST가 정하늘을 맨 뒤로 보냅니다. - SQL Server:
NULLS LAST는 없지만 NULL을 가장 작은 값으로 보아 내림차순에서 이미 맨 뒤에 두므로,DESC만 쓰면 됩니다.
2. 다음 쿼리의 결과를 순서대로 적어 보세요.
SELECT ENAME,
SAL,
DEPTNO
FROM EMP
ORDER BY DEPTNO DESC, SAL;
정답
| ENAME | SAL | DEPTNO |
|---|---|---|
| 정하늘 | 300 | NULL |
| 최유나 | 450 | 30 |
| 이서연 | 380 | 20 |
| 박지호 | 410 | 20 |
| 강도윤 | 470 | 20 |
| 김민준 | 520 | 10 |
- DESC는 DEPTNO에만 걸려 DEPTNO가 큰 순서로 서고, NULL인 정하늘이 맨 앞입니다.
- SAL에는 아무것도 붙지 않아 오름차순이라, 20번 세 사원은 380·410·470 순서로 섭니다.
3. Oracle에서 오류가 나는 쿼리를 고르세요.
- ①
SELECT ENAME FROM EMP ORDER BY SAL; - ②
SELECT DISTINCT DEPTNO FROM EMP ORDER BY 1; - ③
SELECT DISTINCT DEPTNO FROM EMP ORDER BY SAL; - ④
SELECT ENAME, SAL * 12 AS YEAR_SAL FROM EMP ORDER BY YEAR_SAL;
정답
③입니다. DISTINCT로 DEPTNO가 같은 행을 한 줄로 합치면, 20번 줄 하나에 SAL이 380·410·470 셋이라 정렬 기준을 정할 수 없습니다. 그래서 ORA-01791 오류가 납니다. ②도 DISTINCT를 썼지만, 1은 테이블의 첫 열 EMPNO가 아니라 SELECT 목록의 첫 번째 항목 DEPTNO라 됩니다. ①은 SELECT에 없는 열로, ④는 별칭으로 정렬합니다. 둘 다 됩니다.