본문 바로가기
IT정보

오라클 GROUP BY, HAVING, 그룹함수

by 디노프랭키 2023. 4. 26.
728x90

오라클 GROUP BY, HAVING은 무엇인지 또 이와 같이 사용하는 그룹함수는 무엇인지 알아보겠습니다.

오라클 GROUP BY, HAVING, 그룹함수

GROUP BY

GROUP BY 함수는 SELECT 쿼리와 함께 사용이 되며 쿼리 결과를 그룹화하는 데 사용이 됩니다. 특정 열의 값을 분할하거나 합칠 수 있으며 그룹함수를 사용할 때도 함께 사용됩니다. 쿼리 순서는 ORDER BY보다 먼저 사용이 되어야 합니다. 때에 따라 DISTCINT와 비슷한 결과를 나타냅니다. DISTINCT는 특정 열의 중복된 값을 제거한 결과 값을 반환합니다. GROUP BY역시 묶이는 열의 컬럼은 중복이 생략 됩니다. 다음은 GROUP BY 함수의 구문은 다음과 같습니다. GROUP BY 역시 WHERE절, ORDER BY절처럼 옵션으로 생략이 가능합니다.

SELECT 컬럼 FROM 테이블명 WHERE 조건절 GROUP BY 그룹화할 컬럼 ORDER BY 정렬할 컬럼;

다음은 GROUP BY를 사용하는 예제입니다.

테이블명 : TBL_SALS
SALS_NO  USER_CD    SALS_COST
------------------------------------
  1         AA       200,000
  2         AA       300,000
  3         BB       100,000
  4         CC       100,000

-- 사용자별 실적을 합산한 GROUP BY 예제 입니다.
SELECT USER_CD, SUM(SALS_COST) AS SALS_COST
  FROM TBL_SAL
 GROUP BY USER_CD;
 
USER_CD    SALS_COST
------------------------------------
 AA       500,000
 BB       100,000
 CC       100,000
 
 -- WHERE조건을 적용한 예제입니다.
SELECT USER_CD, SUM(SALS_COST) AS SALS_COST
  FROM TBL_SAL
 WHERE USER_CD = 'AA'
 GROUP BY USER_CD;
 
USER_CD    SALS_COST
------------------------------------
 AA       500,000
 
 -- ORDER BY 조건을 적용한 예제입니다.
SELECT USER_CD, SUM(SALS_COST) AS SALS_COST
  FROM TBL_SAL
 GROUP BY USER_CD
 ORDER BY USER_CD DESC;
 
USER_CD    SALS_COST
------------------------------------
 CC       100,000
 BB       100,000
 AA       500,000

HAVING

HAVING은 GROUP BY절과 함께 사용하는 조건제어 구문입니다. 그룹화한 대상에 조건으로 데이터를 제어할 수 있습니다. 다음은 HAVING절의 구문입니다.

SELECT 컬럼 FROM 테이블명 WHERE 조건절 GROUP BY 그룹화할 컬럼 HAVING 그룹조건절 ORDER BY 정렬할 컬럼;

HAVING절의 예제를 보여드리겠습니다.

테이블명 : TBL_ACCESS_LOG
SALS_NO  USER_CD     LOGIN_DT
------------------------------------
  1         AA       20221211
  2         AA       20221212
  3         BB       20230102
  4         CC       20230310
  
 -- 2023년 사용자별로 가장 마지막 접속 이력을 보여주는 예제입니다.
 SELECT USER_CD, MAX(LOGIN_DT) LOGIN_DT
   FROM TBL_ACCESS_LOG 
   GROUP BY USER_CD
  HAVING LOGIN_DT LIKE '2023%';

보시는 바와 같이 WHERE절도 조건을 지정해서 데이터를 제어하고 HAVING절도 동일하게 사용하는 것 같은데 두개의 차이점이 뭘까요? 그리고 언제 이걸 적절하게 사용할 수 있을까요? 제일 큰 차이점은 시점 입니다. WHERE절은 GROUP BY로 그룹핑을 하기 전에 먼저 대상에서 제외하게 됩니다. 즉, 대상 자체를 먼저 줄인 다음 그룹핑을 하게 됩니다. 그에 반해 HAVING절은 대상은 그대로 두고 그룹핑을 먼저 하고 난뒤에 조건에 부합하는 대상을 찾아옵니다.

그룹함수

GROUP BY와 더불어 사용할 수 있는 그룹함수는 MIN, MAX, COUNT, SUM, AVG가 있습니다. 이 그룹 함수를 사용하면 GROUP BY절에 컬럼명이 들어가지 않아도 그룹화가 됩니다. MIN함수는 열의 최소값을 나타냅니다. MAX함수는 열의 최대값을 나타냅니다. COUNT는 건수를 나타냅니다. SUM은 열의 합계를 나타냅니다. AVG는 열의 평균값을 나타냅니다.예제로 그룹함수를 살펴보겠습니다.

테이블명 : TBL_SALS
SALS_NO  USER_CD    SALS_COST
------------------------------------
  1         AA       200,000
  2         AA       300,000
  3         BB       100,000
  4         CC       100,000
  
SELECT MAX(SALS_COST) C_MAX, MIN(SALS_COST) C_MIN, AVG(SALS_COST) C_AVG
     , COUNT(SALS_COST) C_CNT, SUM(SALS_COST) C_SUM
  FROM TBL_SALS;

-- 결과
C_MAX       C_MIN      C_AVG    C_CNT    C_SUM
------------------------------------------------
300,000   100,000    175,000     4      700,000

지금까지 GROUP BY, HAVING, 그룹함수(MAX, MIN, AVG, COUNT, SUM)에 대해 알아 봤습니다. 유익한 정보 되셨길 바랍니다.

728x90

댓글