이 글은 프로그래머스 SQL 고득점 Kit 문제와 답을 정리한 글입니다.
*MySQL 버전입니다.
자동차 종류별 특정 옵션이 포함된 자동차 수 구하기 문제
💡 자동차 종류, 종류별 대 수 출력하기
- 자동차 옵션: 통풍시트/열선시트/가죽시트 중 하나 이상 포함해야 함
- 자동차 종류 오름차순
자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 답
💡 문제 포인트: 자동차의 특정 옵션 키워드 필터링하기
select CAR_TYPE
, count(car_id) as CARS
from CAR_RENTAL_COMPANY_CAR
where options regexp('열선시트|통풍시트|가죽시트')
group by CAR_TYPE
order by CAR_TYPE;
단순하게 생각하면 LIKE OR을 사용할 수 있으나, 쿼리가 너무 길어진다.
또한 OR보다 IN이 더 효율적이다. 하지만 where절에 IN을 사용하면, 정확한 값을 출력하지 못한다.
이럴 때, 여러 개를 동시 검색할 수 있는 REGEXP를 사용하면 된다.
REGEXP는 마치 LIKE와 IN 합체 버전 같다.
LIKE로 여러 개를 검색하면 LIKE OR을 여러 번 쓰게 되는 비효율이 발생하기에, REGEXP로 처리한다.
*추천 글 MySQL LIKE 여러 개 검색(LIKE IN), REGEXP 사용 방법
그 결과 options 컬럼에서 '열선시트', '통풍시트', '가죽시트'라는 각각의 문자가 있는 로우는 모두 선택된다.
따라서 문제의 조건이 요구하는 '세 옵션 중 하나 이상의 옵션이 포함된 자동차'를 찾을 수 있다.
추가 정리
IN 관련 쿼리
select CAR_TYPE
, count(car_id) as CARS
from car_rental_company_car
where options in('열선시트', '통풍시트', '가죽시트')
group by car_type
order by car_type;
IN을 사용해서 위 쿼리와 같이 작성하면 결괏값이 제대로 안 나온다.
열선시트를 예로 들어 생각해 보자.
IN('열선시트', '통풍시트', '가죽시트')로 작성하면 , options 컬럼에서 오직 '열선시트'만 입력된 로우를 찾는다.
통풍시트, 가죽시트도 마찬가지이다. 통풍시트만 입력된, 가죽시트만 입력된 로우를 찾는다.
하지만 찾으려는 데이터는 세 옵션 중 하나 이상 갖춘 자동차이다.
그러므로 열선시트+@ 옵션들이 입력된 자동차도 선택해야 하는데, 이렇게 in을 사용하면 잘못된 데이터를 찾는다.
또한 원 데이터 확인 시, 열선시트만 입력된 로우는 없고 열선시트+@로 입력되어 있다.
이런 이유들로 인해, IN 사용 시 결괏값이 제대로 안 나온다.
'SQL > 프로그래머스 SQL' 카테고리의 다른 글
MySQL NULL값 처리, IFNULL 사용법 (프로그래머스 경기도에 위치한 식품창고 목록 출력하기) (2) | 2023.12.22 |
---|---|
MySQL 프로그래머스 즐겨찾기가 가장 많은 식당 정보 출력하기 문제 답 (1) | 2023.11.03 |
MySQL 프로그래머스 재구매가 일어난 상품과 회원 리스트 구하기 문제 답 (0) | 2023.10.30 |
MySQL 프로그래머스 서울에 위치한 식당 목록 출력하기 문제 답 (1) | 2023.10.25 |
MySQL 프로그래머스 상품을 구매한 회원 비율 구하기 문제 답 (0) | 2023.09.26 |