안녕하세요.
오늘은 프로그래머스 SQL 고득점 Kit의 SUM, MAX, MIN 문제들을 정리해보겠습니다.
⚠️ 저의 정답이 항상 최고의 방법은 아닐 수 있습니다.
✨ 표시는 중요하다고 판단한 문제입니다.
✨가격이 제일 비싼 식품의 정보 출력하기
SELECT *
FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT);
✨가장 비싼 상품 구하기
SELECT MAX(PRICE) AS MAX_PRICE FROM PRODUCT;
✨최댓값 구하기
SELECT MAX(DATETIME) AS '시간' FROM ANIMAL_INS;
✨최솟값 구하기
SELECT MIN(DATETIME) AS '시간' FROM ANIMAL_INS;
✨동물 수 구하기
SELECT COUNT(*) FROM ANIMAL_INS;
✨중복 제거하기
SELECT COUNT(NAME)
FROM (SELECT DISTINCT NAME FROM ANIMAL_INS) AS DISTINCT_NAME;
# 아래의 쿼리는 위와 똑같은 쿼리이다.
# SELECT COUNT(DISTINCT_NAME.NAME)
# FROM (SELECT DISTINCT NAME FROM ANIMAL_INS) AS DISTINCT_NAME;
derived table은 alias를 꼭 붙여야한다.
derived table(파생 테이블)은 FROM절 안에 작성된 서브쿼리입니다.
(위의 쿼리에서는 'SELECT DSTINCT NAME FROM ANIMAL_INS' 가 서브쿼리)
쿼리 실행 시점에 만들어지는 임시테이블이므로, SQL 엔진이 오이부 쿼리에서 이 테이블을 인식하기 위하여 별칭이 꼭 필요합니다.
✨조건에 맞는 아이템들의 가격 총합 구하기
SELECT SUM(PRICE) AS TOTAL_PRICE
FROM
(SELECT PRICE
FROM ITEM_INFO
WHERE RARITY = 'LEGEND'
) AS LEGEND;
위의 쿼리에서도 마찬가지로, 파생테이블이므로 'LEGEND' 라는 alias를 붙여주었습니다.
✨물고기 종류 별 대어 찾기
-- 1. 서브쿼리 + JOIN 사용 (MySQL기준 성능 좋음)
SELECT A.ID, B.FISH_NAME, A.LENGTH
FROM FISH_INFO A
JOIN FISH_NAME_INFO B
ON A.FISH_TYPE = B.FISH_TYPE
JOIN (
SELECT FISH_TYPE, MAX(LENGTH) AS MAX_LEN
FROM FISH_INFO
GROUP BY FISH_TYPE
) M
ON A.FISH_TYPE = M.FISH_TYPE
AND A.LENGTH = M.MAX_LEN;
-- 2. CTE 방식 (가독성 좋음)
# WITH C AS (
# SELECT FISH_TYPE, MAX(LENGTH) AS LENGTH
# FROM FISH_INFO
# GROUP BY FISH_TYPE
# )
# SELECT A.ID, B.FISH_NAME, C.LENGTH
# FROM FISH_INFO A
# JOIN FISH_NAME_INFO B
# ON A.FISH_TYPE = B.FISH_TYPE
# JOIN C
# ON A.FISH_TYPE = C.FISH_TYPE AND A.LENGTH = C.LENGTH
# ORDER BY A.ID;
JOIN을 2~3번 더 하는 것은 성능에 큰 차이가 없으므로, CTE에 FISH_NAME은 포함시키지 않는 것이 좋습니다.
(불필요한 데이터 스캔이나 중복 계산을 피하는 것이 더 중요합니다.)
✨잡은 물고기 중 가장 큰 물고기의 길이 구하기
SELECT CONCAT(MAX(LENGTH), 'cm') AS MAX_LENGTH
FROM FISH_INFO;
MAX(LENGTH)로 최댓값을 먼저 구한 다음에 'cm'을 붙여줘야 합니다.
'cm'을 붙이고 MAX를 계산하면 문자열 크기를 비교(사전순으로)하여 결과값이 달라지기 때문입니다.
예) '9cm' > '10cm'
✨연도별 대장균 크기의 편차 구하기
