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()
'Data Science > SQLD' 카테고리의 다른 글
[SQLD] 데이터 모델과 성능 1-1. 성능 데이터 모델링의 개요 (0) | 2021.09.23 |
---|---|
[SQLD] SQL 기본 1-9. 조인 (0) | 2021.09.23 |
[SQLD] SQL 기본 1-7. GROUP BY절, HAVING 절 (0) | 2021.09.20 |
[SQLD] SQL 기본 1-6. 함수 (0) | 2021.09.19 |
[SQLD] SQL 기본 1-5. WHERE절 (0) | 2021.09.16 |