[ 2024.07.01 ] TIL

yy·2024년 7월 1일

개발일지

목록 보기
75/122

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;

...그래도 틀렸다네..뭐가 문제인거지

profile
시간이 걸릴 뿐 내가 못할 건 없다.

0개의 댓글