데이터 그룹화해서 통계내기 GROUP BY
- 컬럼에서 동일한 로우를 그룹화
- GROUP BY [컬럼이름]
- 그룹별 데이터를 집계할때 사용, 엑셀의 피벗 기능과 유사
- GRUOP BY가 쓰인 쿼리의 SELECT 절에는 GROUP BY 대상 컬럼과 그룹함수만 사용 가능
- GROUP BY 대상 퀄럼이 아닌 다른 퀄럼을 SELECT 하면 에러 발생
- 여러 컬럼 그룹화 가능, 쿼리 뒤에 컬럼 이름 복수개 입력
- 컬럼 번호로 그룹화 가능 (컬럼 번호는 SELECT 절의 컬럼 이름 순서)
1. GROUP BY 사용
SELECT [GROUP BY 대상 컬럼이름], ... , [그룹함수]
FROM [테이블 이름]
WHERE 조건식
GROUP BY [컬럼이름];
2. type 같은 값 그룹화
SELECT type
FROM pokemon.mypokemon
GROUP BY type;
원하는 그룹만 통계내기 HAVING
- HAVING 조건식 형식으로 사용
- 조건식이 참이 되는 그룹만 선택
- HAVING 절의 조건식에서는 그룹함수만 활용
1. HAVING 문법
SELECT [컬럼이름], ...,[그룹함수]
FROM [테이블이름]
WHERE 조건식
GROUP BY [컬럼이름]
HAVING 조건식;
그룹함수
1. COUNT
그룹의 값 수를 세는 함수
COUNT ([컬럼이름]) 형식으로 SELECT, HAVING 절에 사용
집계할 컬럼이름(괄호 안의 컬럼이름)과 기준이 되는 컬럼 이름(GROUP BY에서 사용하는 컬럼이름)이 같아도 되고, 같지 않아도 된다
COUNT(1)은 하나의 값을 1로 세어주며 COUNT에서 자주 사용 됨
GROUP BY가 없는 쿼리에서도 사용가능하며 이때 전체 로우에 함수가 적용 됨
*COUNT 문법
SELECT ([컬럼이름]), ..., COUNT([컬럼이름])
FROM [테이블이름]
GROUP BY [컬럼이름]
HAVING 조건문;
2. SUM
그룹의 합을 계산하는 함수
SUM ([컬럼이름]) 형식으로 SELECT, HAVING 절에 사용
집계할 컬럼이름(괄호 안의 컬럼이름)과 기준이 되는 컬럼 이름(GROUP BY에서 사용하는 컬럼이름)이 같아도 되고, 같지 않아도 된다
GROUP BY가 없는 쿼리에서도 사용가능하며 이때 전체 로우에 함수가 적용 됨
*SUM 문법
SELECT ([컬럼이름]), ..., SUM([컬럼이름])
FROM [테이블이름]
GROUP BY [컬럼이름]
HAVING 조건문;
3. AVG
그룹의 평균을 계산하는 함수
AVG ([컬럼이름]) 형식으로 SELECT, HAVING 절에 사용
집계할 컬럼이름(괄호 안의 컬럼이름)과 기준이 되는 컬럼 이름(GROUP BY에서 사용하는 컬럼이름)이 같아도 되고, 같지 않아도 된다
GROUP BY가 없는 쿼리에서도 사용가능하며 이때 전체 로우에 함수가 적용 됨
*AVG 문법
SELECT ([컬럼이름]), ..., AVG([컬럼이름])
FROM [테이블이름]
GROUP BY [컬럼이름]
HAVING 조건문;
4. MIN
그룹의 최소값 반환
MIN ([컬럼이름]) 형식으로 SELECT, HAVING 절에 사용
집계할 컬럼이름(괄호 안의 컬럼이름)과 기준이 되는 컬럼 이름(GROUP BY에서 사용하는 컬럼이름)이 같아도 되고, 같지 않아도 된다
GROUP BY가 없는 쿼리에서도 사용가능하며 이때 전체 로우에 함수가 적용 됨
*MIN 문법
SELECT ([컬럼이름]), ..., MIN([컬럼이름])
FROM [테이블이름]
GROUP BY [컬럼이름]
HAVING 조건문;
5. MAX
그룹의 최대값 반환하는 함수
MAX ([컬럼이름]) 형식으로 SELECT, HAVING 절에 사용
집계할 컬럼이름(괄호 안의 컬럼이름)과 기준이 되는 컬럼 이름(GROUP BY에서 사용하는 컬럼이름)이 같아도 되고, 같지 않아도 된다
GROUP BY가 없는 쿼리에서도 사용가능하며 이때 전체 로우에 함수가 적용 됨
*MAX 문법
SELECT ([컬럼이름]), ..., MAX([컬럼이름])
FROM [테이블이름]
GROUP BY [컬럼이름]
HAVING 조건문;
1. 예제 쿼리(SELECT절에서 그룹함수 사용)
SELECT type, COUNT(*), CONT(1), AVG(heifht), Max(weight)
FROM pokemon.mypokemon
GROUP BY type;
2. 예제 쿼리(HAVING절에서 그룹함수 사용)
SELECT type, COUNT(*), CONT(1), AVG(heifht), Max(weight)
FROM pokemon.mypokemon
GROUP BY type
HAVING COUNT(1)=2;
쿼리 실행순서 알아보기
<예제쿼리>
DROP DATABASE IF EXISTS pokemon;
CREATE DATABASE pokemon;
USE pokemon;
CREATE TABLE mypokemon (
number int,
name varchar(20),
type varchar(10),
height float,
weight float
);
INSERT INTO mypokemon (number, name, type, height, weight)
VALUES (10, 'caterpie', 'bug', 0.3, 2.9),
(25, 'pikachu', 'electric', 0.4, 6),
(26, 'raichu', 'electric', 0.8, 30),
(125, 'electabuzz', 'electric', 1.1, 30),
(133, 'eevee', 'normal', 0.3, 6.5),
(137, 'porygon', 'normal', 0.8, 36.5),
(152, 'chikoirita', 'grass', 0.9, 6.4),
(153, 'bayleef', 'grass', 1.2, 15.8),
(172, 'pichu', 'electric', 0.3, 2),
(470, 'leafeon', 'grass', 1, 25.5);
/*MISSION (1)
포켓몬 테이블에서 이름(name)의 길이가 5보다 큰 포켓몬들을 타입(type)을 기준으로 그룹화하고,
몸무게(weight)의 평균이 20 이상인 그룹의 타입과, 몸무게의 평균을 가져와 주세요. 이 때, 결과는
몸무게의 평균을 내림차순으로 정렬해 주세요.
MISSION (2)
포켓몬 테이블에서 번호(number)가 200보다 작은 포켓몬들을 타입(type)을 기준으로 그룹화한 후에,
몸무게(weight)의 최댓값이 10보다 크거나 같고 최솟값은 2보다 크거나 같은 그룹의
타입, 키(height)의 최솟값, 최댓값을 가져와 주세요. 이 때, 결과는 키의 최솟값의 내림차순으로 정렬해
주시고, 만약 키의 최솟값이 같다면 키의 최댓값의 내림차순으로 정렬해주세요*/
SELECT type, AVG(weight)
FROM mypokemon
WHERE LENGTH(name)>5
GROUP BY type
HAVING AVG(weight) >=20
ORDER BY 2 DESC;
SELECT type, MIN(height), MAX(height)
FROM mypokemon
WHERE number <200
GROUP BY type
HAVING MAX(weight) >= 10 AND MIN(weight) >= 2
ORDER BY 2 DESC, 3 DESC;
'SQL' 카테고리의 다른 글
[패스트캠퍼스] SQL 강의 : 테이블 합치기, JOIN 함수 (2) | 2022.12.27 |
---|---|
[패스트캠퍼스] SQL 강의 : 그룹함수 조건만들기/ 함수만들기 (0) | 2022.12.27 |
[패스트캠퍼스] SQL 강의 : 원하는 데이터 가져오기 (0) | 2022.12.20 |
[패스트캠퍼스] SQL 강의 : 조건에 맞는 데이터 가져오기(WHERE) (0) | 2022.12.17 |
[패스트캠퍼스] SQL 강의 : 데이터 가져오기(SELECT-FROM-AS-LIMIT-DISTINCT) (0) | 2022.12.14 |