본문 바로가기

Skill Sets/SQL

[SQL] 물고기 종류 별 잡은 수 구하기(프로그래머스/MySQL/Level 2)

SMALL


안녕하세요! 데코입니다!

 

오늘은 프로그래머스 코딩테스트 연습에 있는 "물고기 종류 별 잡은 수 구하기" 문제를 포스팅하려고 합니다!

 

바로 포스팅 시작할게요! :)

(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/293257)


 

1. 문제 :  물고기 종류 별 잡은 수 구하기(Lv. 2)

 


 

2. 문제 설명

 

 

낚시앱에서 사용하는 FISH_INFO 테이블은 잡은 물고기들의 정보를 담고 있습니다. 

FISH_INFO 테이블의 구조는 다음과 같으며

ID, FISH_TYPE, LENGTH, TIME은 각각

잡은 물고기의 ID, 물고기의 종류(숫자), 잡은 물고기의 길이(cm), 물고기를 잡은 날짜를 나타냅니다.

 

[ 테이블 구조('FISH_INFO') ]

COLUMN NAME TYPE NULLABLE
ID INTEGER FALSE
FISH_TYPE
INTEGER FALSE
LENGTH FLOAT TRUE
TIME DATE FALSE

 

 

단, 잡은 물고기의 길이가 10cm 이하일 경우에는 LENGTH 가 NULL이며,

LENGTH에 NULL 만 있는 경우는 없습니다.

FISH_NAME_INFO 테이블은 물고기의 이름에 대한 정보를 담고 있습니다.

FISH_NAME_INFO 테이블의 구조는 다음과 같으며,

FISH_TYPE, FISH_NAME 은 각각

물고기의 종류(숫자), 물고기의 이름(문자)입니다.

 

[ 테이블 구조('FISH_NAME_INFO') ]

COLUMN NAME TYPE NULLABLE
FISH_TYPE INTEGER FALSE
FISH_NAME
VARCHAR FALSE

 

 

[ 문제 ]

 

FISH_NAME_INFO에서 물고기의 종류 별 물고기의 이름과 잡은 수를 출력하는 SQL문을 작성해주세요.

물고기의 이름 컬럼명은 FISH_NAME, 잡은 수 컬럼명은 FISH_COUNT로 해주세요.
결과는 잡은 수 기준으로 내림차순 정렬해주세요.

 

[ 예시 ]

 

예를 들어 FISH_INFO 테이블이 다음과 같고

ID FISH_TYPE LENGTH TIME
0 0 13.37 2021/12/04
1 0 50 2020/03/07
2 0 40 2020/03/07
3 1 43.33 2020/03/09
4 1 NULL 2020/04/08
5 2 32 2020/04/28

 

FISH_NAME_INFO 테이블이 다음과 같고

FISH_TYPE FISH_NAME
0 BASS
1 SNAPPER
2 ANCHOVY

 

종류가 0인 물고기는 3마리, 1인 물고기는 2마리, 2인 물고기는 1마리를 잡았으며,

각각 이름이 'BASS', 'SNAPPER', 'ANCHOVY' 입니다.

따라서 잡은 수를 기준으로 내림차순 정렬하면 결과는 다음과 같습니다.

SQL을 실행하면 다음과 같이 출력되어야 합니다.

 

[ 출력 결과 ]

FISH_COUNT FISH_NAME
3 BASS
2 SNAPPER
1 ANCHOVY

 

 


 

3. 문제 풀이

-- 1안
SELECT  AA.FISH_COUNT 
        , BB.FISH_NAME
  FROM  (
        SELECT  FISH_TYPE
                , COUNT(*) AS FISH_COUNT 
          FROM  FISH_INFO A
         GROUP
            BY  FISH_TYPE
        ) AA
  LEFT
  JOIN  FISH_NAME_INFO BB
    ON  AA.FISH_TYPE = BB.FISH_TYPE
 ORDER
    BY  AA.FISH_COUNT DESC

 

 

