본문 바로가기

DataBase

[DATABASE] GROUP BY / HAVING

GROUP BY

  • 데이터를 특정 기준으로 묶어서(GROUP) 집계함수와 함께 사용하는 구문
  • 예시로는 학교별 학생수, 과목별 최고 점수, 부서별 평균 급여 등등
  • 사용시 주의사항은 SELECT문에 있는 컬럼은 GROUP BY절에 있거나 집계함수로 감싸야함
  • GROUP BY 없이 집계함수를 사용할 경우 전체 집계만 가능하다.

자주 쓰이는 집계함수

함수 설명
COUNT() 개수
SUM() 합계
AVG() 평균
MAX() 최대값
MIN() 최소값

문법

SELECT 그룹컬럼, 집계함수(컬럼)
FROM 테이블
GROUP BY 그룹컬럼;

예시)

학교별 학생이 몇명인지 알고 싶다.

  • 예상데이터 = 혜화초등학교: 2명 / 효제초등학교 1명 / 사대초등학교 1명 / 강북초등학교 1명 / 미아초등학교 0명

결과

쿼리문

SELECT 
   SC.SCHOOL_SEQ AS SCHOOL_SEQ,
   SC.SCHOOL_NAME AS 학교,
   COUNT(ST.STUDENT_SEQ) AS 학생수
FROM SCHOOL SC  LEFT JOIN STUDENT ST
   ON SC.SCHOOL_SEQ = ST.STUDENT_SCHOOL
GROUP BY SC.SCHOOL_NAME, SC.SCHOOL_SEQ
ORDER BY SC.SCHOOL_SEQ ASC;
  • 참고로 SELECT 절이나 GROUP BY 절에 컬럼이 없으면 ORDER BY 가 안된다.

HAVING

  • GROUP BY로 묶은 그룹에 조건을 걸 때 사용
  • GROUP BY와 세트라고 보면됨
  • WHERE 조건은 행 조건이고 HAVING은 그룹에 대한 조건
  • 집계함수의 결과에 조건을 걸고 싶을 때 사용

문법

SELECT 그룹기준컬럼, 집계함수(컬럼)
FROM 테이블명
GROUP BY 그룹기준컬럼
HAVING 집계함수(컬럼) 조건;

예시)

과목 평균 점수가 70점 이상만 보고 싶다.

  • 여기까진 위에서 알아본 GROUP BY를 활용한 집계 데이터를 추출했다.
  • HAVING을 사용해 평균 점수가 70점 이상인 데이터를 뽑을려고한다.
  • 예상되는 데이터는 수학을 제외한 국어, 과학이 나와야 한다.

결과

 

쿼리문

SELECT 
   SC.SUBJECT AS 과목,
   AVG(SC.SCORE) 평균
FROM SCORE SC   LEFT JOIN STUDENT ST
   ON SC.STUDENT_SEQ = ST.STUDENT_SEQ
GROUP BY SC.SUBJECT
HAVING AVG(SC.SCORE) >= 70;
  • 평균 점수가 조건이기 때문에 HAVING에 AVG 집계함수를 사용해 조건을 걸었다.
반응형

'DataBase' 카테고리의 다른 글

[DATABASE] 서브쿼리  (0) 2025.05.12
[DATABASE] ORDER BY / LIMIT / OFFSET  (0) 2025.05.11
[DATABASE] 조인(JOIN)의 개념과 종류  (0) 2025.05.06
[DATABASE] 데이터베이스 언어와 SQL  (0) 2025.04.29
[DATABASE] 제약조건  (0) 2025.04.29