오라클 그룹함수

최주영·2023년 4월 3일
0

오라클

목록 보기
7/22

그룹함수 -> 결과는 기본적으로 한개의 값만 가져옴

✅ SUM

  • 특정 컬럼에 대한 총합
  • SUM(컬럼(NUMBER))
// D5 부서의 월급의 총 합계
SELECT TO_CHAR(SUM(SALARY),'FML999,999,999') AS "D5의 총 월급 " FROM EMPLOYEE
WHERE DEPT_CODE = 'D5';

✅ AVG

  • 테이블의 특정컬럼에 대한 평균
  • AVG(컬럼(NUMBEER)))
// 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

  • 테이블의 데이터수(ROW수) 출력
  • COUNT(* 혹은 컬럼)
  • *일 경우에는 전체 포함하며 (null 값도 포함함)
  • 컬럼으로 할 경우 널값들을 제외함
// D5부서에서 보너스를 받고 있는 사원의 수
SELECT COUNT(*) FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' AND BONUS IS NOT NULL;

✅ MIN, MAX

  • 테이블의 특정 컬럼에 대한 최소값 -> MIN(컬럼명)
  • 테이블의 특정 컬럼에 대한 최대값 -> MAX(컬럼명)
  • 문자열의 경우 우선순위 값으로 최소,최대 나눠짐
SELECT MAX(SALARY), MIN(SALARY) FROM EMPLOYEE;  // 연봉의 최소값과 최대값 각각 출력

✅ GROUP BY

  • 그룹함수를 사용했을 때 특정 기준으로 컬럼값을 묶어서 처리하는 것
  • 묶인 그룹별 그룹함수의 결과가 출력
  • GROUP BY 절 사용시 SELECT 절에 지정된 기준 열을 지정
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 컬럼명]

  • 동작순서
    • 테이블에서 WHERE 조건식에 맞는 데이터 값만 구분
    • 지정한 열 기준으로 같은 데이터 값으로 그룹화
    • 지정한 열들의 그룹화된 집계 결과 출력
// 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

  • WHERE 절에서는 그룹 함수(sum,count,max 등) 을 사용할 수 없음
  • 그룹화된 집계 결과에 조건식을 적용할 때 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 : 그룹화 된 집계연산에 대해서 조건식을 적용

profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글