코딩테스트/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;)
- 가장 비싼 값을 구하여 natural join 합니다.
- 두번째 방법
- PRICE를 기준으로 내림차순 정렬합니다.
(ORDER BY PRICE DESC) - FETCH NEXT N ROWS 절을 이용하여 첫번째 레코드를 조회합니다.
(FETCH NEXT 1 ROWS ONLY)
- PRICE를 기준으로 내림차순 정렬합니다.
최대값 구하기
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) - 연도에 대해 오름차순 정렬하고 크기 편차에 대해 오름차순으로 정렬합니다.