본문 바로가기

Data Science/SQLD

[SQLD] SQL 기본 1-8. ORDER BY절

반응형

1. ORDER BY 정렬

: SQL 문장으로 조회된 데이터를 목적에 맞게 특정 칼럼 기준 정렬해 출력

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

: Default는 오름차순이며 SQL 문장의 제일 마지막에 작성

 

SELECT 칼럼명 [ALIAS명]

FROM 테이블명

[WHERE 조건식]

[GROUP BY 칼럼이나 표현식]

[HAVING 그룹조건식]

[ORDER BY 칼럼이나 표현식 [ASC 또는 DESC]];

 

(1) 선수 테이블에서 선수들의 이름, 포지션, 백넘버를 출력하는데 사람 이름을 내림차순으로 정렬해서 출력

더보기

SELECT PLAYER_NAME 선수명, POSTION 포지션, BACK_NO 백넘버

FROM PLAYER

ORDER BY PLAYER_NAME DESC;

 

(2) 선수 테이블에서 ALIAS를 이용해 선수들의 이름, 포지션, 백넘버를 출력하는데 선수들의 포지션 내림차순 출력.

더보기

SELECT PLAYER_NAME 선수명, POSTION 포지션, BACK_NO 백넘버

FROM PLAYER
ORDER BY 포지션 DESC;

Oracle -> NULL이 가장 큰 값으로 출력

SQL SERVER -> NULL이 가장 작은 값으로 출력

 

(3) 한 개의 칼럼이 아닌 여러 가지 칼럼을 기준으로 정렬. 키가 큰 -> 백넘버 순. 단, 키가 NULL인 데이터는 제외

더보기

SELECT PLAYER_NAME 선수이름, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키

FROM PLAYER

WHERE HEIGHT IS NOT NULL

ORDER BY HEIGHT DESC, BACK_NO;

# SELECT절의 칼럼 순서를 정수로 매핑해서 사용 가능 -> 유지보수성, 효율성이 떨어지므로, ALIAS 권장

 

(4) 선수 테이블에서 선수들의 이름, 포지션 백넘버를 출력. 백넘버 내림차순 -> 포지션 -> 선수명 순서로 출력

[단, BACK_NO가 NULL인 경우 제외, 칼럼명이나 ALIAS 아닌 칼럼 순서를 매핑해 사용]

더보기

SELECT PLYAER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버

FROM PLAYER

WHERE BACK_NO IS NOT NULL

ORDER BY 3 DESC, 2, 1;

 

(5) DEPT 테이블 정보를 부서명, 지역, 부서번호 내림차순으로 정렬해 출력.

[단, 칼럼 레이블은 다르지만 결과는 같다]

 

CASE 1. 칼럼명 사용

더보기

SELECT DNAME, LOC, DEPTNO

FROM DEPT

ORDER BY DNAME, LOC, DEPTNO DESC;

 

CASE 2. 칼럼명 + ALIAS 명 사용

더보기

SELECT DNAME DEPT, LOC AREA, DEPTNO

FROM DEPT

ORDER BY DNAME, LOC, DEPTNO DESC;

CASE 3. 칼럼 순서번호 + ALIAS 명 사용

더보기

SELECT DNAME, LOC AREA, DEPTNO

FROM DEPT

ORDER BY 1, AREA, 3 DESC;


2. SELECT 문장 실행 순서

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

1. 발췌 테이블 참조 [FROM]

2. 발췌 대상 아닌 데이터 제거 [WHERE]

3. 행들을 소그룹화 [GROUP BY]

4. 그룹핑 값의 조건만 출력 [HAVING]

5. 데이터 값을 출력/계산 [SELECT]

6. 데이터 정렬 [ORDER BY]

 

-> 관계형 데이터베이스가 데이터를 메모리에 올릴 때 행 단위로 모든 칼럼을 가져오므로,

[SELECT 절에서 일부 칼럼만 선택하더라도 ORDER BY 절에서 메모리에 올라와있는 다른 칼럼 데이터 사용 가능]

 

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

 

-> 사용 가능

(3) 인라인 뷰에 미정의된 칼럼을 메인쿼리에서 사용

더보기

SELECT MGR FROM

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

 

 

-> SELECT MGR FROM : MGR은 부적합한 식별자

 

-> 서브쿼리의 칼럼들은 범위를 벗어나면 더이상 사용 불가 -> 그룹핑 기준에 맞는 칼럼과 집계함수에 사용가능한 숫자 형 데이터 칼럼 집합 새로 생성 [단, 개별 데이터 사용 불가]

 

즉, SELECT 절에선 그룹핑 기준과 숫자 형식 칼럼 집계 함수 사용 가능, 그룹핑 기준 외 문자 형식 칼럼 정하지 못함

 

(4) GROUP BY 절 사용시 SELECT 절에 일반 칼럼 사용

더보기

SELECT JOB, SAL

FROM EMP

GROUP BY JOB

HAVING COUNT(*) >0

ORDER BY SAL;

 

-> SELECT JOB, SAL : GROUP BY 표현식이 아님

(5) GROUP BY 절 사용시 ORDER BY 절에 일반 칼럼 사용

더보기

SELECT JOB

FROM EMP

GROUP BY JOB

HAVING COUNT(*) >0

ORDER BY SAL;

 

-> ORDER BY SAL : GROUP BY 표현식이 아님

 

(6) 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 절에 정의하지 않은 집계 함수도 ORDER BY에서 사용가능


3. Top N 쿼리

 

ROWNUM

: 순서가 높은 N개의 로우를 추출하기 위한 경우 -> ORDER BY절과 WHERE절의 ROWNUM 같이 사용 ----(X)

 

-> 정렬 완료 후 데이터 일부 출력이 아니라, 데이터 일부 먼저 추출 후 정렬

 

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

더보기

SELECT ENAME, SAL

FROM EMP

WHERE ROWNUM <4

ORDER BY SAL SEDC;

 

-> 급여 순서 상관없이 무작위 추출된 3명의 급여를 내림차순 정렬. 즉, 잘못된 결과

(2) ORDER BY 절 없으면 -> ROWNUM = TOP

ORDER BY 절 있으면 -> ROWNUM을 WHERE에서 처리

[ORDER BY절보다 먼저 처리 -> 인라인 뷰에서 데이터 정렬 수행 후 메인 쿼리에서 ROWNUM 조건 사용]

더보기

SELECT ENAME, SAL

FROM (SELECT ENAME, SAL FROM EMP ORDER BY SAL DESC)

WHERE ROWNUM <4;

 

-> 인라인 뷰 사용해 추출 집합을 정렬 후 ROWNUM 적용 

 

TOP()

반응형