OracleDB - GROUP BY(HAVING)
📘 GROUP BY
- 같은 값들이 여러개 기록된 컬럼을 가지고 같은 값들을 하나의 그룹으로 묶음
- 여러개의 값을 묶어서 하나로 처리할 목적으로 사용한다.
- 그룹으로 묶은 값에 대해서 SELECT절에서 그룹함수를 사용한다.
- 그룹 함수는 단 한개의 결과 값만 산출하기 때문에 그룹이 여러 개일 경우 오류 발생한다.
- 여러 개의 결과 값을 산출하기 위해 그룹 함수가 적용된 그룹의 기준을 ORDER BY절에 기술하여 사용한다.
📜 SELECT문 해석 순서
- 같은 값들이 여러개 기록된 컬럼을 가지고 같은 값들을 하나의 그룹으로 묶음
- 여러개의 값을 묶어서 하나로 처리할 목적으로 사용한다.
- 그룹으로 묶은 값에 대해서 SELECT절에서 그룹함수를 사용한다.
- 그룹 함수는 단 한개의 결과 값만 산출하기 때문에 그룹이 여러 개일 경우 오류 발생한다.
- 여러 개의 결과 값을 산출하기 위해 그룹 함수가 적용된 그룹의 기준을 ORDER BY절에 기술하여 사용한다.
그전에 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;
Author And Source
이 문제에 관하여(OracleDB - GROUP BY(HAVING)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@orol116/OracleDB-GROUP-BYHAVING저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)