SQLD 3-8 ] ORDER BY
❏ ORDER BY 정렬
- 조회된 데이터들을 정렬하여 출력한다!
select 칼럼명
from 테이블명
where 조건식
group by 칼럼이나 표현식
having 그룹조건식
order by 칼럼이나 표현식 (ASC/DESC);
order by 를 새로 알게됬다. SQL 문장의 맨 마지막 에 위치하는 애다.
ASC / DESC 옵션.
ASC: 오름차순으로 정렬 (기본값이므로 생략 됨!)
DESC : 내림차순 정렬
select PLAYER_NAME as 선수명, POSITION as 포지션, BACK_NO as 백넘버
from PLAYER
order by PLAYER_NAME desc;
player_name 을 내림차순으로 정렬했다. player_name 의 별명은 선수명. player_name 대신 별명 선수명을 써도 된다.
그리고 순서 번호로도 사용 가능하다, 1이면 선수명 2면 포지션 3이면 백넘버 .
ORDER BY 절의 특징
1. 기본적인 정렬 순서는 오름차순(ASC) 이다
2. 숫자형 데이터 타입은 오름차순으로 정렬했을 경우에 가장 작은 값부터 출력된다 (당연)
3. 날짜형 데이터 타입은 오름차순으로 정렬했을 경우에 날짜 값이 빠른 값 먼저 출력된다. (이것도 당연하지)
4. ORACLE 에서는 NULL 값을 가장 큰 값으로 간주하여 오름차순으로 정렬 했을 때 가장 마지막에, 내림차순으로 했을 때 제일 먼저.
5. SQL SERVER 에서는 4번과 반대이다. NULL 값을 가장 작은 값으로 간주.
❏ SELECT 문장 실행 순서
- SELECT 문장의 실행 순서
1. 테이블을 본다 ( FROM )
2. 조건을 보고 쳐낼껀 쳐낸다 ( WHERE )
3. 소그룹화 한다 ( GROUP BY )
4. 소그룹화 한것들의 또 조건을 줘서 출력한다 ( HAVING )
5. 데이터 값을 출력/계산 한다. ( SELECT )
6. 최종으로 정렬한다 ( ORDER BY )
- 위의 순서는 옵티마이저 가 SQL 문장의 SYNTAX, SEMANTIC 에러를 점검하는 순서이기도 하다.
select EMPNO, ENAME
from EMP
order by MGR;
도 문제 없다. emp 테이블에 있는 empno, ename 을 갖고오는데 정렬을 emp 테이블에 있는 mgr 칼럼의 오름차순대로 정렬한다.
- GROUP BY 절을 만나면 원래 테이블의 구조를 갖고 있는게 아니라
GROUP BY 절에서 정의한대로 그룹 할떄 사용된 칼럼 그룹 / 집계함수 를 사용할 수 있게 숫자형 데이터들의 칼럼들의 그룹
이렇게 2가지 그룹을 생성한다.
(1) select 순서에 따르면.. group by 로 JOB 칼럼에 애들 그룹지어줬는데, select 절에 일반칼럼(SAL) 을 사용했다. SAL 에 뭘출력할지 모르잖아..
select JOB, SAL
from EMP
group by JOB
having count(*) > 0
order by SAL;
ERROR : GROUP BY 표현식이 아닙니다
(2) ORDER BY 절에 일반칼럼을 사용했다.
select JOB
from EMP
group by JOB
having count(*) > 0
order by SAL;
ERROR : GROUP BY 표현식이 아닙니다
(3) 문제 없는 정상 명령문. 집계함수를 위한 숫자형 데이터 칼럼들의 집합이 있으니 거기꺼를 토태로 정렬 했다(눈에 보이진 않지만..)
select JOB
from EMP
group by JOB
having count(*) > 0
order by MAX(EMPNO), MAX(MGR), SUM(SAL), COUNT(DEPTNO);
❏ Top N 쿼리
- 이거 아까 함수에서 본거같은데. ROWNUM (oracle) / TOP ( ) (sql server) 이 2가지가 있다.
- ROWNUM
ORDER BY 절과 WHERE 절의 ROWNUM 조건을 같이 사용하는 경우가 있는데.. 이 두 조건으로는 원하는 결과를 얻을 수 없다
사원 테이블에서 급여가 높은 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;
이렇게 순서 order by 보다 where 을 먼저 처리하는 oracle 의 특성 상
인라인 뷰(4-2 에서 설명 할거지만. 대충 지금 봐서는 from 에 저렇게 select 를 쓴것을 말하는거같다.) 에서 먼저
정렬을 해 놓 고 . .
where ROWNUM 으로 3개만 출력하게..
- TOP
SQL SERVER 에서 쓰는 건데 ROWNUM 이랑 같은 용도이다. 사용법이 조금 다르다.'
TOP (표현식) [PERCENT] [WITH TIES]
WITH TIES 옵션은 ORDER BY 절의 조건이 TOP 의 결과랑 같을 경우. +1 해서보여준다.
select TOP(2) ENAME, SAL
from EMP
order by SAL desc;
하면. SAL 의 내림차순 기준으로. 결과가 나온다.
select TOP(2) WITH TIES ENAME, SAL
from EMP
order by SAL desc;
하면. with ties 옵션이 껴있으니 동일 수치의 데이터를 추가 추출한다.
댓글
이 글 공유하기
다른 글
-
SQLD 4-1 ] 표준 조인
SQLD 4-1 ] 표준 조인
2016.02.25 -
SQLD 3-9 ] JOIN
SQLD 3-9 ] JOIN
2016.02.25 -
SQLD 3-7 ] GROUP BY, HAVING 절
SQLD 3-7 ] GROUP BY, HAVING 절
2016.02.24 -
SQLD 3-6 ] 함수
SQLD 3-6 ] 함수
2016.02.23