티스토리 뷰

1. ORDER BY 정렬

▷ ORDER BY 절

    : SQL 문장으로 조회된 데이터들을 다양한 목적에 맞게 특정 칼럼을 기준으로 정렬하여 출력하는데 사용한다.

      칼럼명 대신에 SELECT 절에서 사용한 ALIAS 명이나 칼럼 순서를 나타내는 정수도 사용 가능하다.

      별도의 정렬 방식을 지정하지 않으면 기본적으로 오름차순이다.

      SQL 문장의 제일 마지막에 위치한다.

 

 

 

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

 

 

   < ASC  /  DESC >

      (1) ASC ( Ascending)  : 오름차순 정렬

      (2) DESC ( Descending)  : 내림차순 정렬

 

 

 

 

  < ORDER BY 절  오름차순 특성 >

      (1) 기본적인 정렬 순서는 오름차순 (ASC) 이다.

      (2) 숫자형 데이터 타입은 오름차순 정렬일 때 가장 작은 값부터 출력된다.

      (3) 날짜형 데이터 타입은 오름차순 정렬일 때 날짜 값이 가장 빠른 값이 출력된다. ( 가장 오래된 날짜 )

          ( ' 01-JAN-2021 ' 가 ' 01-SEP-2021' 보다 먼저 출력 )

      (4) Oracle 에서는 NULL 값을 가장 큰 값으로 간주하여 오름차순 정렬일 때 가장 마지막에 출력된다.

      (5) SQL Server 에서는 NULL 값을 가장 작은 값으로 간주하여 오름차순 정렬일 때 가장 먼저 출력된다.

 

 

 

 

 

 


(예제)

 

칼럼명이나 ALIAS 명을 대신해서 SELECT 절의 칼럼 순서를 정수로 매핑하여 사용 가능하다.

SELECT 절의 칼럼명이 길거나 정렬 조건이 많을 경우 편리하게 사용할 수 있으나 향후 유지보수성이나 가독성이 떨어지므로 가능한 칼럼명이나 ALIAS 명을 권고한다.

ORDER BY 절에서 칼럼명, ALIAS 명, 칼럼 순서를 같이 혼용하는 것도 가능하다.

 

 

 

(1) 선수들의 백넘버 내림차순, 백넘버가 같은 경우 포지션, 포지션까지 같은 경우 선수명 순서로 출력한다.

    BACK_NO (백넘버) 가 NULL 인 경우는 제외하고, 칼럼명이나 ALIAS가 아닌 칼럼 순서를 매핑하여 사용한다.

SELECT PLAYER_NAME, POSITION, BACK_NO FROM PLAYER
       WHERE BACK_NO IS NOT NULL
       ORDER BY 3 DESC, 2, 1;

 

 

(2) DEPT 테이블 정보를 부서명, 지역, 부서번호 내림차순으로 정렬하여 출력한다.

    ① 칼럼명 사용 ORDER BY 절 사용

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

    ② 칼럼명 + ALIAS 명 사용 ORDER BY 절 사용

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

    ③ 칼럼 순서번호 + ALIAS 명 사용 ORDER BY 절 사용

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

 

 

 

 

 

 

 

 

 

 


2. SELECT 문장 실행 순서

▷ SELECT 문장 순서

    : GROUP BY 절과 ORDER BY 절이 같이 사용될 경우 SELECT 문장은 6개의 절로 구성된다. 

 

      ①  ( FROM ) 발췌 대상 테이블을 참조한다.

      ②  ( WHERE ) 발췌 대상 데이터가 아닌 것은 제거한다.

      ③  ( GROUP BY ) 행들을 소그룹화 한다.

      ④  ( HAVING ) 그룹핑된 값의 조건에 맞는 것만 출력한다.

      ⑤  ( SELECT ) 데이터 값을 출력 / 계산 한다.

      ⑥  ( ORDER BY ) 데이터를 정렬한다.

 

 

 

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

옵티마이저가 SQL 문장의 SYNTAX , SEMANTIC 에러를 점검하는 순서이기도 하다.

 

 

 

 

 

 

 


(예제)

 

(1) SELECT 절에 없는 EMP 칼럼을 ORDER BY 절에 사용한다.

SELECT EMPNO, ENAME FROM EMP ORDER BY MGR;

ORDER BY 절에서 SELECT 절에서 정의하지 않은 칼럼을 사용해도 문제 없다.

 

 

(2) 인라인 뷰에 정의된 SELECT 칼럼을 메인쿼리에서 사용한다.

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

