MySQl - ⑥ 데이터 그룹화

강태공·2023년 1월 12일
1

1. 데이터 그룹화하기 (group by)

§ GROUP BY [컬럼 이름] 형식으로 사용합니다.

§ 주로 그룹 별 데이터를 집계할 때 사용하며, 엑셀의 피벗 기능과 유사합니다.

§ GROUP BY가 쓰인 쿼리의 SELECT 절에는 GROUP BY 대상 컬럼과 그룹 함수만 사용 가능합니다.

§ 만약, GROUP BY 대상 컬럼이 아닌 컬럼을 SELECT 하면, 에러가 발생합니다.

여러 컬럼으로 그룹화도 가능하며, 키워드 뒤에 [컬럼 이름]을 복수 개 입력하면 됩니다.

§ 컬럼 번호로도 그룹화가 가능합니다.

§ 이 때, 컬럼 번호는 SELECT 절의 컬럼 이름의 순서를 의미합니다.

SELECT [GROUP BY 대상 컬럼 이름], ... , [그룹 함수]
FROM [테이블 이름]
WHERE 조건식
GROUP BY [컬럼 이름];

2. 그룹에 조건 주기 ( having )

§ HAVING 조건식 형식으로 사용합니다.

§ 조건식이 True(참)이 되는 그룹만 선택합니다.

§ HAVING 절의 조건식에서는 그룹 함수를 활용합니다.

SELECT [컬럼 이름], ..., [그룹 함수]
FROM [테이블 이름]
WHERE 조건식
GROUP BY [컬럼 이름]
HAVING 조건식;

3. 다양한 그룹 함수

그룹 내부 구조

4. [TIP] 쿼리 실행 순서 알아보기

MISSION (1)
포켓몬 타입 별 키의 평균을 가져와 주세요.

SELECT type, AVG(height)
FROM mypokemon
GROUP BY type;

/*
MISSION (2)
포켓몬의 타입 별 몸무게의 평균을 가져와 주세요.
*/
SELECT type, AVG(weight)
FROM mypokemon
GROUP BY type;

/*
MISSION (3)
포켓몬의 타입 별 키의 평균과 몸무게의 평균을 함께 가져와 주세요
*/ 
SELECT type, AVG(height) AS avg_height, AVG(weight) AS avg_weight
FROM mypokemon
GROUP BY type;

/*
MISSION (4)
키의 평균이 0.5 이상인 포켓몬의 타입을 가져와 주세요.
*/
SELECT type
FROM mypokemon
GROUP BY type
HAVING AVG(height) >= 0.5;

/*
MISSION (5)
몸무게의 평균이 20 이상인 포켓몬의 타입을 가져와 주세요.
*/
SELECT type
FROM mypokemon
GROUP BY type
HAVING AVG(weight) >= 20;

/*
MISSION (6)
포켓몬의 type 별 번호(number)의 합을 가져와 주세요.
*/
SELECT type, SUM(number) AS '번호의 합'
FROM mypokemon
GROUP BY type;

/*
MISSION (7)
키가 0.5 이상인 포켓몬이 포켓몬의 type 별로 몇 개씩 있는지 가져와 주세요.
*/
SELECT type, COUNT(1), COUNT(*)
FROM mypokemon
WHERE height >= 0.5
GROUP BY type;

/*
MISSION (8)
포켓몬 타입 별 키의 최솟값을 가져와 주세요.
*/
SELECT type, MIN(height)
FROM mypokemon
GROUP BY type;

/*
MISSION (9)
포켓몬 타입 별 몸무게의 최댓값을 가져와 주세요.
*/
SELECT type, MAX(weight)
FROM mypokemon
GROUP BY type;

/*
MISSION (10)
키의 최솟값이 0.5보다 크고 몸무게의 최댓값이 30보다 작은 포켓몬 타입을 가져와 주세요.
*/
SELECT type
FROM mypokemon
GROUP BY type
HAVING MIN(height) > 0.5 AND MAX(weight) < 30;

c

0개의 댓글

관련 채용 정보