본문 바로가기

항해 99/SQL

SQL 코딩 테스트 1

문제 이름 - 문제 링크 - 해답 코드 순

  • 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일보다 높은 것만 그룹화

 

정리

  • 각 상황마다 필요한 쿼리 구문 및 함수 연습
  • 자주 사용하는 함수에 대한 학습 필요

'항해 99 > SQL' 카테고리의 다른 글

SQL 기초 2  (1) 2024.01.26
SQL 기초 1  (1) 2024.01.25