인라인 뷰의 SELECT 절에서 정의한 칼럼은 메인쿼리에서도 사용할 수 있다.

그러나 서브쿼리의 SELECT 절에서 선택되지 않은 칼럼들은 계속 유지되지 않는다.

서브쿼리 범위를 벗어나면 더 이상 사용할 수 없게 된다.

 

 

 

GROUP BY 절을 사용하게 되면 그룹핑 기준에 사용된 칼럼과 집계 함수에 사용될 수 있는 숫자형 데이터 칼럼들의 집합을 새로 만드는데, 개별 데이터는 필요 없으므로 저장하지 않는다.

GROUP BY 이후 수행 절인 SELECT 절이나 ORDER BY 절에서 개별 데이터를 사용하는 경우 에러가 발생한다.

 

∴ SELECT 절에서는 그룹핑 기준과 숫자 형식 칼럼의 집계 함수를 사용할 수 있지만, 그룹핑 기준 외의 문자 형식 칼럼은 정할 수 없다.

 

 

 

(3) GROUP BY 절 사용시 SELECT 절에 일반 칼럼을 사용한다.

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

SELECT JOB, SAL;
ERROR : GROUP BY 표현식이 아니다.

 

 

(4) GROUP BY 절 사용시 ORDER BY 절에 일반 칼럼을 사용한다.

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

ORDER BY SAL;
ERROR : GROUP BY 표현식이 아니다.

 

 

(5) 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);

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

 

 

 

 

 

 

 

 

 

 

 


3. Top N 쿼리

▷ ROWNUM

    : Oracle 에서 순위가 높은 N개의 ROW 를 추출하기 위해 ORDER BY 절과 WHERE 절의 ROWNUM 조건을 같이 사용하지만,

      두 조건으로는 원하는 결과가 나오지 않는다.

      Oracle 의 경우, 데이터의 일부가 먼저 추출된 후 데이터에 대한 정렬 작업이 일어난다.

 

 

 

(예제)

 

(1) 사원 테이블에서 급여가 높은 3명만 내림차순으로 출력하고자 한다.

 

* 오류사항 코드

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

급여가 상위 3명을 출력이 아닌, 급여 순서에 상관 없이 무작위로 추출된 3명에 한해서 급여를 내림차순으로 정렬한 것이다.

 

 

 

* 올바른 코드

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

인라인 뷰를 사용하여 추출하고자 하는 접합을 정렬한 후 ROWNUM 을 적용시킨다.

 

 

 

 

 


▷ TOP( )

    : SQL Server 에서 TOP 조건을 사용하게 되면 별도 처리 없이

     관련 ORDER BY 절의 데이터 정렬 후 원하는 일부 데이터만 쉽게 출력한다.

 

 

TOP (EXPRESSION) [PERCENT] [WITH TIES]

TOP 절을 사용하여 결과 집합으로 반환되는 행 수를 제한할 수 있다.

 

WITH TIES 옵션은 ORDER BY 절의 조건 기준으로 TOP N 의 마지막 행으로 표시되는 추가 행의 데이터가 같을 경우 N+ 동일 정렬 순서 데이터를 추가 반환하도록 지정하는 옵션이다.

( 예제 2번 참고 )

 

 

 

(예제)

 

(1) 사원 테이블에서 급여가 높은 2명을 내림차순으로 출력한다.

SELECT TOP(2) ENAME, SAL FROM EMP ORDER BY SAL DESC;

 

(2) 사원 테이블에서 급여가 높은 2명을 내림차순으로 출력하는데, 같은 급여를 받는 사원이 있으면 같이 출력한다.

SELECT TOP(2) WITH TIES ENAME, SAL FROM EMP ORDER BY SAL DESC;

TOP(2) WITH TIES 옵션은 동일 수치 ( 같은 급여) 의 데이터를 추가로 더 추출하는 것이다.

 

 

 

 

 

 

 


 

 

 

 

'SQL > SQLD 2과목' 카테고리의 다른 글

SQLD - 과목2. (10) 표준 조인  (0) 2021.03.19
SQLD - 과목2. (9) 조인 (JOIN)  (0) 2021.03.18
SQLD - 과목2. (7) GROUP BY, HAVING 절  (0) 2021.03.18
SQLD - 과목2. (6) 함수 (FUNCTION)  (0) 2021.03.16
SQLD - 과목2. (5) WHERE 절  (0) 2021.03.11
댓글