51. 없어진 기록 찾기
천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성
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 animal_id
★ 출제포인트
outs에는 정보가 있는데, ins에는 정보가 없는 항목을 찾아야 하므로 outs를 기준으로 left join 해야 함
52. 과일로 만든 아이스크림 고르기
상반기 아이스크림 총주문량이 3,000보다 높으면서 아이스크림의 주 성분이 과일인 아이스크림의 맛을 총주문량이 큰 순서대로 조회하는 SQL 문을 작성
select f.flavor
from first_half f join icecream_info i on f.flavor = i.flavor
where f.total_order > 3000 and i.ingredient_type = 'fruit_based'
order by f.total_order desc
★ 출제포인트
총주문량은 이미 표에 나와있는 total_order이므로 따로 구할 필요 없음
→ first_half 테이블에서 flavor는 기본키이므로, 한 맛(flavor)마다 한 행만 존재함!
where 조건 2개에 맞게 select 컬럼하는 문제였음
53. 재구매가 일어난 상품과 회원 리스트 구하기
ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요. 결과는 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬
select user_id,
product_id
from online_sale
group by user_id, product_id
having count(*) >= 2
order by user_id asc, product_id desc
★ 출제포인트
재구매? 한 회원(user_id)가 같은 상품(product_id)를 두 번 이상 구매한 경우 = (user_id, product_id) 조합 여러 번 등장
따라서 (user_id, product_id) 별로 그룹화 필요 → 그룹화 한 묶음에 대해 count(*) >=2인 것 추출이므로 having 필요
54. 최대값 구하기
가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성
select max(datetime) as '시간'
from animal_ins
55. 조건에 맞는 사용자 정보 조회하기
select
u.user_id,
u.nickname,
concat(u.city, ' ', u.street_address1, ' ', IFNULL(u.street_address2, '')) as 전체주소,
concat(
substr(u.tlno, 1, 3), '-',
substr(u.tlno, 4, 4), '-',
substr(u.tlno, 8, 4)
) as 전화번호
from used_goods_user u
join (
select writer_id
from used_goods_board
group by writer_id
having count(*) >= 3
) b on u.user_id = b.writer_id
order by u.user_id desc;
★ 오답노트
1. 서브쿼리 : 3건 이상 게시글 작성자 필터링
SELECT WRITER_ID
FROM USED_GOODS_BOARD
GROUP BY WRITER_ID
HAVING COUNT(*) >= 3
작성자 별로 그룹화 후, 그룹화된 결과에 HAVING으로 조건 적용
2. JOIN : 회원 정보 연결
3. 전체주소
CONCAT ( st1, str2, ...) : 문자열을 순서대로 결함함
IFNULL (컬럼, 대체값) : NULL일 때 대체값 반환 - 여기서는 address2가 null이면 빈 문자열('') 처리
CONCAT(u.CITY, ' ', u.STREET_ADDRESS1, ' ', IFNULL(u.STREET_ADDRESS2, ''))
3. 전화번호
SUBSTR(문자열, 시작위치, 길이) : 문자열 일부 추출 - 시작위치는 1부터 계산!
CONCAT ( st1, str2, ...) : 문자열을 순서대로 결함함
CONCAT(
SUBSTR(u.TLNO, 1, 3), '-',
SUBSTR(u.TLNO, 4, 4), '-',
SUBSTR(u.TLNO, 8, 4)
)
4. order by
함수요약
'┤내일배움캠프├ > [문제풀이] 코드카타_SQL' 카테고리의 다른 글
SQL 61-65. (2) | 2025.06.02 |
---|---|
SQL 56-60. (12) | 2025.05.30 |
SQL 46-50. (2) | 2025.05.30 |
SQL 41-45. (6) | 2025.05.30 |
SQL 36-40. (8) | 2025.05.29 |