항해99 온보딩 스터디[SQL 학습] 15일차

Hohomi·2023년 3월 23일
0
post-thumbnail

스터디 15일차 : SQL 문제 풀이

온보딩 스터디 15일차에는 프로그래머스에서 SQL 문제를 풀기 시작했다. java 알고리즘 문제에 비해서는 쉬웠다. 초반에는 같은 조원분의 말씀처럼 '힐링'되는 느낌ㅋㅋ이었는데, 후반으로 가면서 다뤄야 할 데이터가 많아지거나 조건이 까다로워질수록 서브쿼리를 써야 하는 등의 복잡한 문제들이 등장하기 시작했다.


🫧 CASE문

경기도에 위치한 식품창고 목록 출력하기

문제 :
FOOD_WAREHOUSE 테이블에서 경기도에 위치한 창고의 ID, 이름, 주소, 냉동시설 여부를 조회하는 SQL문을 작성해주세요. 이때 냉동시설 여부가 NULL인 경우, 'N'으로 출력시켜 주시고 결과는 창고 ID를 기준으로 오름차순 정렬해주세요.

SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS,
CASE
WHEN FREEZER_YN IS NULL THEN 'N'
ELSE FREEZER_YN END
FROM FOOD_WAREHOUSE
WHERE WAREHOUSE_NAME LIKE '%경기%'
ORDER BY WAREHOUSE_ID
  • case문을 쓰는 문제였다. 사용 예시를 눈에 익혀두면 좋을 거 같다.
  • 이 문제의 경우 Freezer 여부가 yes이면 그대로 출력하게끔 하기 위해 ELSE 뒤에 FREEZER_YN을 그대로 넣어주었다.
  • case문은 반드시 end로 끝낼 것
  • 문제에서 '경기도에 위치한'을 못 봐서 계속 오답이 났었다. 문제를 잘 보는 것도 중요!

🫧 MAX

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

문제 : FOOD_PRODUCT 테이블에서 가격이 제일 비싼 식품의 식품 ID, 식품 이름, 식품 코드, 식품분류, 식품 가격을 조회하는 SQL문을 작성해주세요.

SELECT * FROM FOOD_PRODUCT
WHERE PRICE IN (
SELECT MAX(PRICE) FROM FOOD_PRODUCT
)
  • 나의 오답 : select 안에서 다른 필드와 함께 max(price)를 바로 썼는데, 가격이 큰 데이터가 조회되긴 했으나 오답이었다.
  • 조건이 '가격이 제일 비싼 식품을 먼저 구한 다음 그것의 정보를 쭉 가져오는 것'이니, where절로 price의 조건에 맞는 데이터를 가져온 다음 -> 그 데이터의 전체 정보를 select 해야 한다.
  • 서브쿼리 사용 예시!

🫧 GROUP BY, HAVING

동명 동물 수 찾기
문제: 동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.

SELECT NAME, COUNT(NAME) FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) > 1
ORDER BY NAME
  • GROUP BY는 특정 컬럼별로 데이터를 그룹지어주는 역할을 하며, 중복된 열을 제거한다.
  • 이 문제에서는 이름은 같되 타입 등은 다른 데이터를 찾는 거여서 중복을 제거하는 기능이 쓰이지는 않았다.
  • HAVING은 GROUP BY를 한 결과에 조건을 붙일 때 쓴다. WHERE절과 비슷하다.



참고자료

프로그래머스 코딩테스트 연습 - MySQL

GROUP BY와 HAVING

profile
게발로 개발하기

0개의 댓글