Oracle 행의 정렬(소트)

Oracle DB

SELECT문으로 출력할 결과에 대해서, 특정 기준으로 행을 정렬할 수 있도록 해주는 ORDER BY구에 대해 소개합니다.

이 글의 예시는 아래 글의 초기 데이터를 사용했습니다.

Oracle 일반 데이터베이스 인스턴스에 연습 데이터용 샘플 스키마 "SCOTT" 작성하기
"SCOTT" 스키마가 디폴트로 설치된 마지막 오라클 버전은 11g(11.2.0.x) 입니다. 11g 버전 이후 Oracle 12c(12.1.0.2) 버전부터 "SCOTT" 스키마는 기본적으로 설치되지 않도록 변경되...

ORDER BY구

검색된 행의 표시 순서는 명시적으로 지정하지 않는 한 정해진 건 없습니다. 순서는 테이블의 상태에 따라 달라지기 때문에 이렇다 할 디폴트 설정은 알 수 없습니다. 검색결과를 원하는 대로 소트하여 표시하기 위헤서는 ORDER BY구를 사용합니다.

SELECT 컬럼명 FROM 테이블명 WHERE 조건식
ORDER BY {컬럼명 | 컬럼별명 | n} {[ASC] | DESC} [ , 컬럼명 {[ASC] | DESC} , ...]

특징

  • ORDER BY 다음에는 소트의 기준이 되는 컬럼명을 지정한다.
  • ORDER BY 구에는 컬럼명 이외에 식, 컬럼 별명, SELECT 구 내의 위치를 나타내는 수치를 지정할 수 있다.
  • 오름차순으로 소트하고 싶을 경우, ASC 키워드를 지정한다. 또는, 디폴트이기 때문에 ASC/DESC를 지정하지 않으면 오름차순이 된다.
  • 내림차순으로 소트하고 싶을 경우, DESC 키워드를 지정한다.
  • 기준이 되는 컬럼은 복수 지정이 가능하며, 지정한 순서대로 우선순위가 정해져 소트된다.

소트(오름차순)

ORDER BY구에 지정된 컬럼을 기준으로 소트되며 디폴트는 오름차순(ASC)입니다.
오름차순으로 정렬할 때, ASC 키워드는 지정해도 되고 생략해도 됩니다.

문자열 형식 컬럼 ename를 기준으로 오름차순 소트로 결과를 출력하는 SQL문입니다.

SELECT empno, ename, hiredate FROM emp 
WHERE job = 'SALESMAN'
ORDER BY ename ASC;

ename의 데이터가 ABC… 순서대로 출력됩니다. empno와 hiredate의 데이터는 순서대로 출력되지 않은 것을 알 수 있습니다.

     EMPNO ENAME      HIREDATE
---------- ---------- ---------
      7499 ALLEN      20-FEB-81
      7654 MARTIN     28-SEP-81
      7844 TURNER     08-SEP-81
      7521 WARD       22-FEB-81

위의 SQL문과 동일하지만 ASC를 지정하지 않은 SQL문입니다. ORDER BY의 디폴트는 오름차순이기 때문에 위의 결과와 같은 결과가 출력되어야 합니다.

SELECT empno, ename, hiredate FROM emp
WHERE job = 'SALESMAN'
ORDER BY ename;

위의 ASC를 지정한 SQL문을 실행한 결과와 동일한 결과가 출력되는 것을 확인할 수 있습니다.

     EMPNO ENAME      HIREDATE
---------- ---------- ---------
      7499 ALLEN      20-FEB-81
      7654 MARTIN     28-SEP-81
      7844 TURNER     08-SEP-81
      7521 WARD       22-FEB-81

수치 형식 컬럼 empno를 기준으로 오름차순 소트로 결과를 출력하는 SQL문입니다.

SELECT empno, ename, hiredate FROM emp
WHERE job = 'SALESMAN'
ORDER BY empno ASC;

empno의 데이터가 숫자가 작은 것부터 순서대로 출력됩니다. ename와 hiredate의 데이터는 순서대로 출력되지 않은 것을 알 수 있습니다.

     EMPNO ENAME      HIREDATE
---------- ---------- ---------
      7499 ALLEN      20-FEB-81
      7521 WARD       22-FEB-81
      7654 MARTIN     28-SEP-81
      7844 TURNER     08-SEP-81

