오라클SQL 그룹함수
Updated:
그룹 함수
그룹 함수 종류
GROUP BY 절 사용하기
HAVING절 사용하기
그룹함수란?
그룹 함수들은 집계 함수(Aggregate Function)이라고 한다. 집계란 하나 이상의 데이터들을 대상으로 일종의 통계정보 (전체 개수, 평균, 최댓값, 최솟값)을 말하며 집계 함수 역시 이러한 기능을 수행하는 함수들을 말한다.
단일행 함수는 행 별로 하나씩 값이 나오지만, 그룹 함수는 전체 집합 또는 그룹으로 분류된 집합에 작용하여 그룹당 하나의 결과를 생성한다.
그룹함수 종류
그룹 함수 | 사용 목적 |
---|---|
COUNT(*) | NULL 값을 포함한 행의 수 출력 |
COUNT(표현식) | 표현식의 값이 NULL 값이 것을 제외한 행의 수 출력 |
SUM([DISTINCT|ALL] 표현식) | 표현식의 NULL 값을 제외한 합계 출력 |
AVG([DISTINCT|ALL] 표현식) | 표현식의 NULL 값을 제외한 평균 출력 |
MAX([DISTINCT|ALL] 표현식) | 표현식의 NULL 값을 제외한 최대값 출력(문자, 날짜 데이터 타입 사용 가능) |
MIN([DISTINCT|ALL] 표현식) | 표현식의 NULL 값을 제외한 최소값 출력(문자, 날짜 데이터 타입 사용가능) |
STDDEV([DISTINCT|ALL] 표현식) | 표현식의 NULL 값을 제외한 표준편차 출력 |
VARIANCE([DISTINCT|ALL] 표현식) | 표현식의 NULL 값을 제외한 분산 출력 |
ALL은 기본값(Default)이기 때문에 별도로 사용할 필요가 없다. 또한 COUNT(*)를 제외한 모든 그룹함수는 NULL값을 제외하고 처리한다.
-- DISTINCT 결과 비교해보기 SELECT count(*) 결과1, count(player_name) 결과2, count(height) 결과3, count(position) 결과4 FROM player; SELECT count(team_id) 결과1, count(DISTINCT team_id) 결과2 FROM player; SELECT AVG(weight) 결과1, AVG(NVL(Weight, 0)) 결과2 FROM player;
GROUP BY 절
테이블의 행을 더 작은 그룹으로 나눠서 계산 하려 한다. WHERE 조건이 먼저 처리된 후 GROUP BY 및 집계 함수가 처리된다. GROUP BY절을 이용하면 SELECT 절에는 GROUP BY에 사용된 속성만 올 수 있다. ORDER BY 절도 붙일 수 있다.
--EMP 테이블 부서별로 소속인원수, 평균 급여, 최저 급여, 최고 급여, 급여 합계 조회 SELECT deptno, COUNT(*), TRUNC(AVG(sal), 1), MIN(sal), MAX(sal), SUM(sal) FROM emp GROUP BY deptno; --업무별로 부서번호, 업무, 인원수, 급여의 평균, 급여의 합 조회 SELECT job, COUNT(*), TRUNC(AVG(sal)), SUM(sal) FROM emp GROUP BY job; --업무와 부서기준으로 분류하여 부서번호, 업무, 인원 수, 급여의 평균, 급여의 합 조회 SELECT job, deptno, COUNT(*), AVG(sal), SUM(sal) FROM emp GROUP BY job, deptno; --Position이 DF인 선수들이 각 팀에 몇 명씩 있는지 인원 조회 SELECT team_id, COUNT(*) FROM player WHERE position="DF" GROUP BY team_id ORDER BY COUNT(*) DESC;
HAVING 절
HAVING 절은 GROUP BY절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건을 표시할 수 있다.
WHERE 절은 Aggregation 이전, HAVING 절은 Aggregation 이후의 filtering 작업을 수행한다.
-- 소속 선수가 47명보다 많은 팀에 대해서 팀id, 인원, 평균몸무게 조회 SELECT team_id, COUNT(*), AVG(weight) FROM player GROUP BY team_id HAVING COUNT(*) > 47; --평균 몸무게가 73보다 많은 팀에 대해 팀id, 평균 몸무게를 소수 2자리까지 반올림해서 조회 SELECT team_id, ROUND(AVG(weight), 2) FROM player GROUP BY team_id HAVING AVG(weight) > 73;
Comments