이번 문제는 총 1안 한 가지로 작성했습니다!

 

#  1안 풀이 설명

# [ 문제 접근 설명 ]


문제를 읽고 조건에 맞는 쿼리를 작성하기 위해서 다음과 같이  세 가지 단계로 진행했어요!

1. FISH_INFO 테이블에서 물고기 종류별 잡은 횟수 구하기(GROUP BY)

2. FISH_NAME_INFO 테이블에서 1번에서 추출한 정보 결합(JOIN)

4. FISH_COUNT으로 내림차순 정렬(ORDER BY)

 

# [ 1안 쿼리 작성 설명 ]

 

 1  첫 번째 단계에서는 FISH_INFO  테이블에서 물고기 종류별 잡은 수를 쿼리를 작성했습니다!

 

GROUP BY를 이용하여 산출하였고, 출력결과와 동일하게 FISH_COUNT로 별칭을 칭해주었습니다!

 


SELECT  FISH_TYPE
                , COUNT(*) AS FISH_COUNT 
   FROM  FISH_INFO A
 GROUP
         BY  FISH_TYPE

 

 

 2  두 번째 단계에서는 FISH_NAME_INFO 테이블과 첫 번째 단계에서 생성한 쿼리를 JOIN 해 주었어요!

 

첫 번째 단계에서 생성한 쿼리를 서브쿼리로 넣은 후 JOIN을 했습니다!

 


SELECT  AA.FISH_COUNT 

                , BB.FISH_NAME
  FROM  (
              SELECT   FISH_TYPE
                              , COUNT(*) AS FISH_COUNT 
                 FROM   FISH_INFO A
               GROUP
                       BY  FISH_TYPE
              ) AA
  LEFT
  JOIN  FISH_NAME_INFO BB
    ON  AA.FISH_TYPE = BB.FISH_TYPE

 

 

 3  세 번째 단계에서는 요구사항에 맞게 정렬했어요!

잡은 횟수(FISH_COUNT) 기준 내림차순으로 정렬했습니다!

 


SELECT   AA.FISH_COUNT 
                 , BB.FISH_NAME
  FROM   (
                SELECT   FISH_TYPE
                                 , COUNT(*) AS FISH_COUNT 
                   FROM   FISH_INFO A
                GROUP
                          BY  FISH_TYPE
               )  AA
     LEFT
     JOIN   FISH_NAME_INFO BB
        ON   AA.FISH_TYPE = BB.FISH_TYPE
 ORDER
         BY  AA.FISH_COUNT DESC


 

 

정답...!


 

4. 데코의 문제 풀이 후기

 

이번 문제에는 서브쿼리에서 GROUP BY와 함께 COUNT() 함수를 통해

 

물고기 종류 별 잡은 횟수를 추출하고

 

LEFT JOIN을 통해 물고기 NAME 정보들을 붙이고 원하는 정보만을 추출했습니다!

 

사실 ORDER BY를 서브쿼리 안에 넣어도 되는데, 서브쿼리 안 보다는 밖에서 걸어줘서

 

필요시에는 아래 정렬 조건만 바꾸는 게 코드 재사용 측면에서도 좋지 않을까 해서 이렇게 작성해 보았어요!

 

이 외에는 이전 문제들에서 모두 다룬 것들을 이용해서

따로 코멘트할 것은 없네요!

혹시나 더 좋은 쿼리나 어렵게 느껴지신 부분이 있다면 댓글로 남겨주세요! 

 




설명이 어려운 부분 혹은 잘 이해가 안 가는 부분

그리고 더 궁금한 내용이 있다면

언제든지 댓글로 남겨주세요!

빠르게 궁금증을 해결해 드릴게요!

공감과 댓글은 큰 힘이 됩니다!

오늘도 블로그 방문해 주시고

포스팅 읽어주셔서 감사합니다!

 

 

 

 

LIST