문제 1. 없어진 기록 찾기
천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
💡 문제 풀이
- left join으로 animal_outs 테이블에 데이터가 있지만 animal_ins테이블에서 null 값인 데이터 찾기
- -- 조회 : 동물ID
-- 조인키 : animal_id
-- 조건 : 보호소에 들어온 기록 없는 동물 (outs테이블에 있는데 ins에 없는 동물)
-- 정렬 : 동물id asc
SELECT o.animal_id, o.name
FROM animal_outs o
LEFT JOIN animal_ins i
ON o.animal_id = i.animal_id
WHERE i.animal_id IS NULL
ORDER BY o.animal_id asc;
문제 2. 과일로 만든 아이스크림 고르기
상반기 아이스크림 총주문량이 3,000보다 높으면서 아이스크림의 주 성분이 과일인 아이스크림의 맛을 총주문량이 큰 순서대로 조회하는 SQL 문을 작성해주세요.
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
💡 문제 풀이
- -- 조회 : 아이스크림 맛
-- 조인키 : flavor
-- 조건1 : 총주문량이 3000 초과
-- 조건2 : 아이스크림주성분이 과일
-- 정렬 : 총주문량 desc
SELECT f.flavor
FROM first_half f
LEFT JOIN icecream_info i
ON f.flavor = i.flavor
WHERE i.ingredient_type = 'fruit_based'
AND total_order > 3000
ORDER BY total_order desc;
`복습하기★`
문제 3. 재구매가 일어난 상품과 회원 리스트
ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요. 결과는 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
💡 문제 풀이
- GROUP BY 여러개의 칼럼 : 모든 경우의 수로 그룹을 만들수 있음
ex) Group by 지역, 성별 >> 서울 남성, 서울 여성, 경기도 남성, 경기도 여성 ... 이렇게 그룹이 만들어짐 - GROUP했으니 HAVING절로 조건 걸기
- -- 조회 : 회원ID, 상품ID
-- 조건 : 동일한 회원이 동일한 상품을 재구매한 경우
-- 그룹 : 한 회원이 여러 상품을 재구매했을 수 있기 때문에 user_id, prodcut_id 둘 다 걸기
-- 정렬 : 회원ID asc, 상품ID desc
SELECT user_id, product_id
FROM online_sale
GROUP BY user_id, product_id
HAVING count(product_id) >=2
ORDER BY user_id asc, product_id desc;
문제 4. 최댓값 구하기
가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
💡 문제 풀이
- 가장 늦은 시간은 max(datetime)으로 구할 수 있음
SELECT max(datetime)
FROM animal_ins
`복습하기★`
문제 5. 조건에 맞는 사용자 정보 조회
USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 중고 거래 게시물을 3건 이상 등록한 사용자의 사용자 ID, 닉네임, 전체주소, 전화번호를 조회하는 SQL문을 작성해주세요. 이때, 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력되도록 해주시고, 전화번호의 경우 xxx-xxxx-xxxx 같은 형태로 하이픈 문자열(-)을 삽입하여 출력해주세요. 결과는 회원 ID를 기준으로 내림차순 정렬해주세요.
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
💡 문제 풀이
- concat을 통한 문자열 조합, substr을 통한 문자열 편집 활용
- user_id가 중복없이 나오게 group하고 having으로 조건 걸기
- -- 조회: 사용자 ID, 닉네임, 전체주소, 전화번호
-- 조인키: b.writer_id = u.user_id
-- 조건: 중고 거래 게시물을 3건 이상 등록한 사용자
-- 표현: 전체 주소는 시, 도로명 주소, 상세 주소 함께 / 전화번호의 경우 xxx-xxxx-xxxx 같은 형태
-- 정렬: 회원 ID desc
SELECT u.user_id
, u.nickname
, concat(u.city," ",u.street_address1," ", u.street_address2) as '전체주소'
, concat(substr(u.TLNO,1,3) ,"-",substr(u.TLNO,4,4),"-",substr(u.TLNO,8,4)) as '전화번호'
FROM USED_GOODS_BOARD b
LEFT JOIN USED_GOODS_USER u
ON b.writer_id = u.user_id
GROUP BY b.writer_id
HAVING count(b.writer_id) >=3
ORDER BY u.user_id desc;
오늘 회고
오늘 SQL 코드카타는 푸는데 좀 오래 걸렸다
오래 걸린 문제들은 복습표시해놓고 다음에 또 풀어보기