개발 창고/Database

[SQL] GROUP BY란? - 함수편

로이제로 2020. 9. 28. 13:14
반응형

 지난 시간에는 SQL의 데이터 조작 언어(DML) 중에서 GROUP BY에 대해 알아보았습니다. 오늘은 이 GROUP BY를 사용하는 이유 중의 하나인 GROUP BY를 했을 때만 사용 가능한 함수에 대해 알아볼까 합니다.

 

2020/09/23 - [개발 창고/데이터베이스 개발] - [SQL] GROUP BY란? - 기본편

 

[SQL] GROUP BY란? - 기본편

 이전 시간에는 SQL의 데이터 조작 언어(DML) 중에서 SELECT의 기본적인 사용법과 결합(JOIN)과 별칭 등에 대해서 다뤄보았습니다.  이번 시간에는 SELECT의 조건절인 WHERE문 다음에 오는 GROUP BY에 대해

royzero.tistory.com

 지난 시간처럼 활용 예를 먼저 들어보면, 참고로 그룹 함수는 DBMS별로 가능/불가능한 함수가 있으니 이점 유의하여 주시길 바랍니다.

 

  1. 멜론 차트를 뽑고 싶습니다. (→ 음원별 스트리밍 횟수 내림차순)
  2. 판매된 상품 중 베스트 상품을 알고 싶습니다. (→ 상품별 주문 수량 내림차순)
  3. 자유게시판 게시글 목록에 코멘트 개수랑 같이 보여주세요. (→ 게시글 별 코멘트 개수)
  4. 지역별 부동산 매물 수를 알고 싶습니다. (→ 지역별 매물의 개수)

 

 이전 글을 보신 분이라면 아실 수 있겠지만, 각각의 해석 부분의 글자 굵기가 "oo별"에서 수량 쪽으로 변경되었음을 아실 수 있을 겁니다. 이처럼, 그룹 함수는 각 그룹을 했을 때만 도출 가능한 값들에 대해 함수를 제공하는 것입니다.

 

"GROUP BY 되었을 때만 도출 가능한 값"

 

 먼저 그룹 함수의 종류에 대해 알아보면,

 

함수 내용 DBMS
COUNT 그룹핑 된 ROW수 Oracle, MySQL, SQLServer, SQLite
MAX 그룹핑 된 값들 중 가장 높은 COLUMN값 (NULL 제외) Oracle, MySQL, SQLServer, SQLite
MIN 그룹핑 된 값들 중 가장 낮은 COLUMN값 (NULL 제외) Oracle, MySQL, SQLServer, SQLite
SUM 그룹핑 된 값들의 합 (NULL 제외) Oracle, MySQL, SQLServer, SQLite
AVG 그룹핑 된 값들의 평균값 (NULL 제외) Oracle, MySQL, SQLServer, SQLite
STDDEV 그룹핑 된 값들의 표준편차 (NULL 제외) Oracle, MySQL

 

일단 오늘의 예시 테이블은 다음과 같습니다. (일관성을 위해 지난 글의 게시글 테이블을 활용할 예정입니다.)

 

  TB_BOARD

 

  TB_BOARD_COMMENT

 


 먼저 이전의 결과를 기준으로 그룹핑을 하면 다음과 같습니다.

 

3. 자유게시판 게시글 목록에 코멘트 개수랑 같이 보여주세요. (→ 게시글별 코멘트 개수)

 

SELECT T1.BBS_SEQ, T1.BBS_TITLE, T1.BBS_CONT, T1.CREATE_DTM, T1.BBS_TYPE_CODE
     , COUNT(T2.CMNT_SEQ)	as CMNT_CNT
  FROM TB_BOARD as T1
  LEFT OUTER JOIN TB_BOARD_COMMENT as T2 
    ON T1.BBS_SEQ = T2.BBS_SEQ
 GROUP BY T1.BBS_SEQ, T1.BBS_TITLE, T1.BBS_CONT

 

 

 

 

 COUNT(*)는 NULL을 포함하지만, COUNT(컬럼명)은 해당 컬럼에 NULL값은 제외하고 COUNTING 해주기 때문에, 3번 라인의 결과가 0으로 나오게 됩니다.

 

 확장해서 위의 함수를 다 사용해보면 다음과 같은 결과가 나옵니다.

 

SELECT T1.BBS_SEQ, T1.BBS_TITLE, T1.BBS_CONT, T1.CREATE_DTM, T1.BBS_TYPE_CODE
     , COUNT(T2.CMNT_SEQ)	as CMNT_CNT
     , MAX(T2.CMNT_SEQ)		as MAX_SEQ
     , MIN(T2.CMNT_SEQ)		as MIN_SEQ
     , SUM(T2.CMNT_SEQ)		as SUM_SEQ
     , STDDEV(T2.CMNT_SEQ)  as STDDEV_SEQ
  FROM TB_BOARD as T1
  LEFT OUTER JOIN TB_BOARD_COMMENT as T2 
    ON T1.BBS_SEQ = T2.BBS_SEQ
 GROUP BY T1.BBS_SEQ, T1.BBS_TITLE, T1.BBS_CONT

 

 

반응형