2024-10-06

Suhyeon Lee·2024년 10월 6일
0

Daily Routine

CodeKata

SQL: CODEKATA

42. 성분으로 구분한 아이스크림 총 주문량

  • 작성한 코드
SELECT
  ROUND(AVG(daily_fee),0) AS average_fee
FROM
  car_rental_company_car
WHERE
  car_type = 'SUV'
;
  • ROUND 함수 기본값이 0이라 ROUND(AVG(daily_fee))로 적어도 됨

30. 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기

  • 작성한 코드
SELECT
  car_type
  , COUNT(*) AS cars
FROM
  car_rental_company_car
WHERE
  options REGEXP '통풍시트|열선시트|가죽시트'
GROUP BY
  car_type
ORDER BY
  car_type
;
  • IN 연산자로는 왜 안 되지?

    • IN의 조건에 맞는 데이터가 존재하지 않기 때문에 출력되지 않음
      • IN연산자는 주어진 값과 데이터의 내용이 일치해야 함(포함이 아니고 정확히 일치하는 경우의 값 데이터만 추출하는 것임)
      • OPTIONS에 해당하는 데이터가 '주차감지센서' 하나일 경우에는 IN 연산자가 사용 가능하지만 주어진 데이터가 '주차감지센서, 스마트키, 네비게이션' 와 같이 여러 문자열이 콤마를 기준으로 나열되어 있는 구조이기 때문에 IN 연산자로 데이터를 출력할 수 없음
    • IN 조건을 쓰려면 options 컬럼을 ,(콤마) 기준으로 분해하는 작업이 필요함
      • 조건이 콤마로 구분되지 않고 조건1 컬럼, 조건 2 컬럼 등으로 컬럼 당 하나씩만 들어가 있어야 하기 때문
    • 테이블 구조를 보면 option의 타입이 문자열(varchar)임: 자동차 옵션 리스트는 콤마(',')로 구분된 키워드 리스트(옵션 리스트 값 예시: '열선시트', '스마트키', '주차감지센서')로 되어있으며, 키워드 종류는 '주차감지센서', '스마트키', '네비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트' 가 있다고 적혀 있음
  • 추가: LIKE 사용

SELECT
  car_type
  , COUNT(*) AS cars
FROM
  car_rental_company_car
WHERE
  options LIKE('%통풍시트%')
  OR options LIKE('%열선시트%')
  OR options LIKE('%가죽시트%')
GROUP BY
  car_type
ORDER BY
  car_type
;
  • 추가2: INSTR 사용
SELECT
  car_type
  , COUNT(*) AS cars
FROM
  car_rental_company_car
WHERE
  INSTR(options, '통풍시트') > 0
  OR INSTR(options, '열선시트') > 0
  OR INSTR(options, '가죽시트') > 0
GROUP BY
  car_type
ORDER BY
  car_type
;

MySQL 테이블에 문자열이 포함되어 있는지 확인하는 다양한 방법

  • INSTR(str, substr)
  • LOCATE(substr, str)
    • LOCATE(substr,str) 및 INSTR(str,substr) 함수에서 인수가 전달되는 방식이 다름
  • LIKE
  • REGEXP

29. 인기 있는 아이스크림

  • 작성한 코드
SELECT
  flavor
FROM
  first_half
ORDER BY
  total_order DESC
  , shipment_id
;

28. 12세 이하인 여자 환자 목록 출력하기

  • 작성한 코드
SELECT 
  pt_name
  , pt_no
  , gend_cd
  , age
  , IFNULL(TLNO, 'NONE') TLNO
FROM
  patient
WHERE
  age <= 12 
  AND gend_cd = 'W'
ORDER BY 
  age DESC
  , pt_name
;
  • 추가: COALESCE 사용
SELECT
  pt_name
  , pt_no
  , gend_cd
  , age
  , COALESCE(TLNO, 'NONE')
FROM
  patient
WHERE
  age <= 12 
  AND gend_cd = 'W'
ORDER BY
  age DESC
  , pt_name
;
  • 추가: CASE WHEN 사용
SELECT
  pt_name
  , pt_no
  , gend_cd
  , age
  , (
    CASE
      WHEN TLNO IS NOT NULL THEN TLNO 
      ELSE 'NONE'
    END
    ) AS TLNO
FROM
  patient
WHERE
  age <= 12 
  AND gend_cd = 'W'
ORDER BY
  age DESC
  , pt_name
;

27. 진료과별 총 예약 횟수 출력하기

  • 첫 번째로 작성한 코드 → 틀렸다고 나옴
SELECT
  mcdp_cd AS "진료과 코드"
  , COUNT(*) AS "5월예약건수"
FROM
  appointment
WHERE
  apnt_cncl_ymd IS NULL
  AND YEAR(apnt_ymd) = '2022'
  AND MONTH(apnt_ymd) = '5'
GROUP BY
  mcdp_cd
ORDER BY
  COUNT(*)
  , mcdp_cd
;

: 예약 취소한 건 카운트 안 하는 거라고 생각하고 풀었는데 아니었음

  • 두 번째로 작성한 코드 → 정답처리됨
SELECT
  mcdp_cd AS "진료과 코드"
  , COUNT(*) AS "5월예약건수"
FROM
  appointment
WHERE
  YEAR(apnt_ymd) = 2022
  AND MONTH(apnt_ymd) = 5
GROUP BY
  mcdp_cd
ORDER BY
  COUNT(*)
  , mcdp_cd
;
  • WHERE절을 더 간단하게 WHERE DATE_FORMAT(apnt_ymd, '%Y-%m') = '2022-05'로 해도 됨
  • ORDER BY를 아래와 같이 적어도 됨
-- 백틱 사용
ORDER BY `5월예약건수`, `진료과 코드`

-- 아무것도 없이 사용
ORDER BY 5월예약건수, 진료과코드
profile
2 B R 0 2 B

0개의 댓글