가격이 제일 비싼 식품의 정보 출력하기

Suhyeon Lee·2024년 9월 14일
0

출처: 프로그래머스 스쿨

테이블 정보

  • food_product: 식품의 정보를 담은 테이블
PRODUCT_IDPRODUCT_NAMEPRODUCT_CDCATEGORYPRICE
P0018맛있는고추기름CD_OL00008식용유6100
P0019맛있는카놀라유CD_OL00009식용유5100
P0020맛있는산초유CD_OL00010식용유6500
P0021맛있는케첩CD_OL00001소스4500
P0022맛있는마요네즈CD_OL00002소스4700

→ PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE는 식품 ID, 식품 이름, 식품 코드, 식품분류, 식품 가격을 의미를 나타냄

Column nameTypeNullable
PRODUCT_IDVARCHAR(10)FALSE
PRODUCT_NAMEVARCHAR(50)FALSE
PRODUCT_CDVARCHAR(10)TRUE
CATEGORYVARCHAR(10)TRUE
PRICENUMBERTRUE

문제

FOOD_PRODUCT 테이블에서 가격이 제일 비싼 식품의 식품 ID, 식품 이름, 식품 코드, 식품분류, 식품 가격을 조회하는 SQL문을 작성해주세요.

PRODUCT_IDPRODUCT_NAMEPRODUCT_CDCATEGORYPRICE
P0020맛있는산초유CD_OL00010식용유6500

풀이 과정

  • 가격이 가장 비싼 → MAX(price)
  • 전체 테이블에서 특정 조건 고르기 → WHERE
    • price가 MAX(price)인 경우 고르기 → WHERE price IN(SELECT MAX(price) FROM food_product)
SELECT *
FROM food_product
WHERE price IN(SELECT MAX(price)
               FROM food_product
              );

질문: select에서 바로 max(price) 하면 안 되나요?

SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, MAX(PRICE) AS PRICE
FROM FOOD_PRODUCT
  • 해당 쿼리는 가격이 최대인 상품과 최대 가격이 매칭 되지 않음
    • FOOD_PRODUCT 테이블의 첫번째 행의 데이터 + 테이블에서 가격 비싼 가격 만 나옴
      (PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY 는 해당 값과 동일한 값이 출력되는데 MAX(PRICE)는 최대값인 가격만 따로 출력됨)
    • 가격이 가장 비싼 row 를 가져올 것 같지만 테이블의 첫 번째 행 데이터에 가격만 MAX값으로 합쳐서 나오는 것
  • WHERE 절로 매핑을 하지 않아서 각 컬럼의 행의 매칭이 되질 않고 PRICE를 그룹함수로 지정했기 때문에 나머지 SELECT 컬럼 모두 GROUP BY 해야 한다고 함(위의 구문은 구문오류임)
  • 먼저 MAX(PRICE) 값을 SELECT 하시고 WHERE 절에서 PRICE가 최대값인지 찾아야 함
    • 최대 가격을 뽑아내고 그 가격에 맞는 값들을 출력
SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT);

추가

  • where절에 서브쿼리 쓰면 레코드마다 서브쿼리 실행하니까 낭비라고 함

    • set 변수를 생성해서 순번 매기기

      set @mx := (select max(price) from food_product);
      
      select *
      from food_product
      where price = @mx
  • rank를 이용해서 풀어도 될 것 같다.

SELECT product_id, product_name, product_cd, category, price
FROM (SELECT *, RANK() OVER (ORDER BY price DESC) ranking
     FROM food_product
     ) a
WHERE ranking = 1;
profile
2 B R 0 2 B

0개의 댓글