본문 바로가기

Skill Sets/SQL

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

SMALL


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

 

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

 

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

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


 

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_INFO 테이블에서 잡은 BASS와 SNAPPER의 수를 출력하는 SQL 문을 작성해주세요.

컬럼명은 'FISH_COUNT`로 해주세요.

 

[ 예시 ]

 

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

ID FISH_TYPE LENGTH TIME
0 0 30 2021/12/04
1 0 50 2020/03/07
2 0 40 2020/03/07
3 1 20 2022/03/09
4 1 NULL 2022/04/08
5 2 13 2021/04/28
6 0 60 2021/07/28
7 0 55 2021/01/28
8 2 73 2020/01/28
9 2 73 2021/04/28
10 2 22 2020/06/28
11 2 17 2022/12/23

 

FISH_NAME_INFO 테이블이 다음과 같고

FISH_TYPE FISH_NAME
0 BASS
1 SNAPPER
2 ANCHOVY

 

'BASS' 는 물고기 종류 0에 해당하고,

 'SNAPPER' 는 물고기 종류 1에 해당하므로 

잡은 'BASS' 와 'SNAPPER' 수는 7마리입니다.

 

[ 출력 결과 ]

FISH_COUNT
7

 

 


 

3. 문제 풀이

-- 1안
SELECT  COUNT(*) AS FISH_COUNT
  FROM  FISH_INFO A
  LEFT
  JOIN  FISH_NAME_INFO B
    ON  A.FISH_TYPE = B.FISH_TYPE
 WHERE  B.FISH_NAME IN ('BASS', 'SNAPPER')

 

 

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

 

#  1안 풀이 설명

# [ 문제 접근 설명 ]


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

1. FISH_INFO 테이블과 FISH_NAME_INFO  테이블 결합하기(JOIN)

2. FISH_NAME_INFO 테이블에 있는 컬럼을 이용하여 특정 물고기 추출하기(WHERE)

3. FISH_COUNT 계산하기

 

# [ 1안 쿼리 작성 설명 ]

 

 1  첫 번째 단계에서는 FISH_INFO 테이블과 FISH_NAME_INFO  테이블을 결합하였습니다!

 

LEFT JOIN을 이용하고 공통적인 커럼인 FISH_TYPE을 ON절에 넣어주었어요!

 


SELECT   *
   FROM   FISH_INFO A
    LEFT
    JOIN   FISH_NAME_INFO B
        ON   A.FISH_TYPE = B.FISH_TYPE

 

 

 2  두 번째 단계에서는 FISH_NAME_INFO 테이블에 있는 컬럼을 이용하여 특정 물고기를 산출했습니다!

 

문제에서 나타난 것과 같이 BASS와 SNAPPER을 필터링하도록 WHERE 문에 넣어주었습니다.

 


SELECT   *
   FROM   FISH_INFO A
    LEFT
    JOIN   FISH_NAME_INFO B
        ON   A.FISH_TYPE = B.FISH_TYPE
WHERE  B.FISH_NAME IN ('BASS', 'SNAPPER')


 

 

 3  세 번째 단계에서는 두 번째 단계에서 산출한 데이터의 수를 COUNT() 함수를 이용하여 계산했습니다!

종류별로 물고기 수를 세는 것이 아니기때문에, 바로 COUNT(*) 함수를 적어주었습니다.

 

또한 별칭을 FISH_COUNT로 하라는 요청사항이 있어서 별칭도 지정해주었습니다.

 


SELECT  COUNT(*)  AS FISH_COUNT
   FROM   FISH_INFO A
    LEFT
    JOIN   FISH_NAME_INFO B
        ON   A.FISH_TYPE = B.FISH_TYPE
WHERE  B.FISH_NAME IN ('BASS', 'SNAPPER')


 

 

정답...!


 

4. 데코의 문제 풀이 후기

 

이번 문제에는 두 테이블을 JOIN하고 원하는 데이터를 추출한 뒤

 

COUNT() 함수를 통해 물고기 잡은 횟수를 추출하였습니다.

 

난이도는 더 설명하지 않아도 될 정도로 쉬운 문제였습니다.

 

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

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

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

 




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

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

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

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

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

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

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

 

 

 

LIST