SELECT 검색 대상 (기준컬럼, 그룹함수(컬럼))
FROM 검색 대상 집합 (테이블, 뷰, 서브쿼리)
(WHERE) 행 제한을 위한 조건식
GROUP BY 그룹컬럼
HAVING 그룹함수를 적용한 결과를 조건처리.
SELECT deptno, max(sal) "최대급여" --부서번호를 그룹으로 만들어 부서정보별 최대
FROM emp
GROUP BY deptno;
-- 특정한 컬럼의 데이터를 그룹별로 나누어서 통계치를 처리한다.
--ex)
SELECT deptno, max(sal) "최대급여" --부서번호를 그룹으로 만들어 부서정보별 최대
FROM emp
GROUP BY deptno
HAVING max(sal)>=3000; -- 그룹함수가 적용된 조건을 설정하려면 having 조건문
--ex)
SELECT deptno, avg(sal)
FROM EMP e
WHERE sal>=2000
GROUP BY deptno
HAVING avg(sal)>=3000;
SELECT deptno, count(sal), max(sal), min(sal),
sum(sal), avg(sal), stddev(sal), variance(sal)
FROM EMP e
GROUP BY deptno;
--ex) 직책별 사원의 수와 평균급여를 출력하세요
SELECT job, count(empno), round(avg(sal)) "평균급여(반올림)"
FROM emp
GROUP BY job;
--ex) 부서별 가장 최근에 입사한 사원의 입사일을 출력하세요
SELECT deptno, max(hiredate) "부서별최근"
FROM EMP
GROUP BY deptno;
--ex) 부서별 가장 오래 근무한 사원의 입사일을 출력하세요
SELECT deptno, min(hiredate) "부서별가장오래근무"
FROM EMP
GROUP BY deptno;
--월별로 급여가 가장 높은 급여
-- 데이터를 추출하거나 일부분을 만들어 이것을 그룹함수로 처리
SELECT to_number(to_char(hiredate, 'MM')) "월", sal
FROM emp
ORDER BY 월;
SELECT to_number(to_char(hiredate,'MM')) 월,
max(sal) "최대급여", avg(sal)
FROM EMP e
GROUP BY to_number(to_char(hiredate,'MM'))
ORDER BY 월;
--> 중첩함수를 적용해서 처리한 내용을 볼수 있다.
-- ex) 사원번호를 기준으로 짝/홀 홍/청팀으로 나누어서 인원수와 평균급여를 출력하세요.
SELECT decode(MOD(empno,2),0,'홍','청') "홍/청",
count(empno) "인원수",
round(avg(sal)) "평균급여"
FROM EMP e
GROUP BY MOD(empno,2);
having절
내부 정렬 과정에 의해 그룹화된 결과 집합에 대해 검색 조건 실행
where절
그룹화하기 전에 먼저 검색 조건 실행
실무 데이터베이스 관점
where절의 검색 조건을 먼저 실행하는 방법이 효율적
그룹화하는 행 집합을 줄여서 내부 정렬 시간을 단축
SQL처리 성능 향상
-- sal가 2000 이상인 것을 대상으로 그룹함수를 처리
SELECT deptno, avg(sal) 평균
FROM EMP e
WHERE sal>= 2000
GROUP BY deptno;
--**************
-- 1. 사원 정보 중에 급여가 2000 이상인 데이터를 가져온다
SELECT deptno, sal
FROM emp
WHERE sal >= 2000;
-- 2. 위 데이터를 기준으로 그룹을 처리한다. 즉, 평균 급여
--그룹함수가 처리된 결과에서 avg(sal)를 조건으로 처리
SELECT deptno, avg(sal) 평균
FROM emp
GROUP BY deptno
-- 3. 그룹별로 평균급여를 기준으로 조건을 처리할 때, having을 처리한다
SELECT deptno, avg(sal) 평균
FROM emp
GROUP BY deptno
HAVING avg(sal)>=2000;
--*************