[코테준비]/[코테준비]SQL

SQL 고득점 kit - Sum, Max, Min

bestFinanceDataAnalyist 2024. 8. 4. 20:17

프로그래머스 SQL 고득점 Kit 연습풀이입니다. 모든 문제의 저작권은 프로그래머스에게 있으며 문제가 됐을 시 삭제하겠습니다.

https://school.programmers.co.kr/learn/courses/30/parts/17043

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


SQL 고득점 Kit - Sum, Max, Min입니다.

문제 순서는 다음과 같습니다

1) 가장 비싼 상품 구하기 - Lv1
2) 가격이 제일 비싼 식품의 정보 출력하기 - Lv2
3) 최댓값 구하기 - Lv1
4) 최솟값 구하기 - Lv2
5) 동물의 수 구하기 - Lv2
6) 중복 제거하기 - Lv2
7) 조건에 맞는 아이템들의 가격의총합 구하기 - Lv2
8) 물고기 종류 별 대어 찾기 - Lv3
9) 잡은 물고기 중 가장 큰 물고기의 길이 구하기 - Lv2
10) 연도별 대장균 크기의 편차 구하기 - Lv2

문제이름: 가장 비싼 상품 구하기 - Lv1

https://school.programmers.co.kr/learn/courses/30/lessons/131697

문제풀이

1) From- 테이블 코드

2) Select - 가장 비싼 상품 == 가장 비싼 가격 == max이용

전체코드

SELECT MAX(PRICE) AS MAX_PRICE
FROM PRODUCT

 

 

 


문제이름: 가격이 제일 비싼 식품의 정보 출력하기 - Lv2

문제풀이

1) 문제에서 요구한 열, 테이블 입력

2) 최댓값 : ORDER BY 정렬 > LIMIT1 (행1개만 뽑기)

전체코드

SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM FOOD_PRODUCT
ORDER BY PRICE DESC
LIMIT 1;

**혹은 서브쿼리로 풀고 싶다
SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM FOOD_PRODUCT
WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_FRODUCT );
** 위의 MAX를 박아버리면, MAX인 행만 뽑는 게 아니라 테이블의 모든 행이 출력되고 PRICE만 MAX값이 뽑힙

문제이름: 최댓값 구하기 - Lv1

https://school.programmers.co.kr/learn/courses/30/lessons/59415

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제풀이

1) FROM - 테이블명 입력하기

2) SELECT - 날짜 그대로 입력(DATEFORMAT 안써도 됨)

3) 정렬 후 1개만 추출 >> Limit 이용

 

전체코드

SELECT DATETIME AS 시간
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1;

 


문제이름: 최솟값 구하기 - lv2

https://school.programmers.co.kr/learn/courses/30/lessons/59038

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제풀이

1) 위의 문제를 이해한다면 바로 풀 수 있다 ! 정렬만 오름차순으로 바꿔준다

전체코드

SELECT DATETIME AS 시간
FROM ANIMAL_INS
ORDER BY DATETIME ASC
LIMIT 1;

 


문제이름: 동물의 수 구하기 - Lv2

https://school.programmers.co.kr/learn/courses/30/lessons/59406

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제풀이

1) 개수 샐 때 쓰는 함수? > count

2) from 에는 그대로 테이블 입력하면 된다.

SELECT COUNT(*)
FROM ANIMAL_INS

문제이름: 중복 제거하기 - Lv2

https://school.programmers.co.kr/learn/courses/30/lessons/59408

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제풀이

1) 중복제거 : distinct  / 숫자세기: count  >> 순서는 c부터! 라고 생각하면 된다.

SELECT DISCINT(COUNT(NAME))  >> 틀림
FROM ANIMAL_INS

SELECT COUNT(DISTINCT(NAME))  >> 맞음
FROM ANIMAL_INS

 

전체코드

SELECT COUNT(DISTINCT(NAME))
FROM ANIMAL_INS

 


문제이름: 조건에 맞는 아이템들의 가격의총합 구하기 - Lv2

https://school.programmers.co.kr/learn/courses/30/lessons/273709

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제풀이

1) 가격의 합 = "sum"

2) 나머지 테이블 명과, 회귀도 조건은 테이블 열이름과 결과 화면을 참고한다

 

전체코드

SELECT SUM(PRICE) AS TOTAL_PRICE
FROM ITEM_INFO
WHERE RARITY="LEGEND"


8) 문제이름: 물고기 종류 별 대어 찾기 - Lv3

https://school.programmers.co.kr/learn/courses/30/lessons/293261

문제풀이

