Notice
Recent Posts
Recent Comments
Link
나의 개발일지
[SQL] GROUP BY, 그룹 결과 정렬, HAVING 절 본문
서브 그룹에 대한 집계결과 산출
- 그룹 함수를 사용하는 쿼리문에 GROUP BY 절을 추가
- 선택된 행을 서브 그룹으로 나눈 후 그룹 함수를 사용하여 각 서브 그룹에 대한 집계정보를 산출
- GROUP BY 절에는 서브 그룹의 기준 열의 이름을 명시
- 구문
SELECT column, group_function(column), ...
FROM table
[WHERE 조건(s)]
GROUP BY group_by_표현식
ORDER BY column;
GROUP BY 절의 기본적인 사용법
- FROM 절 다음에 GROUP BY 절을 명시
- 서브 그룹 생성 전에 제외할 행이 있다면 GROUP BY 절보다 앞 WHERE 절에 지정
- GROUP BY 절에 지정되는 열 이름만 SELECT 절에 지정 가능
여러 열 기준의 서브 그룹
- 그룹 내 그룹에 대한 결과를 확인해야 할 경우
- 예) 각 부서 내에서 업무별로 지급되는 급여 총액을 표시
- GROUP BY 절에 하나 이상의 열을 나열하여 최하위 서브 그룹에 대한 요약 결과를 반환
- GROUP BY 절에 지정하는 열의 순서에 따라 상이한 결과 반환
- 예) GROUP BY dept_id, position, GROUP BY position, dept_id
- 각 부서별 급여의 총합과 평균을 표시
SELECT dept_id, SUM(salary), AVG(salary)
FROM y_emp
GROUP BY dept_id;
- 각 부서별 직급별 평균 급여를 부서 번호 순으로 오름차순 정렬
SELECT dept_id, position, AVG(salary)
FROM y_emp
GROUP BY dept_id, position
ORDER BY dept_id;
HAVING 절의 사용
- 그룹화된 결과를 제한하기 위해 HAVING 절 사용
- 예) 부서별 총 급여를 구한 후 총 급여가 3000이상인 부서만 표시
- WHERE 절 : 선택할 행을 제한
- HAVING 절 : GROUP BY 절과 함께 사용하여 그룹을 제한
- 구문
SELECT column, group_function(column), ...
FROM table
[WHERE 조건(s)]
GROUP BY group_by_표현식
HAVING group_조건
ORDER BY column;
그룹 함수의 중첩
- 그룹 함수끼리의 중첩은 두 번까지만 가능
- 그룹 함수가 중첩되어 사용되는 경우에 SELECT 절에 다른 열의 이름을 사용 불가
- 예) SELECT dept_id, MAX(AVG(salary)) FROM y_emp GROUP BY dept_id; ❌
- 평균 급여가 600이 넘는 부서들의 최고와 최저 급여를 표시
SELECT dept_id, MAX(salary), MIN(salary)
FROM y_emp
GROUP BY dept_id
HAVING AVG(salary) > 600;
- 사원이 가장 많은 부서와 가장 적은 부서의 인원수를 표시
SELECT MAX(COUNT(*)), MIN(COUNT(*))
FROM y_emp
GROUP BY dept_id;
'Oracle SQL' 카테고리의 다른 글
[SQL] JOIN (0) | 2023.04.18 |
---|---|
[SQL] GROUP BY 절의 추가 기능 (ROLLUP, CUBE, GROUPING SETS) (0) | 2023.04.16 |
[SQL] 그룹 함수 (0) | 2023.04.16 |
[SQL] 조건 표현식 (0) | 2023.04.14 |
[SQL] 일반 함수 (0) | 2023.04.14 |
Comments