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 테이블 선택