본문 바로가기
웹 프로그래밍 기초/자바기반의 웹&앱 응용SW 개발자

자바기반의 웹&앱 응용 SW개발자 양성과정 33일차 -53

by oncerun 2020. 4. 17.
반응형

SQL의 GROUP BY

 

GROUP BY는 동일한 값을 가진 데이터를 (중복되는 데이터)를 집계하여 조회할 때 사용합니다.

여기서 집계란 이미 계산된 여러 계산들을 한데 모아서 계산하는 것 또는 그 계산을 뜻합니다.

따라서 GROUP BY는 중복된 데이터를 계산하거나 계산된 결과를 가지고 특정 속성을 기준으로 그룹화하여 사용한다고 할 수 있습니다.

 

기본구조

SELECT 컬럼, 그룹 함수

 

FROM 테이블명

 

WHERE 조건

 

GROUP BY 그룹대상

  • (1) SELECT 절에 그룹 함수와 칼럼명이 같이 기술된 경우에는 해당 칼럼은 반드시 GROUP BY 절에 그룹화되어야 합니다

  • 결과 값이 정렬되기를 원한다면 ORDER BY 절을 추가하면 됩니다.

(1)에 이유에 대해서 알아보겠습니다.

GROUP BY 절은 그룹 함수와 반드시 함께 쓰이는데 그룹 함수의 결괏값은 GROUP BY절에 기술된 칼럼의 항목들의 행의 개수에 의해 결정됩니다.

GROUP BY절의 의미는 그룹 함수를 GROUP BY절에 지정된 칼럼의 값이 같은 행에 대해서 통계 정보를 계산하라는 의미이다.

이해를 위해 예시를 한번 들어보겠습니다. 

회원의 성별의 평균 나이를 구해본다고 하겠습니다.

먼저 우리는 집계 함수인 AVG를 사용해 회원의 나이에 평균을 구하게 됩니다.

여기서 한번 결과를 상상해봅니다. 

성별 칼럼과 평균 나이 칼럼이 SELECT절에 있고 그리고 행의 수는 두 개겠지?

왜 행의 수가 2개일까? GROUP BY절에서 성별의 칼럼의 항목 수에 의해 그룹 함수의 결괏값이 결정된다고 했으니까?

그럼 쿼리문을 작성해봅니다.

 

쿼리문

SELECT GENDER , AVG(AVG)

 

FROM MEMBER

 

GROUP BY GENDER;

 

gender라는 칼럼의 값이 같은 행들에 대해 AGE의 값들의 평균을 계산하라는 의미입니다.

 

SELECT 절에 그룹 함수와, 칼럼명이 같이 기술된 경우 해당 칼럼은 반드시 GROUP BY절에 그룹화돼야 한다. 하지만 GROUP BY절에 기술된 칼럼을 반드시 SELECT문에 기술할 필요는 없다.

하지만 GROUP BY절에 기술된 칼럼을 SELECT절에 기술하지 않으면 어떤 정보인지 모르기 때문에

쓸모없는 정보가 되므로 기술하는 것을 권장한다.

 

JOIN과 두 개의 테이블을 그룹화해서 데이터를 얻어보자.

회원별 작성한 게시글들의 총조회수를 알아보려고 한다.

 

회원의 ID와 게시판 테이블의 ID는 동일하며 회원 ID와 게시글 수 게시글 조회수를 얻어오자

 

이번에도 먼저 결과를 생각해 봅니다.

ID별로 그룹화해서 데이터를 얻어올 것이므로

GROUP BY에 MEMBER.ID를 작성하고 총 레코드 개수는 ID의 개수로 정해질 것이고

집계 함수는 게시글의 작성 자수를 COUNT 하면 작성한 글을 알 수 있으며

HIT라는 조회수를 SUM 하면 총조회수가 나온다.

게시글을 작성하지 않는 회원을 통틀어서 조회를 할 것이므로 MEMBER의 OUTER JOIN을 수행해서 게시글 테이블과 회원 테이블도 JOIN 해야 할 것이다.

두 테이블의 공통조건인 회원 ID와 WRITER_ID로 조건을 주어 JOIN 한다.

쿼리를 한번 작성해보자

 

SELECT M.ID , COUNT(N.WRITER_ID) 게시글수, SUM(N.HIT) 조회수

FROM MEMBER M LEFT JOIN NOTICE N

ON M.ID = N.WRITER_ID

GROUP BY M.ID;

 

만약 여러 칼럼을 그룹화할 경우라면 GROUP BY절에 나열된 칼럼들의 값이 모두 같아야 같은 그룹으로 묶여 집계가 된다.

반응형

댓글