본문 바로가기

BackEnd/DataBase - Oracle

[Oracle] 그룹으로 묶는 GROUP BY절과 HAVING절

GROUP BY

  • 보통 검색 된 여러 행을 이용하여 통계 정보를 계산하는데 쓰임
  • NULL 값은 무시하고 연산
  • GROUP BY절에 명시 된 컬럼은 SELECT절에 기술해주는 것이 올바른 형태
    (없다면 어디서 그룹화한건지, 제목이 없으니 없는 것이나 마찬가지)

 

기본 문법

 

SELECT 컬럼, 그룹함수(컬럼)
FROM 테이블
[WHERE 조건]
GROUP BY 그룹대상
[ORDER BY 정렬대상 [ASC/DESC]]

 

컬럼이 오고 그룹 함수가 SELECT절에 있으나 GROUP BY절에 컬럼이 없으면 에러가 발생한다

 

 

숫자 데이터 입력 받는 함수

AVG ( [DISTINCT | ALL] n ) - 평균
STDDEV ( [DISTINCT | ALL] n ) (Standard Deviation) - 표준편차, 중심에서 관측치가 얼마나 떨어져 있는가?
SUM ( [DISTINCT | ALL] n ) - 합계
VARIANCE ( [DISTINCT | ALL] n ) (Variance) - 분산, 그 확률 변수가 기댓값으로 부터 얼마나 떨어진 곳에 분포하는가?

 

데이터 타입 상관없이 입력 받는 함수

COUNT ( * | [DISTINCT | ALL] expr ) - 갯수
MAX ( [DISTINCT | ALL] expr ) - 최대값
MIN ( [DISTINCT | ALL] expr ) - 최소값

 

 

예제1

GROUP BY department_id


같은 department_id의 값을 가진 사원들은 하나의 그룹을 묶는다

 


예제2

GROUP BY department_id, job_id


department_id와 job_id 컬럼의 값이 모두 일치하는 사원들을 하나의 그룹으로 묶는다

 

 


HAVING

  • WHERE절과 동일하지만 그룹 함수를 포함한 조건은 HAVING절을 사용한다
  • GROUP BY절 뒤에 기술한다
  • 그룹 함수를 포함해야 한다 (WHERE절 처럼 컬럼명으로만 조건식을 만들 수 없음)

 

기본 문법

 

SELECT 컬럼, 그룹함수(컬럼) 
FROM 테이블
[WHERE 조건] 
GROUP BY 그룹대상
HAVING 그룹함수포함조건
[ORDER BY 정렬대상 [ASC/DESC]] 



예제

HAVING MIN(salary) > 5000


그룹들 중 가장 작은 급여가 5000을 초과하는 그룹만 선택하여 출력한다

 

 

'BackEnd > DataBase - Oracle' 카테고리의 다른 글

[Oracle] 서브 쿼리(Sub Query)  (0) 2020.02.13
[Oracle] JOIN과 Self-Join  (0) 2020.02.13
[Oracle] 변환 함수  (0) 2020.02.12
[Oracle] 날짜 함수  (0) 2020.02.12
[Oracle] 숫자 함수  (0) 2020.02.12