ORDER BY 절

-> ORDER BY 칼럼(Column) 이나 표현식 (ASC 또는 DESCJ)

정렬

  • 특징
  1. 기본적인 정렬 순서는 오름차순(ASC)이다.
  2. 숫자형 데이터 타입은 오름차순으로 정렬했을 경우에 가장 작은 값부터 출력된다.
  3. 날짜형 데이터 타입은 오름차순으로 정렬했을 경우 날짜 값이 가장 빠른 값이 먼저 출력된다. 예를 들어 '01-JAN-2012'는 '01-SEP-2012'보다 먼저 출력된다.
  4. Oracle에서는 NULL 값을 가장 큰 값으로 간주하여 오름차순으로 정렬했을 경우에는 가장 마지막에, 내림차순으로 정렬했을 경우에는 가장 먼저 위치한다.
  5. 반면, SQL Server에서는 NULL 값을 가장 작은 값으로 간주하여 오름차순으로 정렬했을 경우에는 가장 먼저, 내림차순으로 정렬했을 경우에는 가장 마지막에 위치한다.
  • 표현의 예
SELECT DNAME, LOC AREA, DEPTNO FROM DEPT ORDER BY DNAME, LOC, DEPTNO DESC
SELECT DNAME, LOC AREA, DEPTNO FROM DEPT ORDER BY DNAME, AREA, DEPTNO DESC
SELECT DNAME, LOC AREA, DEPTNO FROM DEPT ORDER BY 1, 2, 3 DESC
SELECT DNAME, LOC AREA, DEPTNO FROM DEPT ORDER BY 1, LOC, DEPTNO DESC
SELECT DNAME, LOC AREA, DEPTNO FROM DEPT ORDER BY 1, AREA, 3 DESC

문장 실행 순서

서술 순서실행순서Action
#5. SELECT 칼럼명 (ALIAS 명)데이터 값을 출력/계산한다 (SELECT)
#1. FROM 테이블명대상 테이 블을 참조한다. (FROM)
#2. WHERE 조건식대상 데이터가 아닌 것은 제거한다. (WHERE)
#3. GROUP BY 칼럼 (Column) 이나 표현식행들을 소그룹화 한다 (GROUP BY)
#4. HAVING 그룹조건식그룹핑된 값의 조건에 맞는 것만을 출력 한다. (HAVING)
#6. ORDER BY 칼럼 (Column) 이나 표현식데이터를 정렬한다. (ORDER BY)
{info} 옵티마이저가 SQL 문장의 SYNTAX, SEMANTIC 에러를 점검하는 순서이기도 하다 {info}
  • 예 - GROUP BY 절
오류SELECT JOB, SAL FROM EMP GROUP BY JOB HAVING COUNT(* ) > 0 ORDER BY SALGROUP BY절에 없는 SAL 컬럼으로 인해 오류 (SELECT)
오류SELECT JOB FROM EMP GROUP BY JOB HAVING COUNT(* ) > 0 ORDER BY SALGROUP BY절에 없는 SAL 컬럼으로 인해 오류 (ORDER BY)
정상SELECT JOB, SAL FROM EMP GROUP BY JOB HAVING COUNT(* ) > 0 ORDER BY MAX(EMPNO) , MAX(MGR), SUM(SAL), COUNT(DEPTNO), MAX(HIREDATE)GROUP BY절 사용으로 SELECT 에서 정의하지 않은 집계 함수도 사용 가능

Top N 쿼리

ROWNUM

-> Oracle에서 제공하는 가상 컬럼으로 Select에서 사용시에 추출하는 데이터의 순번을 부여하는 용도로 사용/where절에서 사용시 추출할 데이터중 일부만 가져오는 용도

  • 특히 Where 절에 사용되는 Rownum은 인덱스의 특성을 이용하여 부분범위 처리로 유도가능하여 효율적 SQL을 할 수 있게 된다.
TOP

-> Mssql에서 사용하는 것으로 ROWNUM과 유사한 기능을 하며 오름차순으로 정렬한 데이터를 가져온다.

OracleMsssql
ROWNUMTOP,LIMIT, RANK, ROW_NUMBER, DENSE_RANK
{info}TOPSELECT TOP 10 number * FROM table_name오름차순의 데이터 10개를 가져옴
RANKRANK() OVER(PARTITION BY (그룹핑할 컬럼) ORDER BY (정렬할 컬럼))result = 1,1,3,4,5
DENSE_RANKDENSE_RANK() OVER(PARTITION BY (그룹핑할 컬럼) ORDER BY (정렬할 컬럼))result = 1,1,2,3,4
ROW_NUMBERROW_NUMBER() OVER(PARTITION BY (그룹핑할 컬럼) ORDER BY (정렬할 컬럼))result = 1,2,3,4,5

문서에 대하여