상세 컨텐츠

본문 제목

[TIL] WEEK 3 FRI - length, 특정기간 제외 join[SQL]

TIL

by ollive 2024. 7. 12. 20:20

본문

1. [SQL] 문자열 길이 얻기 

CHAR_LENGTH(string) 을 이용하면 영문, 한글, 공백을 1개씩 세준다.

LENGTH(string)을 사용해도 같은 결과를 얻을 수 있다. 하지만 CHAR_LENGTH와 달리 문자열의 바이트 길이를 센다. 따라서 유니코드가 있는 경우 주의하여 사용한다.

SELECT tweet_id
FROM tweets
WHERE CHAR_LENGTH(content) > 15

WHERE LENGTH(content) > 15

 

2. 특정기간 제외 JOIN 

전체기간 중에서 11월달을 제외하려 할때, 제외할 데이터가 담긴 쿼리(table2)를 먼저 만들어 준다. 이후 두 테이블을 합지는데, table1 LEFT JOIN table2 on table1.col = table2.col을 사용하여 왼쪽테이블에 맞추어 제외할 데이터를 join시킨 다음 , WHERE 에 table2.col is null을 사용하여 두집합의 교집합을 삭제시킬수 있다. 

-- 세단이랑 suv 추출
WITH type AS (SELECT car_id, car_type, daily_fee
              FROM CAR_RENTAL_COMPANY_CAR
              WHERE car_type IN ('세단','SUV'))

-- 11월에 약속있는 차들
     , nvailable11 AS (SELECT car_id, start_date, end_date
                     FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                     WHERE '2022-11' BETWEEN DATE_FORMAT(start_date,'%Y-%m') AND DATE_FORMAT(end_date,'%Y-%m'))

-- 30일간의 대여 금액할인율
     , discount AS (select car_type, discount_rate
                  from CAR_RENTAL_COMPANY_DISCOUNT_PLAN
                  WHERE car_type IN ('세단','SUV')
                        AND duration_type = '30일 이상')
                        
-- 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차
select ty.car_id	
       , ty.car_type
       , round(ty.daily_fee*30 *(1-dc.discount_rate/100)) FEE
FROM type ty 
     left join discount dc
     on ty.car_type = dc. car_type
     left join nvailable11 nv
     on ty.car_id = nv.car_id
WHERE nv.car_id is null
HAVING fee BETWEEN 500000 AND 2000000
ORDER BY fee DESC
      ,car_type
      ,car_id

 

 

관련글 더보기