[Oracle] 오라클 정렬 순서 지정 방법 (ORDER BY 절)

오라클에서 검색된 결과의 행을 정렬할 때는 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으로 원하는 건수만큼 추출해야 한다.

 

예제쿼리(테이블포함).txt
0.00MB

 

 

댓글

Designed by JB FACTORY