문제 이름 - 문제 링크 - 해답 코드 순
- SQL 문제 특성 상 문제가 길어서 문제 링크로 대체
1. 아픈 동물 찾기
select ANIMAL_ID, NAME from ANIMAL_INS
where INTAKE_CONDITION = 'Sick'
2. 동물의 아디디와 이름
https://school.programmers.co.kr/learn/courses/30/lessons/59403
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
ORDER BY ANIMAL_ID
3. 이름이 있는 동물의 아이디
SELECT ANIMAL_ID FROM ANIMAL_INS
WHERE NAME IS NOT NULL
4. 상위 n개 레코드
SELECT NAME FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1
5. 여러 기준으로 정렬하기
SELECT ANIMAL_ID, NAME, DATETIME FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC
6. 어린 동물 찾기
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
WHERE INTAKE_CONDITION != 'Aged'
ORDER BY ANIMAL_ID
7. 역순 정렬하기
SELECT NAME, DATETIME FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC
8. 강원도에 위치한 생산공장 목록 출력하기
SELECT FACTORY_ID, FACTORY_NAME, ADDRESS FROM FOOD_FACTORY
WHERE ADDRESS LIKE '강원도%'
ORDER BY FACTORY_ID
9. 나이 정보가 없는 회원 수 구하기
SELECT COUNT(*) AS USERS FROM USER_INFO
WHERE AGE IS NULL
GROUP BY AGE
10. 경기도에 위치한 식품창고 목록 출력하기
SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, IFNULL(FREEZER_YN, 'N') AS FREEZER_YN
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE '경기도%'
ORDER BY WAREHOUSE_ID
11. 조건에 맞는 회원수 구하기
SELECT COUNT(USER_ID) AS USERS FROM USER_INFO
WHERE JOINED LIKE "2021%" AND AGE BETWEEN 20 AND 29
12. 이름이 없는 동물의 아이디
SELECT ANIMAL_ID FROM ANIMAL_INS
WHERE NAME IS NULL
13. 가장 비싼 상품 구하기
SELECT MAX(PRICE) AS MAX_PRICE FROM PRODUCT
14. 흉부외과 또는 일반외과 의사 목록 출력하기
SELECT DR_NAME, DR_ID, MCDP_CD, SUBSTRING(HIRE_YMD,1,11) AS HIRE_YMD FROM DOCTOR
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME
15. 12세 이하인 여자 환자 목록 출력하기
SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE AGE < 13 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME
16. 인기 있는 아이스크림
SELECT FLAVOR FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID
17. 모든 레코드 조회하기
SELECT * FROM ANIMAL_INS
ORDER BY ANIMAL_ID
18. 조건에 맞는 도서 리스트 출력하기
SELECT BOOK_ID, SUBSTRING(PUBLISHED_DATE, 1, 11) AS PUBLISHED_DATE FROM BOOK
WHERE PUBLISHED_DATE LIKE '2021%' AND BOOK_ID = 3
ORDER BY PUBLISHED_DATE
19. 평균 일일 대여 요금 구하기
SELECT ROUND(AVG(DAILY_FEE),0) AS AVERAGE_FEE FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV'
20. 최대값 구하기
SELECT DATETIME FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1
21. 과일로 만든 아이스크림 고르기
SELECT F.FLAVOR FROM FIRST_HALF AS F
JOIN ICECREAM_INFO AS I ON F.FLAVOR = I.FLAVOR
WHERE F.TOTAL_ORDER > 3000
AND I.INGREDIENT_TYPE = 'fruit_based'
22. 특정 옵션이 포함된 자동차 리스트 구하기
SELECT * FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%네비게이션%'
ORDER BY CAR_ID DESC
23. 자동차 대여 기록에서 장기/단기 대여 구분하기
SELECT HISTORY_ID,
CAR_ID,
DATE_FORMAT (START_DATE, "%Y-%m-%d") AS START_DATE,
DATE_FORMAT (END_DATE, "%Y-%m-%d") AS END_DATE,
(CASE WHEN DATEDIFF(END_DATE, START_DATE) < 29 THEN '단기 대여'
ELSE '장기 대여' END) AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE LIKE '2022-09%'
ORDER BY HISTORY_ID DESC
- select 절에도 case 사용 가능
24. 조건에 부합하는 중고거래 댓글 조회하기
SELECT B.TITLE, R.BOARD_ID, R.REPLY_ID, R.WRITER_ID, R.CONTENTS,
DATE_FORMAT(R.CREATED_DATE, "%Y-%m-%d") AS CREATED_DATE
FROM USED_GOODS_BOARD B
JOIN USED_GOODS_REPLY R ON B.BOARD_ID = R.BOARD_ID
WHERE B.CREATED_DATE LIKE '2022-10%'
ORDER BY R.CREATED_DATE, B.TITLE
25. 중복 제거하기
select count(distinct(name)) from animal_ins
where name is not null
26. 동물 수 구하기
select count(*) from animal_ins
27. 최솟값 구하기
select datetime from animal_ins
order by datetime
limit 1
28. 동명 동물 수 찾기
select name, count(name) as count from animal_ins
where name is not null
group by name
having count(name) > 1
order by name
29. 이름에 el이 들어가는 동물 찾기
select animal_id, name from animal_ins
where animal_type = 'Dog'
and name like '%el%'
order by name
30. null 처리하기
select animal_type, ifnull(name, 'No name') as name, sex_upon_intake from animal_ins
order by animal_id
31. datetime에서 date로 형 변환
select animal_id, name, date_format(datetime, "%Y-%m-%d") as 날짜 from animal_ins
order by animal_id
32. 가격이 제일 비싼 식품의 정보 출력하기
select * from food_product
order by price desc
limit 1
33. 고양이와 개는 몇 마리 있을까
select animal_type, count(*) as count from animal_ins
where animal_type = 'Dog'
or animal_type = 'Cat'
group by animal_type
order by animal_type
34. 중성화 여부 판단하기
select animal_id, name, (
case when sex_upon_intake like '%Neutered%' then 'O'
when sex_upon_intake like '%Spayed%' then 'O'
else 'X' end) as 중성화
from animal_ins
order by animal_id
- case 문법은 select에서 사용가능하다.
35. 입양 시각 구하기
select hour(datetime) as hour, count(datetime) from animal_outs
where time(datetime) between '09:00:00' and '20:00:00'
group by hour
order by hour
- hour를 사용해 datetime의 시간대만 추출
- 'time(시간 데이터 있는 컬럼명) between 시작시간 and 종료시간'을 사용해 시간대 설정(9시부터 20시까지)
- group by를 통해 시간대 별 그룹화 및 count로 개수 세기
36. 카테고리 별 상품 개수 구하기
select substring(product_code, 1, 2) as category, count(product_id) as products from product
group by category
order by category
37. 진료과별 총 예약 횟수 출력하기
select mcdp_cd as 진료과코드, count(mcdp_cd) as 5월예약건수 from appointment
where apnt_ymd like '2022-05%'
group by mcdp_cd
order by 5월예약건수, mcdp_cd
38. 루시와 엘라 찾기
select animal_id, name, sex_upon_intake from animal_ins
where name = 'Lucy' or name = 'Ella' or name = 'Pickle'
or name = 'Rogan' or name = 'Sabrina' or name = 'Mitty'
39. 상품 별 오프라인 매출 구하기
select p.product_code, (p.price * sum(o.sales_amount)) as sales from product p
inner join offline_sale o on p.product_id = o.product_id
group by p.product_code
order by sales desc, p.product_code
40. 3월에 태어난 여성 회원 목록 출력하기
select member_id, member_name, gender, date_format(date_of_birth, '%Y-%m-%d') as date_of_birth
from member_profile
where gender = 'W' and date_of_birth like '%-03-%' and tlno is not null
order by member_id
41. 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기
select car_type, count(car_type) as cars from car_rental_company_car
where options like '%통풍시트%' or options like '%열선시트%' or options like '%가죽시트%'
group by car_type
order by car_type
42. 조건에 맞는 도서와 저자 리스트 출력하기
select b.book_id, a.author_name, date_format(b.published_date, '%Y-%m-%d') as published_date
from book b
inner join author a on b.author_id = a.author_id
where category = '경제'
order by b.published_date
43. 성분으로 구분한 아이스크림 총 주문량
select i.ingredient_type, sum(f.total_order) as total_order from first_half f
join icecream_info i on f.flavor = i.flavor
group by i.ingredient_type
order by total_order
44. 가격대 별 상품 개수 구하기
select truncate(price,-4) as price_group, count(product_id) as products from product
group by price_group
order by price_group
- truncate( ) 함수로 만 자리를 제외한 자리 수 제거하고 group_by로 만 단위 그룹화.
45. 재구매가 일어난 상품과 회원 리스트 구하기
select user_id, product_id from online_sale
group by user_id, product_id
having count(*) > 1
order by user_id, product_id desc
- 두 칼럼에서 동시에 중복되는 값을 찾기 위해 두 개의 컬럼을 동시에 그룹화 후 having 구를 사용해 count(*) 값이 1 이상인 값들만 출력
46. 조건에 부합하는 중고거래 상태 조회하기
select board_id, writer_id, title, price,
(
case when status = 'sale' then '판매중'
when status = 'reserved' then '예약중'
else '거래완료' end) as status
from used_goods_board
where created_date like '2022-10-05%'
order by board_id desc
47. 자동차 평균 대여 기간 구하기
select car_id,
round(avg(datediff(end_date, start_date)+1), 1) as average_duration
from car_rental_company_rental_history
group by car_id
having avg(datediff(end_date, start_date)+1) >= 7
order by average_duration desc, car_id desc
- 자동차 평균 대여 기간 : datediff로 반납일 - 시작일 + 1(시작일 포함위해) round 사용으로 avg 2번째 자리에서 반올림.
- 자동차 id로 그룹화 시 having 구 사용으로 평균 대여 기간이 7일보다 높은 것만 그룹화
정리
- 각 상황마다 필요한 쿼리 구문 및 함수 연습
- 자주 사용하는 함수에 대한 학습 필요