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

kiteB·2021년 8월 13일
1

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개의 댓글