[SQL] 151137 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기
https://school.programmers.co.kr/learn/courses/30/lessons/151137
📌문제
자동차 종류별로 해당 옵션이 하나라도 있는 차가 몇 대 인지 세는 문제
- 대상 테이블: 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;
여기서 %는 와일드카드이다., '%통풍시트%'면 문자열 중간에 '통풍시트'가 들어간 경우까지 다 잡아준다.
오답
실행결과 한 건도 조회 안 됨. 이 코드가 오류 나는 이유는 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 안에 셋 중 하나라도 들어있으면 전부 매칭된다.