날짜 형식 컬럼 hiredate를 기준으로 오름차순 소트로 결과를 출력하는 SQL문입니다.

SELECT empno, ename, hiredate FROM emp
WHERE job = 'SALESMAN'
ORDER BY hiredate ASC;

hiredate의 데이터가 오래된 날짜부터 순서대로 출력됩니다. empno와 ename의 데이터는 순서대로 출력되지 않은 것을 알 수 있습니다.

     EMPNO ENAME      HIREDATE
---------- ---------- ---------
      7499 ALLEN      20-FEB-81
      7521 WARD       22-FEB-81
      7844 TURNER     08-SEP-81
      7654 MARTIN     28-SEP-81

소트(내림차순)

내림차순으로 소트하고 싵은 경우엔, DESC 키워드를 지정합니다.
키워드를 생략하면 오름차순이 되기에 주의가 필요합니다.

문자열 형식 컬럼 ename를 기준으로 내림차순 소트로 결과를 출력하는 SQL문입니다.

SELECT empno, ename, hiredate FROM emp
WHERE job = 'SALESMAN'
ORDER BY ename DESC;

ename의 데이터가 ZYX… 의 역순으로 출력됩니다. empno와 hiredate의 데이터는 역순으로 출력되지 않은 것을 알 수 있습니다.

     EMPNO ENAME      HIREDATE
---------- ---------- ---------
      7521 WARD       22-FEB-81
      7844 TURNER     08-SEP-81
      7654 MARTIN     28-SEP-81
      7499 ALLEN      20-FEB-81

수치 형식 컬럼 empno를 기준으로 내림차순 소트로 결과를 출력하는 SQL문입니다.

SELECT empno, ename, hiredate FROM emp
WHERE job = 'SALESMAN'
ORDER BY empno DESC;

empno의 데이터가 숫자가 큰 것부터 역순으로 출력됩니다. ename와 hiredate의 데이터는 역순으로 출력되지 않은 것을 알 수 있습니다.

      EMPNO ENAME      HIREDATE
---------- ---------- ---------
      7844 TURNER     08-SEP-81
      7654 MARTIN     28-SEP-81
      7521 WARD       22-FEB-81
      7499 ALLEN      20-FEB-81

날짜 형식 컬럼 hiredate를 기준으로 내림차순 소트로 결과를 출력하는 SQL문입니다.

SELECT empno, ename, hiredate FROM emp
WHERE job = 'SALESMAN'
ORDER BY hiredate DESC;

hiredate의 데이터가 최신인 날짜부터 역순으로 출력됩니다. empno와 ename의 데이터는 역순으로 출력되지 않은 것을 알 수 있습니다.

     EMPNO ENAME      HIREDATE
---------- ---------- ---------
      7654 MARTIN     28-SEP-81
      7844 TURNER     08-SEP-81
      7521 WARD       22-FEB-81
      7499 ALLEN      20-FEB-81

참조1

복수의 컬럼을 소트 기준으로 삼을 수 있습니다. 기준이 되는 컬럼 중 일부가 동일한 데이터일 때 차이를 확인할 수 있습니다.

emp테이블에서 sal이 2000 미만인 데이터의 empno, ename, deptno를 deptno, empno 기준 오름차순으로 출력하는 SQL문입니다.

SELECT empno, ename, deptno FROM emp
WHERE sal > 2000
ORDER BY deptno, empno ASC;

deptno가 가장 우선시 되어 소트된 것을 확인할 수 있습니다. 또한, deptno로 소트가 된 상태에서 empno를 다시 한 번 소트시켜, 같은 deptno를 가진 데이터끼리 오름차순으로 소트된 것을 알 수 있습니다.

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      7782 CLARK              10
      7839 KING               10
      7566 JONES              20
      7902 FORD               20
      7698 BLAKE              30

참조2

출력대상이 되는 컬럼을 기준으로 소트를 할 때, 숫자로 대체할 수 있습니다.

SELECT empno, ename, hiredate FROM emp
WHERE job = 'SALESMAN'
ORDER BY 1 ASC;

SELECT문에 첫 번째로 지정된 empno 기준으로 소트된 결과를 확인할 수 있습니다.

     EMPNO ENAME      HIREDATE
---------- ---------- ---------
      7499 ALLEN      20-FEB-81
      7521 WARD       22-FEB-81
      7654 MARTIN     28-SEP-81
      7844 TURNER     08-SEP-81

제목과 URL을 복사했습니다