select문에서 result set을 정렬하기 위해 사용하는 구문이다.
select 문의 가장 마지막에 작성하며,
실행순서도 가장 마지막이다.
from -> where -> group by -> having -> select - order by
asc
오름차순
desc
내림차순
만약 컬럼에 null이 존재한다면 default로 상단에 배치
# 사원들의 이름, 급여 보너스를 조회하되 bonus로 오름차순 정렬
select emp_name, salary, bonus, SAL_LEVEL, DEPT_CODE
from employee
# order by bonus asc;
특정 컬럼을 기준으로 그루핑하여 그룹함수를 사용해 원하는 데이터를 추출할 목적으로 사용한다.
select 절에는 그루핑한 기준이되는 컬럼과 그 외 함수의 결과만 올 수 있다.
# 부서별 급여의 총액과 평균 급여를 보자
select dept_code, sum(salary), avg(salary)
from employee
group by DEPT_CODE;
# 부서의 평균급여가 3000000이상인 부서를 조회
select dept_code
from employee
# where avg(SALARY) >= 3000000 : where절이 돌아가는 시점에는 그루핑이 안되어있음
# 개별 탐색을 마친후에 그루핑을 해야한다.
# 때문에 where절에서는 그루핑함수를 못쓴다.
group by DEPT_CODE
having sum(SALARY) >= 3000000;
with rollup
그룹별 중간집계와 총집계를 계산한다.
#부서별, 직급별, 연봉레벨별
select dept_code, job_code, SAL_LEVEL, sum(salary), count(*)
from employee
where DEPT_CODE is not null
group by DEPT_CODE, JOB_CODE, SAL_LEVEL with rollup
order by dept_code is null asc
,job_code is null asc
,sal_level is null asc
, dept_code asc
, job_code asc
, sal_level asc;
result set에는 각 부서(그룹)별 합이 출력된다.
다만, 데이터의 양이 많으면 그룹별로 집계된 값에대한 가독성이 현저히 떨어진다.
이런상황을 타개하려면 grouping 함수를 사용하면 된다.
grouping (Columns_name)
해당 row의 집계값이 인자로 전달받은 columns set의 산출물이면 0,
아니면 1을 갖는다.
내가 보고있는 그룹이 어디에 그루핑된건지 알아야할 때 쓴다.
select dept_code, job_code, SAL_LEVEL, sum(salary), count(*)
,grouping(dept_code)
,grouping(job_code)
,grouping(SAL_LEVEL)
from employee
where DEPT_CODE is not null
group by DEPT_CODE, JOB_CODE, SAL_LEVEL with rollup
order by dept_code is null asc
,job_code is null asc
,sal_level is null asc
, dept_code asc
, job_code asc
, sal_level asc;