코딩테스트/SQL

[코딩테스트] 프로그래머스 SQL SUM, MAX, MIN

[dev] hiro 2024. 11. 5. 01:08
제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
Programmers SQL 고득점 Kit(SUM, MAX, MIN)입니다.

가장 비싼 상품 구하기

SELECT
    MAX(PRICE) AS MAX_PRICE
FROM PRODUCT
  • MAX 함수를 사용하여 PRODUCT 테이블의 PRICE 중 가장 값이 비싼 가격을 조회합니다.

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

-- 첫번째 방법
SELECT
    A.PRODUCT_ID,
    A.PRODUCT_NAME,
    A.PRODUCT_CD,
    A.CATEGORY,
    A.PRICE
FROM FOOD_PRODUCT A, (
    SELECT MAX(PRICE) AS MAX_PRICE
    FROM FOOD_PRODUCT
) B
WHERE A.PRICE = B.MAX_PRICE;

-- 두번째 방법
SELECT *
FROM FOOD_PRODUCT
ORDER BY PRICE DESC
FETCH NEXT 1 ROWS ONLY
  • 첫번째 방법
    • 가장 비싼 값을 구하여 natural join 합니다.
      (FROM FOOD_PRODUCT A, (
          SELECT MAX(PRICE) AS MAX_PRICE
          FROM FOOD_PRODUCT) B)
    • 이후 WHERE 절을 통해 비교하여 가장 비싼 가격을 가진 상품의 정보를 출력합니다.
      (WHERE A.PRICE = B.MAX_PRICE;)

  • 두번째 방법
    • PRICE를 기준으로 내림차순 정렬합니다.
      (ORDER BY PRICE DESC)
    • FETCH NEXT N ROWS 절을 이용하여 첫번째 레코드를 조회합니다.
      (FETCH NEXT 1 ROWS ONLY)

최대값 구하기

SELECT
    MAX(DATETIME) AS "시간"
FROM ANIMAL_INS;
  • DATETIME도 MAX를 사용할 수 있습니다.
    가장 최근에 들어온 동물이 가장 큰 값이므로 MAX함수를 사용합니다.
    (MAX(DATETIME) AS "시간")

최솟값 구하기

SELECT
    MIN(DATETIME) AS "시간"
FROM ANIMAL_INS;
  • DATETIME도 MIN를 사용할 수 있습니다.
    가장 먼저 들어온 동물이 가장 작은 값이므로 MIN함수를 사용합니다.
    (MIN(DATETIME) AS "시간")

동물 수 구하기

SELECT
    COUNT(*)
FROM ANIMAL_INS
  • 동물 보호소에 들어온 동물의 수를 조회하기 위해 COUNT함수를 사용합니다.
    (SELECT COUNT(*))

중복 제거하기

SELECT
    COUNT(DISTINCT NAME)
FROM ANIMAL_INS
  • 동물 보호소에 들어온 동물의 이름을 조회하기 위해 COUNT함수를 사용합니다.
    또 중복된 이름은 하나로 쳐야하므로 DISTINCT 키워드를 사용합니다.
    (SELECT COUNT(DISTINCT NAME))
  • DISTINCT는 NULL을 세지 않습니다.

조건에 맞는 아이템들의 가격의 총합 구하기

SELECT
    SUM(PRICE) AS TOTAL_PRICE
FROM ITEM_INFO
WHERE RARITY = 'LEGEND'
  • 희귀도가 LEGEND인 ITEM을 조회합니다.
    (WHERE RARITY = 'LEGEND')
  • 해당 아이템의 가격의 총합을 구합니다.
    (SELECT SUM(PRICE) AS TOTAL_PRICE)

물고기 종류 별 대어찾기

SELECT 
    F1.ID,
    FNI.FISH_NAME,
    F1.LENGTH
FROM 
    FISH_INFO F1
JOIN 
    FISH_NAME_INFO FNI ON F1.FISH_TYPE = FNI.FISH_TYPE
JOIN 
    (SELECT FISH_TYPE, MAX(LENGTH) AS MAX_LENGTH
     FROM FISH_INFO
     WHERE LENGTH IS NOT NULL
     GROUP BY FISH_TYPE) AS F2
     ON F1.FISH_TYPE = F2.FISH_TYPE AND F1.LENGTH = F2.MAX_LENGTH
ORDER BY 
    F1.ID ASC;
  • FISH_INFO와 FISH_NAME_INFO를 FISH_TYPE을 기준으로 조인합니다.
    (FROM FISH_INFO F1 JOIN FISH_NAME_INFO FNI ON F1.FISH_TYPE = FNI.FISH_TYPE)
  • 물고기 종류 별로 묶어야 하기에 GROUP BY를 FISH_TYPE으로 지정한 후, FISH_TYPE에 따라 가장 큰 LENGTH를 조회합니다.
    이후 FISH_TYPE과 LENGTH를 통해 조인합니다.
JOIN (
    SELECT FISH_TYPE, MAX(LENGTH) AS MAX_LENGTH
     FROM FISH_INFO
     WHERE LENGTH IS NOT NULL
     GROUP BY FISH_TYPE
    ) AS F2 ON F1.FISH_TYPE = F2.FISH_TYPE AND F1.LENGTH = F2.MAX_LENGTH
  • 물고기의 ID를 통해 오름차순 정렬합니다.

잡은 물고기 중 가장 큰 물고기의 길이 구하기

SELECT
    CONCAT(MAX(LENGTH), "cm") AS MAX_LENGTH
FROM FISH_INFO;
  • 가장 큰 물고기의 길이를 구하기 위해 MAX 함수를 사용하고 문자열의 더하기를 위한 CONCAT 함수를 사용합니다.
    (SELECT CONCAT(MAX(LENGTH), "cm") AS MAX_LENGTH)

연도별 대장균 크기의 편차 구하기

SELECT
    Year(E.DIFFERENTIATION_DATE) AS YEAR,
    ABS(E.SIZE_OF_COLONY - R.MAX_SIZE) AS YEAR_DEV,
    E.ID
FROM
    ECOLI_DATA E
JOIN (
    SELECT
        Year(DIFFERENTIATION_DATE) AS YEAR,
        MAX(SIZE_OF_COLONY) AS MAX_SIZE
    FROM ECOLI_DATA
    GROUP BY YEAR
) R ON R.YEAR = Year(E.DIFFERENTIATION_DATE)
ORDER BY
    R.YEAR ASC,
    ABS(E.SIZE_OF_COLONY - R.MAX_SIZE) ASC;
  • 연도를 구하기 위해 YEAR 함수를 사용하고 연도에 따른 가장 큰 대장균 크기를 구하기 위한 테이블 R을 구합니다.
(
    SELECT
        Year(DIFFERENTIATION_DATE) AS YEAR,
        MAX(SIZE_OF_COLONY) AS MAX_SIZE
    FROM ECOLI_DATA
    GROUP BY YEAR
) R
  • 해당 년도의 가장 큰 대장균과의 편차를 구하기 위해 YEAR을 통해 JOIN을 합니다.
    (FROM ECOLI_DATA E JOIN (...) ON R.YEAR = Year(E.DIFFERENTIATION_DATE))
  • 편차의 절댓값을 위해 ABS 함수를 사용합니다.
    (ABS(E.SIZE_OF_COLONY - R.MAX_SIZE) AS YEAR_DEV)
  • 연도에 대해 오름차순 정렬하고 크기 편차에 대해 오름차순으로 정렬합니다.