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 에러를 점검하는 순서이기도 하다 {info} |
오류 | 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 |
|
문서에 대하여