
여러개의 행당 하나의 결과값을 반환하는 함수
| 구분 | 설명 |
|---|---|
| COUNT | NULL값을 포함하지 않은 전체 행의 갯수 출력 |
| COUNT(*) | NULL값을 포함한 전체 행의 갯수 출력 |
| SUM | 해당 컬럼의 총합 |
| AVG | 해당 컬럼의 평균 |
| MIN | 최소값 |
| MAX | 최대값 |
행이 1개 나옴
SELECT EMPNO, SUM(SAL) FROM EMP;
EMPNO의 행은 12개, SUM(SAL)의 행은 1개 나와서 행의 개수가 맞지 않음
SELECT AVG(COMM) FROM EMP;
AVG함수는 해당 컬럼에 NULL값이 있으면 그 행은 포함하지 않고 계산하기 때문에, 정확한 평균값이 나오지 않을수도 있다.
그러므로 NULL값을 임의로 0으로 치환하여 모든 행을 포함해서 계산하도록 해야한다. 이때 쓰는 함수가 NVL
SELECT AVG(NVL(COMM,0)) FROM EMP;
이렇게 하면 COMM에 있는 NULL값을 모두 0으로 치환하므로 COMM에 있는 모든 행의 갯수로 나눠서 정확한 평균값을 구할 수 있다.
GROUP BY (컬럼명)
: 해당 컬럼값을 기준으로 먼저 모은 뒤 SELECT절에 적혀있는 그룹함수를 적용
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 사용
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' 절은 SQL에서 그룹화된 결과의 조건을 필터링하는 데 사용된다. 주로 'GROUP BY' 절과 함께 사용되며, 집계 함수('COUNT', 'SUM', 'AVG' 등)를 포함한 조건을 기반으로 결과를 필터링할 때 필요하다.
- WHERE 절과의 차이
'WHERE' 절은 그룹화하기 전의 개별 데이터 레코드를 필터링하는 반면, 'HAVING' 절은 그룹화한 후의 결과를 필터링한다는 것
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
--'HAVING' 절이 없다면, 모든 부서의 평균 급여가 조회됨