TIL

2024-04-03

여연찌 2024. 4. 3. 19:31
  • 오늘 진행한 일

1. 이번주 TIL 다시 한번 보기

2. SQL 코드카타(56~60번)

 

 


  • 기억할 내용

 

SQL

 

INNER JOIN 을 여러번 할 경우

FROM appointment a 
INNER JOIN patient p ON a.pt_no = p.pt_no
INNER JOIN doctor d ON a.mddr_id = d.dr_id

외래키 기준이 될 테이블을 제일 처음 적어주고

INNER JOIN 을 한 다음 연결해줄 테이블만 적어주면 된다

INNER JOIN = JOIN 같은 의미이므로 INNER 은 빼주어도 되지만 

나중에 조금더 SQL이 익숙해졌을 때 제외하는거로 ..

테이블명에 별칭을 붙이는 작업도 AS 를 해주는 것이 보기 편하다

 

 

자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기

https://lyj-01.tistory.com/68

 

자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 # SELECE절 서브쿼리

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을

lyj-01.tistory.com

대여종료일만 신경써서 대여 가능 여부를 확인하다보니

사실상 이도저도 아닌 데이터가 조회되었다.

SELECT car_id
     , CASE WHEN end_date >='2022-10-16' THEN "대여중" 
            WHEN end_date<'2022-10-16' THEN "대여 가능" END AILABILITY
     , end_date
     , start_date
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY car_id
HAVING max(end_date)
ORDER BY 1 DESC

당연히 정답은 아니었고

 

10월16일 이후 대여 가능한지~ 만 찾았더니 또 이상한 상태가 나와버렸다

select car_id
     , CASE WHEN end_date >='2022-10-16' THEN "대여중"
            WHEN end_date<'2022-10-16' THEN "대여 가능" END AILABILITY
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
where (car_id,end_date) IN 
(
select car_id, max(end_date)
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
group by car_id
)
order by car_id DESC

제일 마지막 대여종료일이 전부다 10월16일 보다 컸기 때문에 

전부 대여중이라고 나옴 .. 

다른 쿼리들을 찾다보니 start_date 도 조건으로 줘야한다는 것을 깨달았다

SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16'

10월16일 이전에 대여해서

10월16일 이후에 반납이 된 차량

(10월16일 당일에 대여중인 차량)

을 조회해주었다.

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'), '대여중', '대여 가능') 
 AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;

select 절에 서브쿼리로 추가해서 대여조건을 지정해주었다!

SELECT 절의 서브쿼리는 열(컬럼) 처럼 취급된다.

 

Q. 서브쿼리를 사용하지 않고 그대로 IF 조건을 줄 경우에는 어떻게 나오는지?

A.

SELECT CAR_ID,
 IF(START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16', '대여중', '대여 가능')
 AS AVAILABILITY
  , start_date
  , end_date
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;

 

car_id 가 그룹화가 되어있어

start_date 와 end_date 에는 car_id 의 첫번째 행이 입력된다.

그렇기 때문에 첫번째 행을 기준으로 IF 조건을 따르게 되어 

원하던 값이 아닌 다른 결과가 출력된다

 

더보기
SELECT 절에 서브쿼리를 주었을 때 나오는 값
IF 구문으로만 출력 했을 때 나오는 값

서브쿼리를 했을때와 하지 않았을 때의 실행결과의 이유가

도저히 이해되지 않아 꽤나 오래잡고 있었던 문제이다.

결국에는 해결이 되어 뿌듯하다 !!!

 

 

 

 

 


 

 

파이썬

 

 

 

 

Q. 정수 n을 리스트로 생성하여 숫자연산을 하고 싶을 때 int 로는 바로 변환이 불가능한지?

A.

list(int(59))

이렇게 할 경우 5와 9가 따로 떨어져 나오는 것이 아니라 [59] 라는 숫자로 리스트가 만들어진다.

5와 9를 따로 떨어트려 계산을 하고 싶다면 문자열로 5와 9를 나누어 준 후

숫자형으로 바꾸어 계산을 해줘야 한다!

 

Q. 정수 n을 리스트로 생성하여 sort 할때 왜 list() 를 사용해야하는지?

A. 

result = list(str(n))
result.sort(reverse = True)

 

이렇게는 되고

result = [str(n)]
result.sort(reverse = True)

이렇게 했을때 역순 정렬이 되지 않는 이유가 궁금했다.

 

다른 풀이 방식으로

answer = [int(i) for i in str(n)]
answer.sort(reverse=True)

이렇게 [] 대괄호를 사용했을 때에도 역순정렬이 정상적으로 진행되는 거로보아서는

리스트를 만드는 방식에는 차이가 없는 듯 하다 

 

파이썬은 SQL 보다는 조금 덜 직관적이다보니

계속해서 궁금증이 생긴다..

왜 안되는거야

 


  • 내일 진행 예정

1. SQL 코드카타

2. 알고리즘 코드카타

'TIL' 카테고리의 다른 글

2024-04-05  (0) 2024.04.05
2024-04-04  (0) 2024.04.04
2024-04-02  (0) 2024.04.02
2024-04-01  (0) 2024.04.01
2024-03-31  (0) 2024.03.31