Skip to main content

[SQL] 151137 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/151137

image.png

image.png

image.png

📌문제

자동차 종류별로 해당 옵션이 하나라도 있는 차가 몇 대 인지 세는 문제

  • 대상 테이블: CAR_RENTAL_COMPANY_CAR
  • 조건: options 컬럼에 '통풍시트', '열선시트', '가죽시트' 중 하나 이상 포함
  • 출력 컬럼: CAR_TYPE, CARS(= COUNT(*))
  • 그룹 기준: CAR_TYPE
  • 정렬 기준: CAR_TYPE 오름차순

💡 정답 쿼리

-- 코드를 입력하세요
-- OPTIONS IN ('통풍시트', '열선싱트', '가죽시트')
-- 종류별로 group by CAR_TYPE
-- 몇 대? COUNT(*) AS CARS
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;

여기서 %는 와일드카드이다., '%통풍시트%'면 문자열 중간에 '통풍시트'가 들어간 경우까지 다 잡아준다.


오답

image.png

실행결과 한 건도 조회 안 됨. 이 코드가 오류 나는 이유는 IN ('%통풍시트%') 문법이 틀렸기 때문이었다. IN은 정확히 일치하는 값 비교에만 쓰이고, 부분 문자열 검색은 LIKE를 써야 한다. IN을 모두 LIKE로 수정해서 해결했다.


정규식 사용으로 개선한 코드

위 코드를 깔끔하게 REGEXP로 한 줄로 묶을 수 있다. REGEXP는 정규식 패턴 매칭이라 OR 조건을 줄이기에 좋다.

SELECT CAR_TYPE,
       COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE options REGEXP '통풍시트|열선시트|가죽시트'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE;

이렇게 하면 % 와일드카드 여러 번 쓰는 대신, options 안에 셋 중 하나라도 들어있으면 전부 매칭된다.

image.png