문제
풀이
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
SELECT *을 찍어보면 아래와 같이 options 컬럼에 자동차 옵션이 쭉 써져있다.
따라서, where(options like '%통풍시트%') or ( options like '%통풍시트%') or ( options like '%통풍시트%') 로
options 안에 통풍시트, 열선시트, 가죽시트가 포함되는 컬럼을 필터링 해줬다.
* LIKE : '%a%' : a 앞뒤로 어떤 문자가 와도 상관 없음, 즉 a가 포함되어 있기만 하면 됨
'%a' : a앞에 어떤 문자가 와도 상관없음, 즉 a로 끝나기만 하면 됨
'a%' : a뒤에 어떤 문가 와도 상관없음, 즉 a로 시작하기만 하면됨
해당 코드는 LIKE를 사용한 어떻게 보면 정석풀이에 해당한다. 다른 풀이로는 정규표현식을 사용한 풀이가 있다.
다른풀이
# 정규표현식 사용
SELECT car_type, COUNT(*)
FROM CAR_RENTAL_COMPANY_CAR
WHERE options REGEXP '통풍시트|열선시트|가죽시트'
GROUP BY car_type
ORDER BY car_type;
정규표현식에선 | 이 OR에 해당한다. 즉, options 안에 통풍시트가 있거나, 열선시트가 있거나, 가죽시트가 있거나하면 됨
해당 풀이에 IN을 사용하면 틀린다.
options 안에 통풍시트, 열선시트, 가죽시트가 있으면 되는거니까 where options in ('통풍시트', '열선시트', 가죽시트') 로 하면되지 않을까 싶을 수도 있다.
(뭔가 한국어로 생각하면 options 안에 가죽시트가 있거나~ 이렇게 생각되니까 in을 떠올리기가 더 쉬운듯)
근데, in을 다르게 표현하면 다음 코드와 같기에 틀린다.
SELECT
FROM
WHERE options = '통풍시트' OR
options = '열선시트' OR
options = '가죽시트'
해당 코드는 options이 통풍시트임 or 열선시트임 or 가죽시트임인 컬럼을 뽑는 것
근데 select * 로 찍어본 options은 어쩌구, 통풍시트, 저쩌구 이거지 options 통풍시트 이런건 없다. 따라서 in을 사용하면 안된다