본문 바로가기
데이터분석/SQL

[프로그래머스] MySQL 코딩테스트(1) - SELECT편

by 클로버심 2025. 8. 6.

1. 코딩테스트 연습 > SELECT > 모든 레코드 조회하기

문제 설명
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

문제
동물 보호소에 들어온 모든 동물의 정보를 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.

본 문제는 Kaggle의 "Austin Animal Center Shelter Intakes and Outcomes"에서 제공하는 데이터를 사용하였으며 ODbL의 적용을 받습니다.
 
내가 쓴 답

SELECT * FROM ANIMAL_INS ORDER BY ANIMAL_ID;

 

2. 코딩테스트 연습 > SELECT > 역순 정렬하기

문제 설명
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

문제
동물 보호소에 들어온 모든 동물의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 ANIMAL_ID 역순으로 보여주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.

 
내가 쓴 답

select name, datetime from animal_ins order by animal_id desc;

 

3. 코딩테스트 연습 > SELECT > 인기있는 아이스크림

문제 설명
FIRST_HALF 테이블은 아이스크림 가게의 상반기 주문 정보를 담은 테이블입니다.FIRST_HALF 테이블 구조는 다음과 같으며, SHIPMENT_ID, FLAVOR, TOTAL_ORDER는 각각 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 상반기 아이스크림 총주문량을 나타냅니다.

문제
상반기에 판매된 아이스크림의 맛을 총주문량을 기준으로 내림차순 정렬하고 총주문량이 같다면 출하 번호를 기준으로 오름차순 정렬하여 조회하는 SQL 문을 작성해주세요
예시
예를 들어 FIRST_HALF 테이블이 다음과 같을 때

상반기 아이스크림 맛을 총주문량을 기준으로 내림차순 정렬하고 총주문량이 같은 경우 출하 번호를 기준으로 오름차순 정렬하면 chocolate, melon, white_chocolate, strawberry, mango, orange, pineapple, vanilla, caramel, peach, watermelon, mint_chocolate 순서대로 조회되어야 합니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.




내가 쓴 답

SELECT FLAVOR FROM FIRST_HALF
    GROUP BY FLAVOR ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC;

 

4. 코딩테스트 연습 > SELECT > 서울에 위치한 식당 목록 출력하기

문제 설명
다음은 식당의 정보를 담은 REST_INFO 테이블과 식당의 리뷰 정보를 담은 REST_REVIEW 테이블입니다. REST_INFO 테이블은 다음과 같으며 REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL은 식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.

REST_REVIEW 테이블은 다음과 같으며 REVIEW_ID, REST_ID, MEMBER_ID, REVIEW_SCORE, REVIEW_TEXT,REVIEW_DATE는 각각 리뷰 ID, 식당 ID, 회원 ID, 점수, 리뷰 텍스트, 리뷰 작성일을 의미합니다.

문제
REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.
예시
REST_INFO 테이블이 다음과 같고

REST_REVIEW 테이블이 다음과 같을 때

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

 
처음 내가 쓴 답

SELECT RI.REST_ID, RI.REST_NAME, RI.FOOD_TYPE, 
RI.FAVORITES, RI.ADDRESS, RR.SCORE
FROM REST_INFO AS RI 
LEFT OUTER JOIN 
(SELECT REST_ID, ROUND(AVG(REVIEW_SCORE), 2) AS SCORE 
        FROM REST_REVIEW GROUP BY REST_ID) AS RR 
ON RI.REST_ID = RR.REST_ID 
ORDER BY RR.SCORE DESC, RI.FAVORITES DESC

오답 이유 : 서울에 위치한 식당들 필터링하지 않았음
 
두번째 내가 쓴 답

SELECT RI.REST_ID, RI.REST_NAME, RI.FOOD_TYPE, 
RI.FAVORITES, RI.ADDRESS, RR.SCORE
FROM REST_INFO AS RI 
INNER JOIN 
(SELECT REST_ID, ROUND(AVG(REVIEW_SCORE), 2) AS SCORE 
        FROM REST_REVIEW GROUP BY REST_ID) AS RR 
ON RI.REST_ID = RR.REST_ID 
WHERE RI.ADDRESS LIKE ('%서울%')
ORDER BY RR.SCORE DESC, RI.FAVORITES DESC

오답 이유 : INNER JOIN과 LEFT OUTER  JOIN의 차이일 거라 생각했으나 여기서 '서울%'로 문자 포함 조건을 변경하면 정답처리됨
 
세번째 내가 쓴 답

SELECT RI.REST_ID, RI.REST_NAME, RI.FOOD_TYPE, 
RI.FAVORITES, RI.ADDRESS, RR.SCORE
FROM REST_INFO AS RI 
LEFT OUTER JOIN
(SELECT REST_ID, ROUND(AVG(REVIEW_SCORE), 2) AS SCORE 
        FROM REST_REVIEW GROUP BY REST_ID) AS RR 
ON RI.REST_ID = RR.REST_ID 
WHERE RI.ADDRESS LIKE ('%서울%')
ORDER BY RR.SCORE DESC, RI.FAVORITES DESC

 

오답 이유 : INNER JOIN과 LEFT OUTER  JOIN의 차이일 거라 생각했으나 INNER JOIN 후 '서울%'로 문자 포함 조건을 변경하면 정답이었음
 
마지막으로 내가 쓴 답(최종 정답)

SELECT RI.REST_ID, RI.REST_NAME, RI.FOOD_TYPE, 
RI.FAVORITES, RI.ADDRESS, ROUND(AVG(RR.REVIEW_SCORE),2) AS SCORE
FROM REST_INFO AS RI 
INNER JOIN REST_REVIEW AS RR
ON RI.REST_ID = RR.REST_ID 
WHERE RI.ADDRESS LIKE ('서울%')
GROUP BY RI.REST_ID
ORDER BY SCORE DESC, RI.FAVORITES DESC

 

5. 코딩테스트 연습 > SELECT > 잔챙이 잡은 수 구하기

문제 설명
낚시앱에서 사용하는 FISH_INFO 테이블은 잡은 물고기들의 정보를 담고 있습니다. FISH_INFO 테이블의 구조는 다음과 같으며 ID, FISH_TYPE, LENGTH, TIME은 각각 잡은 물고기의 ID, 물고기의 종류(숫자), 잡은 물고기의 길이(cm), 물고기를 잡은 날짜를 나타냅니다.

단, 잡은 물고기의 길이가 10cm 이하일 경우에는 LENGTH 가 NULL 이며, LENGTH 에 NULL 만 있는 경우는 없습니다.
문제
잡은 물고기 중 길이가 10cm 이하인 물고기의 수를 출력하는 SQL 문을 작성해주세요.
물고기의 수를 나타내는 컬럼 명은 FISH_COUNT로 해주세요.
예시
예를 들어 FISH_INFO 테이블이 다음과 같다면

물고기 ID가 4, 5인 물고기들의 길이가 NULL, 즉 10cm 이하이므로 총 2마리 입니다. 따라서 결과는 다음과 같습니다.

 
내가 쓴 답

SELECT COUNT(*) AS FISH_COUNT FROM FISH_INFO
    WHERE ISNULL (LENGTH);