[Oracle] SQL 그룹함수

q.esmeray·2024년 5월 21일
0

ORACLE DB

목록 보기
4/5

그룹함수란?

여러개의 행당 하나의 결과값을 반환하는 함수


그룹함수의 종류

구분설명
COUNTNULL값을 포함하지 않은 전체 행의 갯수 출력
COUNT(*)NULL값을 포함한 전체 행의 갯수 출력
SUM해당 컬럼의 총합
AVG해당 컬럼의 평균
MIN최소값
MAX최대값

» SUM

행이 1개 나옴

SELECT EMPNO, SUM(SAL) FROM EMP;

EMPNO의 행은 12개, SUM(SAL)의 행은 1개 나와서 행의 개수가 맞지 않음

» AVG

SELECT AVG(COMM) FROM EMP;

AVG함수는 해당 컬럼에 NULL값이 있으면 그 행은 포함하지 않고 계산하기 때문에, 정확한 평균값이 나오지 않을수도 있다.
그러므로 NULL값을 임의로 0으로 치환하여 모든 행을 포함해서 계산하도록 해야한다. 이때 쓰는 함수가 NVL

SELECT AVG(NVL(COMM,0)) FROM EMP;

이렇게 하면 COMM에 있는 NULL값을 모두 0으로 치환하므로 COMM에 있는 모든 행의 갯수로 나눠서 정확한 평균값을 구할 수 있다.


GROUP BY 절

GROUP BY (컬럼명)
: 해당 컬럼값을 기준으로 먼저 모은 뒤 SELECT절에 적혀있는 그룹함수를 적용

예제

  • Q1. 부서번호가 10번인 사원들의 직업별 급여의 평균을 구하고 평균급여가 높은 순으로 조회하세요.
SELECT JOB,AVG(SAL)
FROM EMP
WHERE DEPTNO=10
GROUP BY JOB
ORDER BY AVG(SAL) DESC;

JOB         AVG(SAL)
--------- ----------
PRESIDENT       5000
MANAGER         2450
CLERK           1300

--SELECT DEPTNO,JOB,AVG(SAL)
--부서번호를 출력하는게 아니기 때문에 에러발생
--출력하는 컬럼만 SELECT 사용
  • Q2. 사원들의 부서별 평균급여를 구하시오. 단 급여평균이 3000이상인 부서만 출력하세요.
SELECT DEPTNO,AVG(SAL) 평균급여
FROM EMP
WHERE AVG(SAL)>=3000
GROUP BY DEPTNO;

--WHERE절에는 그룹함수를 사용할 수 없음 
--AVG가 그룹함수라서 오류 발생
--=>HAVING 절을 사용하면 됨

SELECT DEPTNO,AVG(SAL) 평균급여
FROM EMP
HAVING AVG(SAL)>=3000
GROUP BY DEPTNO;

    DEPTNO       평균급여
---------- ----------
        42       3200
        60       3500

HAVING 절

'HAVING' 절은 SQL에서 그룹화된 결과의 조건을 필터링하는 데 사용된다. 주로 'GROUP BY' 절과 함께 사용되며, 집계 함수('COUNT', 'SUM', 'AVG' 등)를 포함한 조건을 기반으로 결과를 필터링할 때 필요하다.

  • WHERE 절과의 차이
    'WHERE' 절은 그룹화하기 전의 개별 데이터 레코드를 필터링하는 반면, 'HAVING' 절은 그룹화한 후의 결과를 필터링한다는 것

예제

  • Q1. 평균 급여가 50,000 초과인 부서만 출력하세요.
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
--'HAVING' 절이 없다면, 모든 부서의 평균 급여가 조회됨

0개의 댓글