[MySQL] 프로그래머스 문제 연습 10

Lake·2024년 5월 1일
0

SQL 문제

목록 보기
13/36
post-thumbnail

대여 기록이 존재하는 자동차 리스트 구하기 (STRING, DATE)

  • CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 자동차 종류가 '세단'인 자동차들 중 10월에 대여를 시작한 기록이 있는 자동차 ID 리스트를 출력하는 SQL문을 작성해주세요. 자동차 ID 리스트는 중복이 없어야 하며, 자동차 ID를 기준으로 내림차순 정렬해주세요.

제출한 쿼리 :

SELECT DISTINCT C.CAR_ID
FROM CAR_RENTAL_COMPANY_CAR C
LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H
ON C.CAR_ID = H.CAR_ID
WHERE CAR_TYPE = '세단'
    AND DATE_FORMAT(H.START_DATE, '%m') = '10'
ORDER BY CAR_ID DESC;

모든 레코드 조회하기 (SELECT)

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

제출한 쿼리 :

SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

즐겨찾기가 가장 많은 식당 정보 출력하기 (GROUP BY)

  • REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.

제출한 쿼리 :

SELECT FOOD_TYPE
       , REST_ID
       , REST_NAME
       , FAVORITES
FROM REST_INFO 
WHERE (FOOD_TYPE, FAVORITES) IN(
    SELECT FOOD_TYPE, MAX(FAVORITES)
    FROM REST_INFO
    GROUP BY FOOD_TYPE
    )
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC;

참고 :
완전 동일한 유형의 문제
해설

다른 방법들 :

ROW_NUMBER()와 PARTITION BY 사용하기
SELECT FOOD_TYPE
       , REST_ID
       , REST_NAME
       , FAVORITES
FROM (SELECT FOOD_TYPE
             , REST_ID
             , REST_NAME
             , FAVORITES
             , ROW_NUMBER() OVER(PARTITION BY FOOD_TYPE 
  							ORDER BY FAVORITES DESC) AS RNUM 
      FROM REST_INFO) A
 WHERE RNUM = 1
 ORDER BY FOOD_TYPE DESC;

ROW_NUMBER() 대신 RANK()도 사용 가능

WITH절 사용하기
WITH CTE AS (
             SELECT FOOD_TYPE
                    , MAX(FAVORITES) AS MAX_FAV
             FROM REST_INFO
             GROUP BY FOOD_TYPE
            )

SELECT A1.FOOD_TYPE
       , A1.REST_ID
       , A1.REST_NAME
       , A1.FAVORITES
FROM REST_INFO A1
     , CTE A2
WHERE A1.FOOD_TYPE = A2.FOOD_TYPE 
    AND A1.FAVORITES = A2.MAX_FAV
GROUP BY FOOD_TYPE 
ORDER BY FOOD_TYPE DESC;

WITH 절에 대한 설명

조인 사용하기
SELECT I1.FOOD_TYPE
       , I1.REST_ID
       , I1.REST_NAME
       , I1.FAVORITES 
FROM REST_INFO AS I1
LEFT JOIN REST_INFO I2
ON I1.FAVORITES < I2.FAVORITES
    AND I1.FOOD_TYPE = I2.FOOD_TYPE
WHERE I2.REST_ID IS NULL
ORDER BY I1.FOOD_TYPE DESC;

Alias를 활용하여 같은 테이블의 컬럼 조인이 가능하다.


식품분류별 가장 비싼 정보 조회하기 (GROUP BY)

  • FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.

제출한 쿼리 :

WITH CTE AS (
            SELECT CATEGORY
                   , MAX(PRICE) AS "MAX_PRICE" 
                   , PRODUCT_NAME AS "PRODUCT_NAME"
            FROM FOOD_PRODUCT
            WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
            GROUP BY CATEGORY
            ORDER BY PRICE DESC
            )

SELECT * 
FROM CTE
GROUP BY CATEGORY

5월 식품들의 총매출 조회하기 (JOIN)

  • FOOD_PRODUCTFOOD_ORDER 테이블에서 생산일자가 2022년 5월인 식품들의 식품 ID, 식품 이름, 총매출을 조회하는 SQL문을 작성해주세요. 이때 결과는 총매출을 기준으로 내림차순 정렬해주시고 총매출이 같다면 식품 ID를 기준으로 오름차순 정렬해주세요.

제출한 코드 :

SELECT P.PRODUCT_ID
       , P.PRODUCT_NAME
       , (P.PRICE * SUM(O.AMOUNT)) AS "TOTAL_SALES"
FROM FOOD_PRODUCT AS P
LEFT JOIN FOOD_ORDER AS O
ON P.PRODUCT_ID = O.PRODUCT_ID
WHERE O.PRODUCE_DATE LIKE "2022-05%"
GROUP BY P.PRODUCT_ID
ORDER BY TOTAL_SALES DESC, P.PRODUCT_ID ASC;

오늘의 TMI

아무것도 안 했는데 벌써 5월이라는 사실에 매우 놀람 >~<

0개의 댓글