1. SQL 문자열 여러개가 포함된 데이터 찾기 (LIKE, 정규표현식)
문자열 하나를 찾기 위해서는 LIKE나 = 를 이용하면 된다.
SELECT *
FROM TABLE
WHERE OPTIONS = '하이%';
#WHERE OPTIONS LIKE '하이%';
문자열 여러개를 찾기위해서도 LIKE를 사용하는데 비교적 편한 것은 정규표현식.
# LIKE - 둘 중 하나라도 만족
SELECT *
FROM TABLE
WHERE (OPTIONS LIKE '하이%' OR OPTIONS LIKE '바이%');
# LIKE - 둘 다 만족
SELECT *
FROM TABLE
WHERE (OPTIONS LIKE '하이%' AND OPTIONS LIKE '바이%');
# 정규표현식 - 여러 개 중 하나 이상이 포함
SELECT *
FROM TABLE
WHERE OPTIONS REGEXP '하이|바이|씨유레이러'
2. WHERE 와 HAVING
조건절을 사용하다보면 에러가 발생하는데 그럴 때 보면 WHERE와 HAVING을 혼동해서 사용하는 경우가 더러 있다.
WHERE
SELECT * FROM SALES
WHERE REGION = 'North';
HAVING
SELECT REGION, SUM(SALES) AS TOTAL_SALES
FROM SALES
GROUP BY REGION
HAVING SUM(SALES) > 100000;
3. [자동차 대여 기록에서 대여중/대여가능 여부 구분](https://school.programmers.co.kr/learn/courses/30/lessons/157340)
조건은 아래와 같다.
#2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고,
#대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여
#자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요.
#이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고
#결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.
순서 1
우선 조건문부터 만들었다.
CASE
WHEN DATE('2022-10-16') - START_DATE >= 0 AND END_DATE - DATE('2022-10-16') >= 0 THEN '대여중'
ELSE '대여가능'
END
순서 2
조건문을 넣고 쿼리를 실행해봤으나, 원하던 결과값이 나오지 않았다.
SELECT CAR_ID,START_DATE, END_DATE,
(CASE WHEN DATE('2022-10-16') - START_DATE >= 0 AND (END_DATE - DATE('2022-10-16')) >= 0 THEN '대여중'
ELSE '대여가능'
END) AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
ORDER BY CAR_ID DESC;
순서 3
대체 뭐가 문제인지 모르겠어서 원시데이터와 쿼리를 조회했을 때와 비교해보기로 했다.
원시데이터를 보아하니 CAR_ID 별 HISTRORY_ID가 존재해서 CAR_ID 별 가장 높은 HISTORY_ID로 쿼리를 실행했어야했다.
( 사진 속 빨간색 데이터가 가장 최근 대여한 기록 )

그래서 CAR_ID 별 가장 높은 HISTORY_ID로 쿼리를 만들어봄.
SELECT *
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE HISTORY_ID IN (
SELECT MAX(HISTORY_ID)
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
)
ORDER BY CAR_ID DESC, HISTORY_ID DESC;

순서 4
여태 했던 쿼리들을 합쳐보면
SELECT CAR_ID,
(CASE WHEN DATE('2022-10-16') - START_DATE >= 0 AND (END_DATE - DATE('2022-10-16')) >= 0 THEN '대여중'
ELSE '대여가능'
END) AS AVAILABILITY
FROM (
SELECT *
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE HISTORY_ID IN (
SELECT MAX(HISTORY_ID)
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
)) AS RN
ORDER BY CAR_ID DESC;
...그래도 틀렸다네..뭐가 문제인거지