본문 바로가기

SQL Kit/GROUP BY

물고기 종류 별 잡은 수 구하기 [ 프로그래머스 | SQL Kit | Level 2 ]

1. 문제목적

GROUP BY와 COUNT 함수를 활용하여 데이터를 그룹화하고 특정 컬럼 값을 기준으로 집계된 데이터를 정렬하여 추출하는 SQL 문법을 학습하기 위한 것입니다.


2. 핵심개념

GROUP BY

  • 정의: 데이터를 지정한 컬럼 기준으로 그룹화하여 집계 작업을 수행할 수 있게 한다.
SELECT 컬럼1, 집계함수(컬럼2)
FROM 테이블
GROUP BY 컬럼1;

COUNT 함수

  • 정의: 특정 컬럼에서 행의 개수를 세는 집계 함수.
SELECT COUNT(컬럼)
FROM 테이블;
  • 특징: NULL 값을 제외하고 행의 개수를 셀 수 있다.

JOIN

  • 정의: 두 개 이상의 테이블을 연결하여 데이터를 조합하는 방법.
SELECT *
FROM 테이블1
JOIN 테이블2
ON 테이블1.공통컬럼 = 테이블2.공통컬럼;

ORDER BY

  • 정의: 결과를 지정된 컬럼 기준으로 정렬한다.
SELECT *
FROM 테이블
ORDER BY 컬럼 [ASC|DESC];
  • 기본 정렬은 ASC(오름차순)이며, DESC는 내림차순 정렬이다.

3. 문제해결 절차

  1. 데이터 분석:
    • FISH_INFO 테이블은 물고기 종류(FISH_TYPE)와 개별 길이(LENGTH) 및 시간(TIME) 정보를 포함.
    • FISH_NAME_INFO 테이블은 물고기 종류(FISH_TYPE)와 이름(FISH_NAME)을 매핑.
  2. 요구사항 이해:
    • 각 물고기 이름(FISH_NAME)별로 잡힌 횟수(FISH_COUNT)를 계산해야 함.
    • 잡힌 횟수를 기준으로 내림차순 정렬.
  3. 문제 해결 계획:
    • 두 테이블을 FISH_TYPE 기준으로 JOIN.
    • FISH_NAME을 기준으로 그룹화하여 각 그룹의 행 개수(COUNT)를 계산.
    • 결과를 내림차순으로 정렬.
  4. SQL문 작성:
    • JOIN으로 두 테이블을 결합.
    • GROUP BY와 COUNT를 사용해 물고기 이름별로 잡힌 횟수를 집계.
    • ORDER BY로 결과 정렬.

4. 코드작성

-- 1. FISH_INFO와 FISH_NAME_INFO를 FISH_TYPE 기준으로 JOIN하여 데이터를 결합
SELECT
    FNI.FISH_NAME,          -- 물고기 이름
    COUNT(FI.ID) AS FISH_COUNT  -- 잡힌 횟수 계산
FROM
    FISH_INFO FI            -- 물고기 정보 테이블
JOIN
    FISH_NAME_INFO FNI      -- 물고기 이름 테이블
ON
    FI.FISH_TYPE = FNI.FISH_TYPE  -- FISH_TYPE을 기준으로 JOIN
WHERE
    FI.LENGTH IS NOT NULL   -- NULL 값을 제외 (길이가 없는 경우 제외)
GROUP BY
    FNI.FISH_NAME           -- 물고기 이름을 기준으로 그룹화
ORDER BY
    FISH_COUNT DESC;        -- 잡힌 횟수를 기준으로 내림차순 정렬

5. 코드분석

JOIN

  • FISH_INFO와 FISH_NAME_INFO를 FISH_TYPE으로 연결하여 데이터를 하나의 테이블처럼 결합.
  • JOIN 조건: FI.FISH_TYPE = FNI.FISH_TYPE.

COUNT

  • COUNT(FI.ID)는 FI 테이블에서 각 물고기 종류별로 잡힌 횟수를 계산.
  • FI.LENGTH IS NOT NULL 조건은 NULL 데이터를 제외하고 개수를 정확히 계산하도록 한다.

GROUP BY

  • 물고기 이름(FNI.FISH_NAME)별로 데이터를 그룹화.
  • 그룹화된 데이터에 대해 COUNT로 개수를 집계.

ORDER BY

  • 집계된 결과를 내림차순으로 정렬하여 잡힌 횟수가 많은 순서대로 데이터를 출력.