1) from 절은 fish_info와 fish_name_info 두 테이블을 inner join하여 공통 열(on)로 결합해준다.

2) 각 fish_type마다 가장 길이가 큰 물고기를 뽑아야 하므로 서브쿼리를 이용한다.

3) 서브쿼리 작성법 : where 안에 작성한다. 가장 큰 max값을 여기서 뽑아주면 된다.

4) fish type마다 묶어야 하므로 처음에는 

# SELECT ID, FISH_NAME, LENGTH
# FROM FISH_INFO AS A INNER JOIN FISH_NAME_INFO AS B
# ON A.FISH_TYPE = B.FISH_TYPE
# WHERE LENGTH = (SELECT MAX(LENGTH)
#             FROM FISH_INFO
#             GROUP BY FISH_TYPE)
# ORDER BY ID

 

이렇게 작성했다. 하지만 문제가 발생한다.

 where 절에는 기본적으로 하나의 값을 기대하는데, 저렇게 하면 여러 행을 반환하기 때문에 에러가 발생한다!!

이럴 땐 in을 사용한다

 

그래도 틀림

GROUP BY를 사용하여 FISH_TYPE별로 최대 길이를 구하였으므로, WHERE LENGTH IN (...) 절이 FISH_TYPE별로 적절한 최대 길이를 필터링하지 않아 오류...

FISH_TYPE별로 최대 길이를 올바르게 필터링하려면 서브쿼리를 통해 각 FISH_TYPE에 대해 최대 길이를 구하고, 이를 메인 쿼리와 조인해야 함

 

전체코드

SELECT A.ID, B.FISH_NAME, A.LENGTH
FROM FISH_INFO AS A INNER JOIN FISH_NAME_INFO AS B 
ON A.FISH_TYPE = B.FISH_TYPE
WHERE A.LENGTH = (
    SELECT MAX(LENGTH)
    FROM FISH_INFO AS F
    WHERE F.FISH_TYPE = A.FISH_TYPE
)
ORDER BY A.ID;

 

 

+  IN   vs    =   vs    EXIST

1) =

 

  • = 연산자는 서브쿼리가 정확히 하나의 값을 반환할 때 사용합니다.
  • 서브쿼리가 여러 값을 반환하면 에러가 발생합니다. 이 연산자는 정확히 하나의 값을 기대하고 비교합니다

2) in

 

  • IN 연산자는 서브쿼리가 여러 값을 반환할 수 있을 때 사용합니다.
  • 서브쿼리가 여러 값을 반환해도 괜찮으며, 이 값들 중 하나와 비교해서 일치하는 것을 찾습니다

3) exist

 

  • EXISTS는 서브쿼리에서 조건을 만족하는 행이 존재하는지 여부를 확인합니다.
  • 서브쿼리의 결과가 존재하면 TRUE를 반환하고, 존재하지 않으면 FALSE를 반환합니다.

 

 

 


9) 문제이름 : 잡은 물고기 중 가장 큰 물고기의 길이 구하기 - Lv2

https://school.programmers.co.kr/learn/courses/30/lessons/298515

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제풀이

1) 최댓값 뽑기 : MAX

2) 문자열 합치기 : CONCAT (합칠문자1, 합칠문자2)

 

 

전체코드

SELECT CONCAT(MAX(LENGTH),'cm') AS MAX_LENGTH
FROM FISH_INFO


10) 문제이름: 연도별 대장균 크기의 편차 구하기 - Lv 2

https://school.programmers.co.kr/learn/courses/30/lessons/299310

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제풀이

1) WITH 테이블이름 AS ( )  이용

2) 우선 년도별 가장 큰 아이를 구하는 걸 서브쿼리에서 진행

3) 그리고 연도를 기준으로 다시 묶고 편차를 구하는 걸 메인쿼리에서 하면 끝~!

 

전체코드

WITH T1 AS (SELECT MAX(SIZE_OF_COLONY) AS BEST, YEAR(DIFFERENTIATION_DATE) AS YEAR
       FROM ECOLI_DATA 
       GROUP BY YEAR(DIFFERENTIATION_DATE) )
SELECT YEAR(A.DIFFERENTIATION_DATE) AS YEAR,
       (T.BEST-A.SIZE_OF_COLONY) AS YEAR_DEV,
       A.ID
FROM ECOLI_DATA A
JOIN T1 T ON YEAR(A.DIFFERENTIATION_DATE) = T.YEAR
ORDER BY YEAR(A.DIFFERENTIATION_DATE) ASC, (T.BEST-A.SIZE_OF_COLONY) ASC