1. ORDER BY 정렬

  • ORDER BY 절은 SQL 문장으로 조회된 데이터들을 다양한 목적에 맞게 특정 칼럼을 기준으로 정렬하여 출력 하는데 사용한다.
  • ORDER BY 절에 칼럼(Column)명 대신에 SELECT 절에서 사용한 ALIAS 명이나 칼럼 순서를 나타내는 정수도 사용 가능 하다.
  • 그리고 별도로 정렬 방식을 지정하지 않으면 기본적으로 오름차순이 적용 되며, SQL 문장의 제일 마지막에 위치한다.

SLECT 칼럼명  [ALIAS명] 
 FROM 테이블명   
 [WHERE 조건식]   
 [GROUP BY 칼럼(Column)이나 표현식]   
 [HAVING 그룹조건식 ]   
 [ORDER BY 칼럼(Column)이나 표현식  [ASC 또는 DESC] ] ;

  • ASC(Ascending) : 조회한 데이터를 오름차순으로 정렬(기본 DEFAULT:생략가능)
  • DESC(Descending): 조회한 데이터를 내림차순으로 정렬

SELECT PLAYER_NAME 선수명   
     , POSITION    포지션   
     , BACK_NO     백넘버   
  FROM PLAYER   
 ORDER BY 포지션 ASC;   --(이름으로 내림차순정렬) 
 --ORDER BY 2   
 --ORDER BY POSITION

  • 포지션이 NULL 값인경우
    • 오라클 : NULL 값이 맨 마지막
    • SQL SERVER: NULL 값이 맨 앞
  • ORDER BY는 기본 정렬이 오름 차순이며 오라클에서 NULL 값이 맨마지막으로 정렬 되므로 가장 큰 값임을 알 수가 있다.
  • SQL SERVER는 맨 앞으로 정렬 되므로 가장 적은 값임을 알수가 있다.
  • Case1. 칼럼명 사용 ORDER BY 절 사용

SELECT DNAME   
     , LOC   
     , DEPTNO   
  FROM DEPT   
 ORDER BY DNAME, LOC, DEPTNO DESC;

  • Case2. 칼럼명 + ALIAS 명 사용 ORDER BY 절 사용

SELECT DNAME AS DEPT   
     , LOC   AS AREA   
     , DEPTNO   
  FROM DEPT   
 ORDER BY DNAME, AREA, DEPTNO DESC;

  • Case3. 칼럼 순서번호 + ALIAS 명 사용 ORDER BY 절 사용

SELECT DNAME   
     , LOC AREA   
     , DEPTNO   
  FROM DEPT   
 ORDER BY 1, AREA, 3 DESC;

2. SELECT 문장 실행 순서

  • GROUP BY 절과 ORDER BY가 같이 사용될 때 SELECT 문장은 6개의 절로 구성
  • 실행순서

5. SELECT 칼럼명  [ALIAS명]   
1. FROM 테이블명   
2. WHERE 조건식   
3. GROUP BY 칼럼(Column)이나 표현식   
4. HAVING 그룹조건식   
6. ORDER BY 칼럼(Column)이나 표현식;

  • 1. 발췌 대상 테이블을 참조한다. (FROM)
  • 2. 발췌 대상 데이터가 아닌 것은 제거한다. (WHERE)
  • 3. 행들을 소그룹화 한다. (GROUP BY)
  • 4. 그룹핑된 값의 조건에 맞는 것만을 출력한다. (HAVING)
  • 5. 데이터 값을 출력/계산한다. (SELECT)
  • 6. 데이터를 정렬한다. (ORDER BY)
  • 옵티마이저가 SQL 문장의 SYNTAX, SEMANTIC 에러를 점검하는 순서이면서 실행순서
  • 예를 들면 FROM 절에 정의되지 않은 테이블의 칼럼을 WHERE 절, GROUP BY 절, HAVING 절, SELECT 절, ORDER BY 절에서 사용하면 에러가 발생한다. 그러나 ORDER BY 절에는 SELECT 목록에 나타나지 않은 문자형 항목이 포함될 수 있다.
  • 단, SELECT DISTINCT를 지정하거나 SQL 문장에 GROUP BY 절이 있거나 또는 SELECT 문에 UNION 연산자{}가 있으면 열 정의가 SELECT 목록에 표시{}되어야 한다.
  • SELECT 절에 없는 EMP 칼럼을 ORDER BY 절에 사용

SELECT EMPNO   
     , ENAME   
  FROM EMP   
 ORDER BY MGR;

 결과:정상출력
