목차
GROUP BY
- 어떤 카테고리별로 묶어서 통계(집계 함수)를 내고 싶을 때 사용하는 것이 GROUP BY 입니다.
- 예를 들어 고객등급이 'VIP'인 사람들끼리의 평균, '패밀리'인 사람들끼리의 평균, '로열'인 사람들끼리의 평균을 따로따로 구해야 할 경우 유용합니다.
- 예시
- GROUP BY를 사용하지 않을 경우
-
SELECT AVG(사용금액) FROM card WHERE 고객등급='vip'; SELECT AVG(사용금액) FROM card WHERE 고객등급='패밀리'; SELECT AVG(사용금액) FROM card WHERE 고객등급='로열';
-
- GROUP BY를 사용한 경우
- 위에서 한 작업을 한 번에 처리가 가능합니다. (모든 고객등급에 대하여 처리가능)
-
SELECT 고객등급, AVG(사용금액) FROM card GROUP BY 고객등급
- 보통 GROUP BY 한 컬럼을 제일 앞에 써줍니다.
- GROUP BY를 사용하지 않을 경우
HAVING
- GROUP BY를 통해서 해당 컬럼의 카테고리별로 통계를 냈습니다. 하지만 해당 컬럼의 모든 카테고리에서 통계를 내고 싶지 않고, 조건식을 걸어 필터링을 하고 싶을 때는 어떻게 해야 할까요?
- GROUP BY에 대한 필터링은 WHERE을 사용하는 것이 아닌 HAVING을 사용해야 합니다.
- WHERE : SELECT FROM 결과 필터링
- HAVING : GROUP BY 결과 필터링
- GROUP BY에 대한 필터링은 WHERE을 사용하는 것이 아닌 HAVING을 사용해야 합니다.
- HAVING만 단독으로 AS로 지정한 컬럼명으로 다음과 같이 사용할 수도 있습니다.
-
SELECT 결제횟수 AS 수 FROM card HAVING 수>50
- WHERE로 대신해서 작성할 경우 오류가 발생합니다.
- 오류발생
-
SELECT 결제횟수 AS 수 FROM card WHERE 수>50
-
- 예시
- VIP와 패밀리 고객등급을 대상으로 고객등급별로 평균 사용금액을 구하시오
-
SELECT 고객등급, AVG(사용금액) FROM card GROUP BY 고객등급 HAVING 고객등급='vip' OR 고객등급='패밀리'
-
- VIP와 패밀리 고객등급을 대상으로 고객등급별로 평균 사용금액을 구하시오
SQL문 작성순서
- SELECT / FROM / WHERE / GROUP BY / HAVING / ORDER BY 순으로 작성
예제
- card 테이블에서 연체 횟수마다 몇 명이 있는지 출력해 보기 (연체 횟수 기준 정렬)
-
SELECT 연체횟수, count(*) AS 인원 FROM card GROUP BY 연체횟수 ORDER BY 연체횟수
-
- 위 결과에서 인원이 1명 이하인 행은 안 보이게 필터링하기
-
SELECT 연체횟수, count(*) AS 인원 FROM card GROUP BY 연체횟수 HAVING 인원>1 ORDER BY 연체횟수
-
- card 테이블에서 회원등급별로 최대사용금액과 최소사용금액이 몇 배나 차이나는지 구해보기
-
SELECT 고객등급, max(사용금액) AS 최대, min(사용금액) AS 최소, max(사용금액)/min(사용금액) AS 몇배 FROM card GROUP BY 고객등급 ORDER BY 고객등급;
-
출처
'Database > MySQL' 카테고리의 다른 글
JOIN (INNER, LEFT, RIGHT, FULL) (0) | 2024.03.12 |
---|---|
IF / CASE (0) | 2024.03.02 |
select 안에 select (서브쿼리) (1) | 2024.03.01 |
컬럼 출력시 사칙연산 넣기 / 문자,숫자 다루는 함수 (1) | 2024.02.29 |
MIN, MAX, AVG, SUM, COUNT 집계함수로 통계내기 (0) | 2024.02.28 |