- Today
1. 새로운 주차 할 일 정리
2. SQL, 파이썬 코드카타
3. SQL 보충 세션 개인과제
4. ADsP (의사결정나무)
- Today I Learned
SQL
SQL 코드카타 복습
59번
SELECT car_id,
IF (car_id IN (
SELECT car_id
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE start_date <= '2022-10-16' AND end_date >= '2022-10-16'), '대여중', '대여 가능') AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY 1
ORDER BY 1 DESC
# SELECT car_id
# FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
# WHERE start_date <= '2022-10-16' AND end_date >= '2022-10-16'
메인쿼리와 서브쿼리를 이어주려면
IN , = , ANY 등 같은 연산자를 사용해주어야 한다!
서브쿼리로 10/16 특정 날짜를 뽑아내는 것 까지는 완성했는데 IF 절 구문의 서브쿼리에서 헤맸다..
다시 복습해야할 듯 !
67번
WITH so AS
(SELECT flavor
, SUM(total_order) sum_order
FROM JULY
GROUP BY 1
UNION
SELECT flavor
, SUM(total_order) sum_order
FROM FIRST_HALF
GROUP BY 1
)
SELECT flavor
FROM so
ORDER BY sum_order DESC
LIMIT 3
WITH 구문을 사용하여 풀이해보려고 했는데..
실행은 되지만 정답이 아니었다.
튜터님께 여쭤보니
위의 코드는 테이블을 합쳐주기만 할 뿐 sum_order 를 더해주는 연산작업을 해주는 것이 아니었다!
order by 에서 sum 을 해주어야 하지만, 그러기 위해서는 또 flavor 를 group by 를 해주어야 한다
SELECT flavor
FROM so
GROUP BY flavor
ORDER BY SUM(sum_order) DESC
LIMIT 3
테이블의 각각의 합이 아닌 두 테이블의 합을 구해야 하는 문제이기 때문에
다음에는 위와 같은 방법이 아닌 아래의 쿼리문을 참고해서 작성해야겠다!
# WITH 구문 사용
WITH total AS (
SELECT *
FROM first_half
UNION ALL
SELECT *
FROM july
)
SELECT flavor
FROM total
GROUP BY flavor
ORDER BY SUM(total_order) DESC
LIMIT 3
# FROM 절 sub-Quary
SELECT flavor
FROM
(SELECT *
FROM july
UNION ALL
SELECT *
FROM first_half
) a
GROUP BY 1
ORDER BY SUM(total_order) DESC
LIMIT 3
파이썬
부족한 금액 계산하기
def solution(price, money, count):
answer = money
for n in count:
answer -= price * n
return answer
# 첫 번째 시도..
money 에서 price * n 을 빼주면
금액에서 가격*n번 을 빼주는 거라고 생각했으나 오류가 떴다.
int 형식이어서.. range를 써주어 보았다.
def solution(price, money, count):
answer = money
for n in range(1,count+1):
answer -= price * n
return answer
def solution(price, money, count):
answer = money
for n in range(1,count+1):
answer -= price * n
return -(answer)
오.. -() 이렇게 하면 양수로 바꾸어 줄 수 있구나
하지만 문제에서 원하는 답이 아님!
다른 사람의 풀이를 보았더니 이런 코드가 있었다.
내가 생각한 그대로의 풀이
def solution(price, money, count):
answer = 0
for n in range(1,count+1):
answer += price * n
if answer < money:
return 0
else:
return answer - money
price * n 해준 값인 answer 가 money 보다 작으면 0 을 반환
money 보다 크면 answer - money 를 해준다.
Q. for n in count 를 하게 되면?
A. count 가 배열이 아닌 숫자이기 때문에 반복을 해줄 수가 없다!
for 문은 iterable, 반복할 수 있는 개체가 와야하기 때문에 숫자형만 올 경우에는 사용 불가하다
range(1,count+1)
를 하게 되면 1부터 count 까지의 숫자를 반복하도록 작성할 수 있다.
SQL 보충 세션
① SQL 문의 마지막은 ; 세미콜론으로 끝내기
② 같은 레벨의 논리 연산자를 쓸 때에는 괄호() 를 작성해줘야 한다.
SELECT *
FROM basic.theglory
WHERE 날짜 IS NOT NULL
AND (성별!='M')
AND (직업=('아나운서' OR '승무원' OR '화가'))-- 또는, 직업 IN('아나운서','승무원','화가')
AND (나이 BETWEEN 30 AND 40) -- 30 이상, 40 이하
③ ORDER BY 또는 GROUP BY 에서 컬럼값 1번 2번 등으로 작성해도 된다.
다만, MySQL 에서는 컬럼값이 1번부터 시작되지만 다른 환경에서는 0번부터 시작될 수 있으니 되도록 이면 컬럼명으로 작성하는 것을 추천!
과제중에 10 level 별로 구분하는 숙제가 있었는데 나는 BETWEEN 을 사용하며 하나하나씩 적어주었다.
SELECT game_actor_id
, level
, CASE WHEN level <= 10 THEN '1~10lv'
WHEN level BETWEEN 11 AND 20 THEN '11~20lv'
WHEN level BETWEEN 21 AND 30 THEN '21~30lv'
WHEN level BETWEEN 31 AND 40 THEN '31~40lv'
WHEN level BETWEEN 41 AND 50 THEN '41~50lv'
WHEN level BETWEEN 51 AND 60 THEN '51~60lv'
WHEN level BETWEEN 61 AND 70 THEN '61~70lv'
WHEN level BETWEEN 71 AND 80 THEN '71~80lv'
WHEN level BETWEEN 81 AND 90 THEN '81~90lv'
ELSE '91~100lv'
END 'levelgroup'
, date
FROM users
ORDER BY date DESC;
팀원분들과 과제에 관하여 이야기 중 이미 10레벨에서 끊어주었기 때문에
이 다음 WHEN 문에서 10레벨에 관한 구문은 적어주지 않아도 됐었다..
SELECT game_actor_id
, level
, CASE WHEN level <= 10 THEN '1~10lv'
WHEN level <= 20 THEN '11~20lv'
WHEN level <= 30 THEN '21~30lv'
WHEN level <= 40 THEN '31~40lv'
WHEN level <= 50 THEN '41~50lv'
WHEN level <= 60 THEN '51~60lv'
WHEN level <= 70 THEN '61~70lv'
WHEN level <= 80 THEN '71~80lv'
WHEN level <= 90 THEN '81~90lv'
ELSE '91~100lv'
END 'levelgroup'
, date
FROM users
ORDER BY date DESC;
이렇게!!
보충 세션에서 CASE WHEN 절의 작동 순서는 가장 상단부터 참과 거짓을 구분하고,
그 다음 WHEN 절을 수행한다고 했다.
이 점을 잘 기억해두었다가 이후 조금더 간결한 쿼리문을 작성할 수 있도록 해야겠다!
그리고 디비버에서 실행 중 컬럼명 date 와 level 에서 자꾸 `` 이 표시가 뜨는데
백틱 이라고 불린다.
SQL 함수중 date 와 level 에 관한 함수가 있기 때문에 구분될 수 있도록 백틱 표시로 자동완성이 되는 것
`date` 이렇게 쓰여도 됨!
포함하지 않은 값을 출력하고 싶을 때
SELECT date
, ip_addr
, exp
, zone_id
, etc_str2
FROM USERS
WHERE level > 10
AND NOT SERVERNO = '1' # 이런식은 잘 쓰지 않기때문에 != 1 을 쓰는 걸 추천
AND (etc_str2 IN ('레벨업 패키지','시즌패스'))
# AND (etc_str2 = ('레벨업 패키지' OR '시즌패스'))
AND (etc_str1 LIKE '상점%')
ORDER BY date DESC;
나도 처음에 IS NOT 1 했다가 오류가 나왔었는데
팀원분이 마침 튜터님께 여쭤보고 왔다고 한다!
NOT 을 쓰고 싶다면 컬럼명 앞에 적어주면 되지만 추천하지 않는다
- Next
1. SQL, 파이썬 코드카타
2. SQL 코드카타 복습
3. SQL 보충 세션
4. 개인과제
'TIL' 카테고리의 다른 글
2024-04-24 (0) | 2024.04.24 |
---|---|
2024-04-23 (0) | 2024.04.23 |
2024-04-19 (0) | 2024.04.19 |
2024-04-18 (1) | 2024.04.18 |
2024-04-17 (0) | 2024.04.17 |