GROUP BY 문
- GROUP BY 는 테이블에서 소규모 행을 그룹화하여 합계, 평균, 최댓값, 최솟값 등을 계산할 수 있다.
- HAVING 구에 조건문을 사용한다.
- Grouping 된 결과에 대해 조건문을 사용한다.
- ORDER BY 를 사용해서 정렬을 할 수 있다.
(1)
DEPTNO | SAL |
---|
10 | 2450 |
10 | 1300 |
20 | 3000 |
20 | 1100 |
20 | 800 |
20 | 3000 |
20 | 2975 |
30 | 950 |
30 | 5000 |
30 | 1600 |
SELECT
(3) DEPTNO, SUM(SAL)
FROM EMP
(2) GROUP BY
DEPTNO;
(4)
DEPTNO | SUM(SAL) |
---|
30 | 14400 |
20 | 10875 |
10 | 3750 |
- 위의 GROUP BY 예에서 (1)번은 EMP 테이블을 그대로 조회한 것이다.
즉, 'SELECT DEPTNO, SAL FROM EMP' 를 실행한 것이다.
- (2) 번은 DEPTNO(부서번호)로 그룹을 만들고, (3)번은 그룹별 합계를 계산하라는 뜻이다.
- (4) 번은 부서별 합계를 계산하게 된다.
HAVING 사용
- GROUP BY 에 조건절을 사용하려면 HAVING 을 사용해야 한다.
만약 WHERE 절에 조건을 사용하게 되면 조건을 충족하지 못하는 데이터들은 GROUP BY 대상에서 제외된다.
SELECT
DEPTNO, SUM(SAL)
FROM EMP
GROUP BY
DEPTNO
HAVING
SUM(SAL) > 10000; -- GROUP BY 결과에서 급여합계가 10000 이상만 조회한다.
DEPTNO | SUM(SAL) |
---|
30 | 14400 |
20 | 10875 |
집계 함수 종류
집계 함수 | 설명 |
---|
COUNT() | 행 수를 조회한다. |
SUM() | 합계를 계산한다. |
AVG() | 평균을 계산한다. |
MAX() 와 MIN() | 최댓값과 최솟값을 계산한다. |
STDDEV() | 표준편차를 계산한다. |
VARIANCE() | 분산을 계산한다. |
COUNT 함수
- COUNT() 함수는 행 수를 계산하는 함수이다.
COUNT(*) 는 NULL 값을 포함한 모든 행 수를 계산한다.
하지만 COUNT(컬럼명)는 NULL 값을 제외한 행 수를 계산한다.
SELECT
COUNT(*) -- NULL 을 포함한 전체 행 수를 계산한다.
FROM EMP;
- MGR 컬럼은 한 개의 NULL 을 가지고 있다.
그래서 COUNT(MGR)로 하면 NULL 이 제외되고 행 수를 계산한다.
SELECT
COUNT(MGR) -- NULL 을 제외한 전체 행 수를 계산한다.
FROM EMP;
GROUP BY 사용 예제
1. 부서별(DEPTNO), 관리자별(MGR) 급여평균 계산
- 부서별, 관리자별 급여평균이므로 GROUP BY에 부서와 관리자를 추가한다.
- 평균을 계산하기 위해서 SELECT 문에 AVG 함수를 사용해야 한다.
SELECT
DEPTNO, MGR, AVG(SAL) -- AVG(SAL) : 급여평균을 계산한다.
FROM EMP
GROUP BY
DEPTNO, MGR; -- 부서별, 관리자별 소그룹을 만든다.
DEPTNO | MGR | AVG(SAL) |
---|
10 | 1000 | 1300 |
20 | | 800 |
20 | 1000 | 2987.5 |
30 | 1006 | 5000 |
2. 직업별(JOB) 급여합계 중에 급여(SAL)합계가 1000 이상인 직업
- 직업별 급여합계이므로 GROUP BY 에 JOB 을 포함시키고 급여합계가 1000 이상만 조회해야 하므로 HAVING 구에 조건을 넣어햐 한다.
SELECT
JOB, SUM(SAL)
FROM EMP
GROUP BY
JOB
HAVING
SUM(SAL) >= 1000; -- 직업별 그룹합계 중에서 급여가 1000 이상인 직업을 조회한다.
3. 사원번호 1000 ~ 1003 번의 부서별 급여합계
- 사원번호 1000 번에서 1003 번까지 조회를 해야 하므로 WHERE 문에 조건을 넣어야 한다.
- 그리고 부서별 합계이므로 GROUP BY 에 DEPTNO 를 사용하고 SELECT 문에 SUM 함수를 사용한다.
SELECT
DEPTNO, SUM(SAL)
FROM EMP
WHERE
EMPNO BETWEEN 1000 AND 1003
GROUP BY
DEPTNO;
DEPTNO | SUM(SAL) |
---|
30 | 2850 |
20 | 3775 |