본 글은 Fastcampus의 MySQL Database 강의를 수강하며 정리한 내용입니다.
강의 링크
GROUP BY
GROUP BY [컬럼 이름]
GROUP BY
가 쓰인 쿼리의 SELECT
절에는 GROUP BY 대상 컬럼과 그룹 함수만 사용 가능GROUP BY
대상 컬럼이 아닌 컬럼을 SELECT
하면, 에러 발생SELECT
절의 컬럼 이름의 순서를 의미SELECT [GROUP BY 대상 컬럼 이름], ..., [그룹 함수]
FROM [테이블 이름]
WHERE 조건식
GROUP BY [컬럼 이름];
HAVING
HAVING 조건식
HAVING
절의 조건식에서는 그룹 함수를 활용SELECT [GROUP BY 대상 컬럼 이름], ..., [그룹 함수]
FROM [테이블 이름]
WHERE 조건식
GROUP BY [컬럼 이름];
HAVING 조건식
COUNT
COUNT([컬럼 이름])
SELECT
, HAVING
절에서 사용COUNT(1)
은 하나의 값을 1로 세어주는 표현으로 COUNT
함수에 자주 사용된다.GROUP BY
가 없는 쿼리에서도 사용 가능하며, 이 때는 전체 로우에 함수가 적용된다.COUNT(*)
= COUNT([컬럼 이름])
SELECT [GROUP BY 대상 컬럼 이름], ..., COUNT([컬럼 이름])
FROM [테이블 이름]
GROUP BY [컬럼 이름];
HAVING 조건문
SUM
SUM([컬럼 이름])
SELECT
, HAVING
절에서 사용GROUP BY
가 없는 쿼리에서도 사용 가능하며, 이 때는 전체 로우에 함수가 적용된다.SELECT [GROUP BY 대상 컬럼 이름], ..., SUM([컬럼 이름])
FROM [테이블 이름]
GROUP BY [컬럼 이름];
HAVING 조건문
AVG
AVG([컬럼 이름])
SELECT
, HAVING
절에서 사용GROUP BY
가 없는 쿼리에서도 사용 가능하며, 이 때는 전체 로우에 함수가 적용된다.SELECT [GROUP BY 대상 컬럼 이름], ..., AVG([컬럼 이름])
FROM [테이블 이름]
GROUP BY [컬럼 이름];
HAVING 조건문
MIN
MIN([컬럼 이름])
SELECT
, HAVING
절에서 사용GROUP BY
가 없는 쿼리에서도 사용 가능하며, 이 때는 전체 로우에 함수가 적용된다.SELECT [GROUP BY 대상 컬럼 이름], ..., MIN([컬럼 이름])
FROM [테이블 이름]
GROUP BY [컬럼 이름];
HAVING 조건문
MAX
MAX([컬럼 이름])
SELECT
, HAVING
절에서 사용GROUP BY
가 없는 쿼리에서도 사용 가능하며, 이 때는 전체 로우에 함수가 적용된다.SELECT [GROUP BY 대상 컬럼 이름], ..., MAX([컬럼 이름])
FROM [테이블 이름]
GROUP BY [컬럼 이름];
HAVING 조건문
6가지 핵심 쿼리 키워드
키워드 | 문법 | 작성 순서 | 실행 순서 |
---|---|---|---|
SELECT | SELECT [컬럼 이름] | 1 | 5 |
FROM | FROM [테이블 이름] | 2 | 1 |
WHERE | WHERE 조건식 | 3 | 2 |
GROUP BY | GROUP BY [컬럼 이름] | 4 | 3 |
HAVING | HAVING 조건식 | 5 | 4 |
ORDER BY | ORDER BY [컬럼 이름] | 6 | 6 |
SELECT
는 모든 쿼리에 필수 키워드
예시
입력 순서 | 쿼리 | 실행 순서 |
---|---|---|
1 | SELECT type, COUNT(1), MAX(weight) | 5 |
2 | FROM pokemon.mypokemon | 1 |
3 | WHERE name LIKE '%a%' | 2 |
4 | GROUP BY type | 3 |
5 | HAVING MAX(height) > 1 | 4 |
6 | ORDER BY 3; | 6 |
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);
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;