나의 개발일지

[SQL] GROUP BY, 그룹 결과 정렬, HAVING 절 본문

Oracle SQL

[SQL] GROUP BY, 그룹 결과 정렬, HAVING 절

YoonJuHan 2023. 4. 16. 13:11

서브 그룹에 대한 집계결과 산출

  1. 그룹 함수를 사용하는 쿼리문에 GROUP BY 절을 추가
    1. 선택된 행을 서브 그룹으로 나눈 후 그룹 함수를 사용하여 각 서브 그룹에 대한 집계정보를 산출
    2. GROUP BY 절에는 서브 그룹의 기준 열의 이름을 명시
  2. 구문
SELECT column, group_function(column), ...
FROM table
[WHERE 조건(s)]
GROUP BY group_by_표현식
ORDER BY column;

GROUP BY 절의 기본적인 사용법

  1. FROM 절 다음에 GROUP BY 절을 명시
  2. 서브 그룹 생성 전에 제외할 행이 있다면 GROUP BY 절보다 앞 WHERE 절에 지정
  3. GROUP BY 절에 지정되는 열 이름만 SELECT 절에 지정 가능

여러 열 기준의 서브 그룹

  1. 그룹 내 그룹에 대한 결과를 확인해야 할 경우
    1. 예) 각 부서 내에서 업무별로 지급되는 급여 총액을 표시
  2. GROUP BY 절에 하나 이상의 열을 나열하여 최하위 서브 그룹에 대한 요약 결과를 반환
  3. GROUP BY 절에 지정하는 열의 순서에 따라 상이한 결과 반환
    1. 예) 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 절의 사용

  1. 그룹화된 결과를 제한하기 위해 HAVING 절 사용
    1. 예) 부서별 총 급여를 구한 후 총 급여가 3000이상인 부서만 표시
    2. WHERE 절 : 선택할 행을 제한
    3. HAVING 절 : GROUP BY 절과 함께 사용하여 그룹을 제한
  2. 구문
SELECT column, group_function(column), ...
FROM table
[WHERE 조건(s)]
GROUP BY group_by_표현식
HAVING group_조건
ORDER BY column;

그룹 함수의 중첩

  1. 그룹 함수끼리의 중첩은 두 번까지만 가능
  2. 그룹 함수가 중첩되어 사용되는 경우에 SELECT 절에 다른 열의 이름을 사용 불가
  3. 예) 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