그룹함수
-> 결과는 기본적으로 한개의 값만 가져옴
✅ SUM
// D5 부서의 월급의 총 합계
SELECT TO_CHAR(SUM(SALARY),'FML999,999,999') AS "D5의 총 월급 " FROM EMPLOYEE
WHERE DEPT_CODE = 'D5';
✅ AVG
// D5의 급여 평균을 구하기
SELECT AVG(SALARY) FROM EMPLOYEE
WHERE DEPT_CODE = 'D5';
// NULL값에 대해서는 어떻게 처리가될까 -> 널값은 데이터 제외해버림
SELECT SUM(BONUS),AVG(BONUS),AVG(NVL(BONUS,0))
// 보너스 NULL값인 사람들은 0값으로 바꾸며 평균구할때 인원수에는 추가된다!
FROM EMPLOYEE;
✅ COUNT
// D5부서에서 보너스를 받고 있는 사원의 수
SELECT COUNT(*) FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' AND BONUS IS NOT NULL;
✅ MIN, MAX
SELECT MAX(SALARY), MIN(SALARY) FROM EMPLOYEE; // 연봉의 최소값과 최대값 각각 출력
SELECT job_id, sum(salary), avg(salary)
from employees
group by job_id
// group by 뒤에 select절에서 지정한 기준 열이 아닌, 집계함수(sum,avg 등등)이나 지정하지 않은 컬럼으로
// 기준을 정하면 오류가 발생함
-- SELECT 기준컬럼
-- FROM 테이블명
-- [WHERE 조건식] ------ 제일먼저 필러링을 거친 후 GROUP BY 진행
-- [GROUP BY 컬럼명 [,컬럼명,컬럼명,....]]
-- [ORDER BY 컬럼명]
// GROUP BY 절에는 다수(2개이상)의 컬럼을 넣을 수 있다
SELECT DEPT_CODE, JOB_CODE, COUNT(*)
FROM EMPLOYEE
GROUP BY DEPT_CODE, JOB_CODE; // DEPT_CODE와 JOB_CODE 둘 다 공통되는 것 으로 묶음
// GROUP BY를 사용한 절에서 WHERE도 사용이 가능하다
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
WHERE DEPT_CODE IS NOT NULL // 조건으로 먼저 제외한 후 그룹으로 묶음
GROUP BY DEPT_CODE; // 널값 제외한 부서별 합계 출력
// 직책별 인원수가 3명이상인 직책 출력
SELECT JOB_CODE, COUNT(*)
FROM EMPLOYEE
GROUP BY JOB_CODE
HAVING COUNT(*) >= 3;
// 남자, 여자의 급여 평균을 구하고 인원수를 구하기
SELECT DECODE(SUBSTR(EMP_NO,8,1),'1','남','3','남','2','여','4','여')
AS 성별, AVG(SALARY), COUNT(*) FROM EMPLOYEE
GROUP BY DECODE(SUBSTR(EMP_NO,8,1),'1','남','3','남','2','여','4','여');
// 13번 EMPLOYEE 테이블에서 직급이 J1을 제외하고, 직급별 사원수 및 평균급여를 출력
SELECT COUNT(*) "직급별 사원수" , AVG(SALARY) AS "평균급여" // 1
FROM EMPLOYEE // 2
WHERE JOB_CODE != 'J1' // 3
GROUP BY JOB_CODE; // 4
// 순어에 맞춰서 문법을 적어야한다
✅ HAVING
HAVING
절 사용SELECT manager_id, department_id, job_id, // 4. 데이터 조회
SUM(salary), MIN(salary), MAX(salary)
FROM employees
WHERE manager_id IN(100,101) // 1. where절로 먼저 필터링
GROUP BY manager_id, department_id, job_id // 2. 해당 3가지 컬럼을 기준으로 동일한 값을 묶음
HAVING SUM(salary) BETWEEN 10000 AND 40000 // 3. 묶은 값들중에 집계함수를 사용하여 조건식 적용
ORDER BY manager_id, department_id; // 5. 정렬
✅ 전체적인 순서
WHERE : 그룹화 하기전에 먼저 수행
HAVING : 그룹화 된 집계연산에 대해서 조건식을 적용