ORDER BY 절
-> ORDER BY 칼럼(Column) 이나 표현식 (ASC 또는 DESCJ)
정렬
- 기본적인 정렬 순서는 오름차순(ASC)이다.
- 숫자형 데이터 타입은 오름차순으로 정렬했을 경우에 가장 작은 값부터 출력된다.
- 날짜형 데이터 타입은 오름차순으로 정렬했을 경우 날짜 값이 가장 빠른 값이 먼저 출력된다. 예를 들어 '01-JAN-2012'는 '01-SEP-2012'보다 먼저 출력된다.
- Oracle에서는 NULL 값을 가장 큰 값으로 간주하여 오름차순으로 정렬했을 경우에는 가장 마지막에, 내림차순으로 정렬했을 경우에는 가장 먼저 위치한다.
- 반면, 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 에러를 점검하는 순서이기도 하다 |
| 오류 | SELECT JOB, SAL FROM EMP GROUP BY JOB HAVING COUNT(* ) > 0 ORDER BY SAL | GROUP BY절에 없는 SAL 컬럼으로 인해 오류 (SELECT) |
| 오류 | SELECT JOB FROM EMP GROUP BY JOB HAVING COUNT(* ) > 0 ORDER BY SAL | GROUP 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과 유사한 기능을 하며 오름차순으로 정렬한 데이터를 가져온다.
| Oracle | Msssql |
| ROWNUM | TOP,LIMIT, RANK, ROW_NUMBER, DENSE_RANK |
| {info} | TOP | SELECT TOP 10 number * FROM table_name | 오름차순의 데이터 10개를 가져옴 |
| RANK | RANK() OVER(PARTITION BY (그룹핑할 컬럼) ORDER BY (정렬할 컬럼)) | result = 1,1,3,4,5 |
| DENSE_RANK | DENSE_RANK() OVER(PARTITION BY (그룹핑할 컬럼) ORDER BY (정렬할 컬럼)) | result = 1,1,2,3,4 |
| ROW_NUMBER | ROW_NUMBER() OVER(PARTITION BY (그룹핑할 컬럼) ORDER BY (정렬할 컬럼)) | result = 1,2,3,4,5 |
|
문서에 대하여