SQL 고득점 kit - Sum, Max, Min
프로그래머스 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