[TIL] #4 프로그래머스 SUM, MAX, MIN

kiteB·2021년 8월 13일

TIL-SQL

목록 보기
3/7
post-thumbnail

📌 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. 최댓값 구하기

문제 정리

  1. 테이블 정보
    ✔ ANIMAL_INS : 동물 보호소에 들어온 동물의 정보를 담은 테이블

  2. 필드 정보
    ✔ ANIMAL_ID: 동물의 아이디
    ✔ ANIMAL_TYPE: 생물 종
    ✔ DATETIME: 보호 시작일
    ✔ INTAKE_CONDITION: 보호 시작 시 상태
    ✔ NAME: 이름
    ✔ SEX_UPON_INTAKE: 성별 및 중성화 여부

  3. 문제
    ✔ 가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL문을 작성하라.

💡 POINT

  • 보호 시작일(DATETIME) 필드 출력
  • DATETIME이 가장 큰 값을 하나 출력!

내 코드

SELECT MAX(DATETIME)
FROM ANIMAL_INS

✔ SELECT MAX(DATETIME) : DATETIME 필드의 최댓값을 가져오기
✔ FROM ANIMAL_INS: ANIMAL_INS 테이블 선택


✔ 최솟값 구하기


🔗 LEVEL2. 최솟값 구하기

문제 정리

  1. 테이블 정보
    ✔ ANIMAL_INS : 동물 보호소에 들어온 동물의 정보를 담은 테이블

  2. 필드 정보
    ✔ ANIMAL_ID: 동물의 아이디
    ✔ ANIMAL_TYPE: 생물 종
    ✔ DATETIME: 보호 시작일
    ✔ INTAKE_CONDITION: 보호 시작 시 상태
    ✔ NAME: 이름
    ✔ SEX_UPON_INTAKE: 성별 및 중성화 여부

  3. 문제
    ✔ 동물 보호소에 가장 먼저 들어온 동물이 언제 들어왔는지 조회하는 SQL 문을 작성하기

💡 POINT

  • 보호 시작일(DATETIME) 필드 출력
  • DATETIME이 가장 작은 값을 하나 출력!

내 코드

SELECT MIN(DATETIME)
FROM ANIMAL_INS

✔ SELECT MIN(DATETIME) : DATETIME 필드의 최솟값을 가져오기
✔ FROM ANIMAL_INS: ANIMAL_INS 테이블 선택


✔ 동물 수 구하기


🔗 LEVEL2. 동물 수 구하기

문제 정리

  1. 테이블 정보
    ✔ ANIMAL_INS : 동물 보호소에 들어온 동물의 정보를 담은 테이블

  2. 필드 정보
    ✔ ANIMAL_ID: 동물의 아이디
    ✔ ANIMAL_TYPE: 생물 종
    ✔ DATETIME: 보호 시작일
    ✔ INTAKE_CONDITION: 보호 시작 시 상태
    ✔ NAME: 이름
    ✔ SEX_UPON_INTAKE: 성별 및 중성화 여부

  3. 문제
    ✔ 동물 보호소에 동물이 몇 마리 들어왔는지 조회하는 SQL 문을 작성하기.

💡 POINT

  • 필드의 총 행 개수를 출력

내 코드

SELECT COUNT(*)
FROM ANIMAL_INS

✔ SELECT COUNT(*) : 모든 필드의 개수를 출력
✔ FROM ANIMAL_INS: ANIMAL_INS 테이블 선택


✔ 중복 제거하기


🔗 LEVEL2. 중복 제거하기

문제 정리

  1. 테이블 정보
    ✔ ANIMAL_INS : 동물 보호소에 들어온 동물의 정보를 담은 테이블

  2. 필드 정보
    ✔ ANIMAL_ID: 동물의 아이디
    ✔ ANIMAL_TYPE: 생물 종
    ✔ DATETIME: 보호 시작일
    ✔ INTAKE_CONDITION: 보호 시작 시 상태
    ✔ NAME: 이름
    ✔ SEX_UPON_INTAKE: 성별 및 중성화 여부

  3. 문제
    ✔ 동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성하라. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 친다.

💡 POINT

  • 이름이 NULL인 경우와 중복을 제거한 총 동물 이름의 개수를 출력

내 코드

SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS

✔ SELECT COUNT(DISTINCT NAME) : NAME 필드의 중복을 제거한 레코드의 총 개수를 출력
✔ FROM ANIMAL_INS: ANIMAL_INS 테이블 선택


참고 자료


https://ansohxxn.github.io/db/ch6/

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글