안녕하세요! 데코입니다!
오늘은 프로그래머스 코딩테스트 연습에 있는 "특정 물고기 잡은 수 구하기" 문제를 포스팅하려고 합니다!
바로 포스팅 시작할게요! :)
(출처 : 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() 함수를 통해 물고기 잡은 횟수를 추출하였습니다.
난이도는 더 설명하지 않아도 될 정도로 쉬운 문제였습니다.
이전 문제들에서 모두 다룬 것들을 이용해서
따로 코멘트할 것은 없네요!
혹시나 더 좋은 쿼리나 어렵게 느껴지신 부분이 있다면 댓글로 남겨주세요!
설명이 어려운 부분 혹은 잘 이해가 안 가는 부분
그리고 더 궁금한 내용이 있다면
언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해 드릴게요!
공감과 댓글은 큰 힘이 됩니다!
오늘도 블로그 방문해 주시고
포스팅 읽어주셔서 감사합니다!
'Skill Sets > SQL' 카테고리의 다른 글
[SQL / 질문과 답변] WHERE 1=1 사용하는 이유 (41) | 2024.06.30 |
---|---|
[SQL] 잡은 물고기 중 가장 큰 물고기의 길이 구하기(프로그래머스/MySQL/Level 1) (38) | 2024.06.29 |
[SQL] 한 해에 잡은 물고기 수 구하기(프로그래머스/MySQL/Level 1) (35) | 2024.06.22 |
[SQL] 가장 큰 물고기 10마리 구하기(프로그래머스/MySQL/Level 1) (36) | 2024.06.22 |
[SQL] 물고기 종류별 대어 찾기(프로그래머스/MySQL/Level 3) (41) | 2024.06.09 |