[ORACLE] 그룹함수

sleeee·2023년 5월 7일
0

SQL

목록 보기
5/19

그룹함수(복수행 함수)

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

그룹함수 종류

  • COUNT(컬럼명)
    : NULL값을 포함하지 않은 전체 행의 갯수 출력

  • COUNT(*)
    : NULL값을 포함한 전체 행의 갯수 출력

  • 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에 있는 모든 행의 갯수로 나눠서 정확한 평균값을 구할 수 있다.

  • MIN(컬럼명),MAX(컬럼명)
    : 최소,최대값
    => 소요시간이 길어서 사용에 주의. 인덱스 함수를 활용하여 사용하는 것 추천

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)
--처음에 이렇게 써서 에러났음
--WHY? 부서번호를 출력하는게 아니라서!
--SELECT는 출력하는 컬럼만!!!
  • Q2. 사원들의 부서별 평균급여를 구하시오. 단 급여평균이 3000이상인 부서만 출력되도록 하세요.
SELECT DEPTNO,AVG(SAL) 평균급여
FROM EMP
WHERE AVG(SAL)>=3000
GROUP BY DEPTNO;

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

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

    DEPTNO       평균급여
---------- ----------
        42       3200
        60       3500
profile
개인 공부 기록 👩‍💻

0개의 댓글