SUM, MAX, MIN
지난번 SELECT
에 이은 SQL
고득점 Kit
의 두 번째 유형은 SUM, MAX, MIN
!
"나이가 가장 많은 사람은 누구일까? 테이블을 뒤져 통계를 내어봅시다."
문제를 풀기 전에 MySQL
의 대표적인 집계함수에 대해 알아보자!
COUNT
행의 개수를 세는 집계 함수
SELECT COUNT(필드명)
FROM [테이블명]
: 필드명
에 해당하는 행의 개수를 출력하라.
필드명
에 *
을 넣으면 모든 행의 개수를 출력하라는 말이다. 이렇게 *
을 파라미터로 받을 수 있는 집계 함수는 COUNT
가 유일하다!COUNT
를 비롯한 집계 함수들은 기본적으로 NULL
값을 제외하고 센다.DISTINCT
DISTINCT
뒤에 나오는 열들에 대하여 같은 값을 가진 중복된 행을 제외해준다.- 집계 함수는 아니지만 모든 집계 함수에 사용이 가능하기 때문에 정리해보자!
SELECT DISTINCT Name
FROM Person
: Person
테이블에서 Name
의 필드값이 같은 행은 제외하고 출력한다. 즉, 중복값을 없애준다.
COUNT
와 같이 사용하는 예제SELECT COUNT(DISTINCT Name)
FROM Person
: Person
테이블에서 Name
의 필드값이 같은 행을 제외하고 난 뒤의 Name
의 행의 개수를 센다. 즉, 중복 제거 → 개수 카운트 순서이다.
SUM
행의 총합을 출력한다.
SELECT SUM(필드명)
FROM [테이블명]
: 테이블명
테이블 중에서 필드명
필드의 총합을 출력하라.
AVG
행의 평균값을 출력한다.
SELECT AVG(필드명)
FROM [테이블명]
: 테이블명
테이블 중에서 필드명
필드의 평균을 출력하라.
SUM
, COUNT
를 이용해서 표현SELECT SUM(필드명) / COUNT(필드명)
FROM [테이블명]
위와 동일하다.
💡
NULL
값을 제외하고 평균을 내는AVG
- 집계 함수는
NULL
인 값을 제외하고 연산하기 때문에AVG
도 마찬가지로NULL
값을 가진 행을 제외하고 평균을 낸다.NULL
값을 0으로 치환한 후 평균에 반영되도록 하려면 코드를 다음과 같이 작성해야 한다.SELECT AVG(CASE WHEN Number IS NULL THEN 0 ELSE Number END) FROM A;
:
A
테이블의Number
필드값이NULL
이면 0으로 바꿔주고, 아니면Number
값을 넣어서AVG
을 출력하라.
MIN
행의 최솟값을 출력한다.
SELECT Age
FROM Person
: Person
테이블에서 Age
값의 최솟값을 출력한다.
MAX
행의 최댓값을 출력한다.
SELECT Age
FROM Person
: Person
테이블에서 Age
값의 최댓값을 출력한다.
📌
MIN
,MAX
적용 범위
:MIN
,MAX
는 다른 집계함수들과는 달리 문자열이나 날짜에도 사용 가능하다.
🔗 LEVEL1. 최댓값 구하기
테이블 정보
✔ ANIMAL_INS
: 동물 보호소에 들어온 동물의 정보를 담은 테이블
필드 정보
✔ ANIMAL_ID
: 동물의 아이디
✔ ANIMAL_TYPE
: 생물 종
✔ DATETIME
: 보호 시작일
✔ INTAKE_CONDITION
: 보호 시작 시 상태
✔ NAME
: 이름
✔ SEX_UPON_INTAKE
: 성별 및 중성화 여부
문제
✔ 가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL
문을 작성하라.
💡 POINT
- 보호 시작일(
DATETIME
) 필드 출력DATETIME
이 가장 큰 값을 하나 출력!
SELECT MAX(DATETIME)
FROM ANIMAL_INS
✔ SELECT MAX(DATETIME)
: DATETIME
필드의 최댓값을 가져오기
✔ FROM ANIMAL_INS
: ANIMAL_INS
테이블 선택
🔗 LEVEL2. 최솟값 구하기
테이블 정보
✔ ANIMAL_INS
: 동물 보호소에 들어온 동물의 정보를 담은 테이블
필드 정보
✔ ANIMAL_ID
: 동물의 아이디
✔ ANIMAL_TYPE
: 생물 종
✔ DATETIME
: 보호 시작일
✔ INTAKE_CONDITION
: 보호 시작 시 상태
✔ NAME
: 이름
✔ SEX_UPON_INTAKE
: 성별 및 중성화 여부
문제
✔ 동물 보호소에 가장 먼저 들어온 동물이 언제 들어왔는지 조회하는 SQL 문을 작성하기
💡 POINT
- 보호 시작일(
DATETIME
) 필드 출력DATETIME
이 가장 작은 값을 하나 출력!
SELECT MIN(DATETIME)
FROM ANIMAL_INS
✔ SELECT MIN(DATETIME)
: DATETIME
필드의 최솟값을 가져오기
✔ FROM ANIMAL_INS
: ANIMAL_INS
테이블 선택
🔗 LEVEL2. 동물 수 구하기
테이블 정보
✔ ANIMAL_INS
: 동물 보호소에 들어온 동물의 정보를 담은 테이블
필드 정보
✔ ANIMAL_ID
: 동물의 아이디
✔ ANIMAL_TYPE
: 생물 종
✔ DATETIME
: 보호 시작일
✔ INTAKE_CONDITION
: 보호 시작 시 상태
✔ NAME
: 이름
✔ SEX_UPON_INTAKE
: 성별 및 중성화 여부
문제
✔ 동물 보호소에 동물이 몇 마리 들어왔는지 조회하는 SQL 문을 작성하기.
💡 POINT
- 필드의 총 행 개수를 출력
SELECT COUNT(*)
FROM ANIMAL_INS
✔ SELECT COUNT(*)
: 모든 필드의 개수를 출력
✔ FROM ANIMAL_INS
: ANIMAL_INS
테이블 선택
🔗 LEVEL2. 중복 제거하기
테이블 정보
✔ ANIMAL_INS
: 동물 보호소에 들어온 동물의 정보를 담은 테이블
필드 정보
✔ ANIMAL_ID
: 동물의 아이디
✔ ANIMAL_TYPE
: 생물 종
✔ DATETIME
: 보호 시작일
✔ INTAKE_CONDITION
: 보호 시작 시 상태
✔ NAME
: 이름
✔ SEX_UPON_INTAKE
: 성별 및 중성화 여부
문제
✔ 동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성하라. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 친다.
💡 POINT
- 이름이
NULL
인 경우와 중복을 제거한 총 동물 이름의 개수를 출력
SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS
✔ SELECT COUNT(DISTINCT NAME)
: NAME
필드의 중복을 제거한 레코드의 총 개수를 출력
✔ FROM ANIMAL_INS
: ANIMAL_INS
테이블 선택