[Oracle] 오라클 정렬 순서 지정 방법 (ORDER BY 절)
- 데이터베이스/오라클
- 2021. 9. 16.
오라클에서 검색된 결과의 행을 정렬할 때는 ORDER BY 절을 사용한다. 정렬 방법에는 오름차순 정렬(ascending sort)과 내림차순(descending sort) 정렬 두 가지가 있다. 오름차순은 작은 값부터 큰 값으로 정렬하며, 내림차순은 큰 값부터 작은 값으로 정렬된다.
SELECT 컬럼명 FROM 테이블명 WHERE 조건식 GROUP BY 컬럼명 ORDER BY 컬럼명1 [ASC|DESC], 컬럼명2 [ASC|DESC], 컬럼명3 [ASC|DESC] ... |
아래는 자주 사용하는 정렬 방법을 정리하였다.
기본 사용법
오름차순 정렬 (ASC)
SELECT empno
, ename
, job
, sal
FROM emp
WHERE deptno = 30
ORDER BY sal
-- ORDER BY sal ASC
가장 기본적으로 사용하는 작은 값부터 정렬하는 오름차순 정렬이다.
오른 차순은 정렬 기본값이므로 컬럼명 뒤에 ASC를 생략해도 된다.
내림차순 정렬 (DESC)
SELECT empno
, ename
, job
, sal
FROM emp
WHERE deptno = 30
ORDER BY sal DESC
정렬할 컬럼명 뒤에 DESC를 붙이면 큰 값부터 순서대로 내림차순으로 정렬된다.
고급 사용법
여러 개의 컬럼으로 정렬
SELECT empno
, ename
, job
, sal
FROM emp
WHERE job IN ('MANAGER', 'CLERK')
ORDER BY job, sal DESC
여러 개의 컬럼으로 정렬이 필요할 경우 컬럼을 순서대로 기술하면 된다.
우선순위의 컬럼부터 정렬 후 다음 컬럼의 순서로 정렬된다.
별칭으로 정렬
SELECT empno
, ename
, job
, sal
, CASE WHEN sal > 2000 THEN '1등급'
WHEN sal > 1000 THEN '2등급'
ELSE '3등급'
END AS sal_grade
FROM emp
WHERE deptno = 30
ORDER BY sal_grade, sal DESC
연산식, 함수 등을 사용하여 컬럼명을 지정할 수 없을 경우 별칭을 사용하여 정렬이 가능하다.
SELECT 절의 컬럼 순번으로 정렬
SELECT empno
, ename
, job
, sal
, CASE WHEN sal > 2000 THEN '1등급'
WHEN sal > 1000 THEN '2등급'
ELSE '3등급'
END AS sal_grade
FROM emp
WHERE deptno = 30
ORDER BY 5, 4 DESC
SELECT 절의 컬럼 순번으로 정렬이 가능하나, 특별한 상황이 아니면 되도록 사용을 권장하지는 않는다.
차후 쿼리문을 수정할 때 가독성이 떨어져서 파악이 힘들다.
SELECT 절에 없는 컬럼으로 정렬
SELECT empno
, ename
, job
, sal
FROM emp
WHERE deptno = 30
ORDER BY sal DESC, comm DESC
SELECT 절에 기술되지 않은 컬럼도 FROM 절의 테이블에 포함되어 있다면 ORDER BY 절에 사용할 수 있다.
comm 컬럼은 SELECT 절에는 없지만 emp 테이블에 있으므로 사용 가능하다.
ORDER BY 절에 함수 사용
SELECT empno
, ename
, job
, sal
FROM emp
WHERE deptno = 30
ORDER BY DECODE(job, 'MANAGER', 1, 'SALESMAN', 2, 'CLERK', 3)
, CASE WHEN sal > 2000 THEN 1
WHEN sal > 1000 THEN 2
ELSE 2
END
ORDER BY 절에도 함수 등을 사용하여 정렬을 할 수 있다.
GROUP BY 절 사용 시 정렬
SELECT job
FROM emp
GROUP BY job
ORDER BY job, SUM(sal), MAX(comm)
GROUP BY 절을 사용할 경우 ORDER BY 절에 그룹 함수(COUNT, SUM, MAX, MIN...)를 사용할 수 있다.
GROUP BY 절을 사용할 경우 SELECT 절에 없는 컬럼을 사용하여 정렬할 경우 오류가 발생한다.
그룹 함수를 사용하면 오류를 방지할 수 있다. (예, comm DESC → MAX(comm) DESC)
UNION, UNION ALL 사용 시 정렬
SELECT empno
, ename
, job
, sal
FROM emp
WHERE deptno = 30
AND job = 'MANAGER'
UNION ALL
SELECT empno
, ename
, job
, sal
FROM emp
WHERE deptno = 30
AND job = 'SALESMAN'
ORDER BY job, sal DESC
UNION, UNION ALL을 사용할 때는 쿼리 문의 가장 마지막에 ORDER BY 절을 기술해야 한다.
각 쿼리마다 ORDER BY 절을 기술하면 오류가 발생한다.
ORA-00933: SQL command not properly ended
ROWNUM 사용 시 정렬
SELECT empno
, ename
, job
, sal
FROM (
SELECT empno
, ename
, job
, sal
FROM emp
WHERE deptno = 30
ORDER BY sal DESC
)
WHERE ROWNUM = 1
ROWNUM이 ORDER BY 절보다 먼저 실행이 되므로, 정렬된 결과를 서브 쿼리로 조회하여 ROWNUM으로 원하는 건수만큼 추출해야 한다.