OracleDB - GROUP BY(HAVING)

📘 GROUP BY

  • 같은 값들이 여러개 기록된 컬럼을 가지고 같은 값들을 하나의 그룹으로 묶음
  • 여러개의 값을 묶어서 하나로 처리할 목적으로 사용한다.
  • 그룹으로 묶은 값에 대해서 SELECT절에서 그룹함수를 사용한다.
  • 그룹 함수는 단 한개의 결과 값만 산출하기 때문에 그룹이 여러 개일 경우 오류 발생한다.
  • 여러 개의 결과 값을 산출하기 위해 그룹 함수가 적용된 그룹의 기준을 ORDER BY절에 기술하여 사용한다.

📜 SELECT문 해석 순서

그전에 SQL에서 SELECT문의 해석 순서를 알아두자.

5 : SELECT 컬럼명 AS 별칭, 계산식, 함수식
1 : FROM 참조할 테이블명
2 : WHERE 컬럼명 | 함수식 비교연산자 비교값
3 : GROUP BY 그룹을 묶을 컬럼명
4 : HAVING 그룹함수식 비교연산자 비교값
6 : ORDER BY 컬럼명 | 별칭 | 컬럼순번 정렬방식 [NULLS FIRST | LAST];

이 순서는 계속해서 SQL 사용시 중요하므로 꼭꼭 알아두자!!!

✏ GROUP BY 주의사항

SELECT문에 GROUP BY절을 사용할 경우 SELECT절에 명시한 조회할려면 컬럼 중 그룹함수가 적용되지 않은 컬럼을 모두 GROUP BY절에 작성해야한다.

ex)
EMPLOYEE 테이블에서 부서 별로 같은 직급인 사원의 급여 합계를 조회하고 부서 코드 오름차순으로 정렬

SELECT DEPT_CODE, JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE, JOB_CODE
ORDER BY DEPT_CODE;

✏ GROUP BY 사용법

GROUP BY 컬럼명 | 함수식, ....

EMPLOYEE 테이블에서 부서코드, 부서(그룹) 별 급여 합계 조회

SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE;

--> DEPT_CODE 컬럼은 23행, SUM(SALARY) 컬럼은 1행으로 하나의 표에 작성할 수 없다.

이때 GROUP BY를 사용하여 그룹을 지어 조회할 수 있도록 한다!!

SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE; -- 부서별로 그룹을 지어 각 그룹의 합계 조회

📜 HAVING절

그룹함수로 구해 올 그룹에 대한 조건을 설정할 때 사용한다.
(쉽게 말하면 WHERE절을 그룹에 대하여 사용하는 것이라 생각하면 된다!)

✏ HAVING 사용법

HAVING 컬럼명 | 함수식 비교연산자 비교값

부서별 평균가 급여 3000000원 이상인 부서를 조회하여 부서코드 오름차순으로 정렬

SELECT DEPT_CODE, FLOOR(AVG(SALARY)) 
FROM EMPLOYEE
WHERE SALARY >= 3000000 -- 급여가 300만 이상인 직원의 부서별 급여 평균
GROUP BY DEPT_CODE
ORDER BY DEPT_CODE;
SELECT DEPT_CODE, FLOOR(AVG(SALARY)) 
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING AVG(SALARY) >= 3000000 -- 부서별 평균 급여가 300만 이상
ORDER BY DEPT_CODE;

📜 집계함수(ROLLUP, CUBE)

  • 그룹 별 산출한 결과 값의 집계를 계산하는 함수이다.
  • GOURP BY 절에만 작성하는 함수이다.

✏ ROLLUP 함수

  • 그룹별로 중간 집계 처리를 하는 함수이다.
  • 그룹별로 묶여진 값에 대한 '중간 집계'와 '총 집계'를 계산하여 자동으로 추가하는 함수이다.
  • 인자로 전달받은 그룹중에서 가장 먼저 지정한 그룹별 합계와 총 합계를 구하는 함수이다.

사용법

EMPLOYEE 테이블에서 각 부서에 소속된 직급 별 급여합, 부서 별 급여 합, 전체 직원 급여 총합 조회

SELECT DEPT_CODE, JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY ROLLUP(DEPT_CODE, JOB_CODE)
ORDER BY DEPT_CODE;

✏ CUBE 함수

  • 그룹별 산출한 결과를 집계하는 함수이다.
  • 그룹으로 지정된 모든 그룹에 대한 집계와 총 합계를 구하는 함수이다.

사용법

EMPLOYEE 테이블에서 각 부서 마다 직급별 급여합, 부서 전체 급여 합

SELECT DEPT_CODE, JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY CUBE(DEPT_CODE, JOB_CODE)
ORDER BY 1;

좋은 웹페이지 즐겨찾기