(SELECT 절에서 정의하지 않은 칼럼을 사용해도 문제없음)

  • 인라인 뷰에 정의된 SELECT 칼럼을 메인쿼리

SELECT EMPNO   
  FROM
     (   
       SELECT EMPNO   
            , ENAME   
         FROM EMP   
        ORDER BY MGR   
     )
;   
  
결과:14개의 행이 선택되었다.   
(인라인 뷰의 SELECT 절에서 정의한 칼럼은 메인쿼리에서도 사용할 수 있음) 

  • 인라인 뷰에 미정의된 칼럼을 메인쿼리에서 사용해본다.

SELECT MGR   
  FROM
     (   
       SELECT EMPNO   
            , ENAME   
         FROM EMP   
        ORDER BY MGR   
     )
;   

결과: SELECT MGR FROM ; * ERROR: "MGR": 부적합한 식별자

  • GROUP BY 절에서 그룹핑 기준을 정의하게 되면 데이터베이스는 일반적인 SELECT 문장처럼 FROM 절에 정의된 테이블의 구조를 그대로 가지고 가는 것이 아니라, GROUP BY 절의 그룹핑 기준에 사용된 칼럼집계 함수에 사용될 수 있는 숫자형 데이터 칼럼들의 집합을 새로 만든다.
  • GROUP BY 절을 사용하게 되면 그룹핑 기준에 사용된 칼럼과 집계 함수에 사용될 수 있는 숫자형 데이터 칼럼들의 집합을 새로 만드는데, 개별 데이터는 필요 없으므로 저장하지 않는다.
  • GROUP BY 이후 수행 절인 SELECT 절이나 ORDER BY 절에서 개별 데이터를 사용하는 경우 에러가 발생한다.
  • 결과적으로 SELECT 절에서는 그룹핑 기준과 숫자 형식 칼럼의 집계 함수를 사용할 수 있지만, 그룹핑 기준 외의 문자 형식 칼럼은 정할 수 없다.
  • GROUP BY 절 사용시 SELECT 절에 일반 칼럼을 사용

SELECT JOB   
     , SAL   
  FROM EMP   
 GROUP BY JOB 
HAVING COUNT(*) > 0   
 ORDER BY SAL ;
   
 --결과:SELECT JOB, SAL ; * ERROR:  GROUP BY 표현식이 아니다.

  • GROUP BY 절 사용시 ORDER BY 절에 일반 칼럼을 사용

SELECT JOB   
  FROM EMP   
 GROUP BY JOB   
HAVING COUNT(*) > 0   
 ORDER BY SAL;   

 --결과:ORDER BY SAL; * ERROR: GROUP BY 표현식이 아니다. 

  • GROUP BY 절 사용시 ORDER BY 절에 집계 칼럼을 사용해본다.*

SELECT JOB   
  FROM EMP   
 GROUP BY JOB   
HAVING COUNT(*) > 0   
ORDER BY MAX(EMPNO), MAX(MGR), SUM(SAL)
    , COUNT(DEPTNO),  MAX(HIREDATE);  
  
결과: 정상출력    ||

  • GROUP BY 절이 사용되었기 때문에 SELECT 절에 정의하지 않은 MAX, SUM, COUNT 집계 함수도 ORDER BY 절에서 사용할 수 있음

3. Top N 쿼리

  • ROWNUM : 데이터의 일부가 먼저 추출된 후(ORDER BY 절은 결과 집합을 결정하는데 관여하지 않음) 데이터에 대한 정렬 작업이 일어남
  • 1. 4건을 먼저 추출 하고 정렬이 일어남

SELECT ENAME   
     , SAL   
  FROM EMP   
 WHERE ROWNUM < 4   
 ORDER BY SAL DESC;

  • 2. 먼저 데이터를 정렬 하고4건만 가져오고자 할경우

SELECT ENAME   
     , SAL   
  FROM
     (   
       SELECT ENAME   
            , SAL   
         FROM EMP   
        ORDER BY SAL DESC   
     )   
 WHERE ROWNUM < 4 

  • TOP N 쿼리 : 데이터 정렬 작업후에 추출 작업이 일어남

 SELECT TOP(4)
        ENAME
      , SAL
   FROM EMP
 WHERE ROWNUM < 4
 ORDER BY SAL DESC

  • 결론: ORDER BY 정렬이 없다면 ROWNUM과 TOP의 기능은 같다.
  • 그러나 정렬이 일어나게되면 SELECT 문장 실행 순서에 따라 전혀 다른 방식으로 출력하게 된다.