DATABASE
[오라클] 그룹함수(SUM(), AVG(), COUNT(), MAX(), MIN(), VERIENCE(), STDDEV())
온풀
2022. 3. 11. 23:41
20220223_01_scott.sql / 오라클 7일 차
- 그룹함수
SUM() 합, AVG() 평균, COUNT() 카운트, MAX() 최대값, MIN() 최솟값, VERIENCE() 분산, STDDEV() 표준편차
- 그룹함수의 가장 큰 특징
처리해야 할 데이터들 중 NULL 이 존재한다면(포함되어 있다면) 이 NULL 은 제외한 상태로 연산을 수행한다는 것이다. 즉, 그룹 함수가 작동하는 과정에서 NULL 은 연산의 대상에서 제외된다.
--○ SUM() 합
-- EMP 테이블을 대상으로 전체 사원들의 급여 총합을 조회한다.
SELECT SAL
FROM EMP;
--==>>
/*
800
1600
1250
2975
1250
2850
2450
3000
5000
1500
1100
950
3000
1300
*/
SELECT SUM(SAL)
FROM EMP;
--==>> 29025
SELECT ENAME, SUM(SAL)
FROM EMP;
--==>> 에러 발생
-- (ORA-00937: not a single-group group function)
SELECT SUM(SAL) -- 800 + 1600 + 1250 + ... + 1300
FROM EMP;
--==>> 29025
SELECT COMM
FROM EMP;
--==>>
/*
(null)
300
500
(null)
1400
(null)
(null)
(null)
(null)
0
(null)
(null)
(null)
(null)
*/
SELECT SUM(COMM) -- (null) + 300 + 500 + ... + (null)
FROM EMP;
--==>> 2200
--○ COUNT() 행(레코드)의 갯수 조회 → 데이터가 몇 건인지 확인...
SELECT COUNT(ENAME)
FROM EMP;
--==>> 14
SELECT COUNT(COMM) -- COMM 컬럼 행의 갯수 조회 → NULL은 제외~!!!
FROM EMP;
--==>> 4
SELECT COUNT(*)
FROM EMP;
--==>> 14
-- 일반적으로는 행의 갯수를 쓰게 되기 때문에 보통 이렇게 사용
--○ AVG() 평균 반환
SELECT SUM(SAL) / COUNT(SAL) "RESULT1" -- 2073.214285714285714285714285714285714286
, AVG(SAL) "RESULT2" -- 2073.214285714285714285714285714285714286
FROM EMP;
SELECT SUM(COMM) / COUNT(COMM) "RESULT1" -- 550
, AVG(COMM) "RESULT2" -- 550
FROM EMP;
-- 제대로 된 값 아님 원랜 14로 나눠야지
SELECT SUM(COMM) / COUNT(*) "RESULT"
FROM EMP;
--==>> 157.142857142857142857142857142857142857
--※ 데이터가 NULL인 컬럼의 레코드는 연산 대상에서 제외되기 때문에
-- 주의하여 연산 처리해야 한다.
--○ VARIANCE(), STDDEV()
-- ※ 표준편차의 제곱이 분산, 분산의 제곱근이 표준편차
SELECT VARIANCE(SAL), STDDEV(SAL)
FROM EMP;
--==>> 1398313.87362637362637362637362637362637
-- 1182.503223516271699458653359613061928508
SELECT POWER(STDDEV(SAL), 2) "RESULT1"
, VARIANCE(SAL) "RESULT2"
FROM EMP;
--==>> 1398313.87362637362637362637362637362637
-- 1398313.87362637362637362637362637362637
SELECT SQRT(VARIANCE(SAL)) "RESULT1"
, STDDEV(SAL) "RESULT2"
FROM EMP;
--==>> 1182.503223516271699458653359613061928508
-- 1182.503223516271699458653359613061928508
--○ MAX() / MIN()
-- 최대값 / 최소값
SELECT MAX(SAL) "RESULT1"
, MIN(SAL) "RESULT2"
FROM EMP;
--==>> 5000 800
--※ 주의
SELECT ENAME, SUM(SAL)
FROM EMP;
--==>> 에러 발생
-- (ORA-00937: not a single-group group function)
SELECT DEPTNO, SUM(SAL)
FROM EMP;
--==>> 에러 발생
-- (ORA-00937: not a single-group group function)
SELECT DEPTNO, SUM(SAL) -- 묶은 거에서 얘가 진행돼서 에러 안 남
FROM EMP
GROUP BY DEPTNO; -- 묶음처리가 먼저 진행
--==>>
/*
30 9400
20 10875
10 8750
*/
SELECT DEPTNO, SAL
FROM EMP
ORDER BY 1;
--==>>
/*
10 2450 ┐
10 5000 │8750
10 1300 ┘
20 2975 ┐
20 3000 │
20 1100 │10875
20 800 │
20 3000 ┘
30 1250 ┐
30 1500 │
30 1600 │9400
30 950 │
30 2850 │
30 1250 ┘
*/
SELECT DEPTNO, SUM(SAL)
FROM EMP
GROUP BY DEPTNO
ORDER BY 1;
--==>>
/*
10 8750
20 10875
30 9400
*/