백엔드 부트캠프[사전캠프]/TIL

[내일배움캠프-사전캠프 02일차] SQL의 서브쿼리, DATEDIFF

sintory-04 2025. 1. 20. 17:49

1. 서브쿼리 Subquery 

- 서브 쿼리란 부속질의를 말하는 것으로 내포된 query와 바깥족의 query에서 참조한 table이 서로 다를 경우, 여러개의 table에 걸쳐서 질의를 처리하는 것이다.

- Subquery는 FROM 절과 WHERE 절에 사용이 가능하며, bottom-up(아래에서 위) 방식으로 바깥쪽 query가 실행되기 전에 실행된다.

1) 예시 문항을 살펴보겠다.

SELECT *
FROM RETAIL_ORDER
WHERE OrderTotal > AVG(OrderTotal)

- 아래는 ordertoal 열에서, 평균보다 높은 열을 찾는 SQL 문이다.

- 하지만 위의 열은 error 가 생긴다.  AVG()는 하나의 값으로 반환되며, 단일값을 비교할려면 서브쿼리 또는 다른 방식으로 값을 처리해야한다.

SELECT *
FROM RETAIL_ORDER
WHERE OrderTotal > (SELECT AVG(OrderTotal) FROM RETAIL_ORDER)

- 이런식으로 Ordertotal이 [평균보다 많은 주문 품목에 대한 조회] 보다 큰 열을 조회한다. 고 보면된다.

 

2) 사전캠프에서 준 문제를 살펴보겠다.

26. 각 유저별 최신 피드백 찾기

SELECT *
FROM lol_feedbacks t1
WHERE feedback_date = (
    SELECT MAX(feedback_date)
    FROM lol_feedbacks t2
    WHERE t1.user_name = t2.user_name
);

최신 피드백 하나를 조회하는 것이다.

이 부분을 bottom up 방향으로해석해야한다.

lol_feedbacks 테이블에서 

> 피드백 날짜 큰 값을 가져오는데

> t1에 사용되는 각 username에 대해

> t2에 해당 유저의 최대 피드백을 찾아내는 것임.

이런식으로 서브쿼리는 전체피드백에서 최대 날짜만을 계산하게 되며, 모든 유저에 대해 같은 날짜가 적용될 수 있는 것이다.

2. DATEDIFF 와 TIMESTAMPDIFF

1) DATEDIFF() 함수

DATEDIFF(date1, date2)

- 두 날짜 사이의 일수 차이를 계산한다.

- date1, date2 차이를 계산할 두날짜로, date1 에서 date2를 뺀다.

2) TIMESTAMPDIFF

TIMESTAMPDIFF(unit, date1, date2)
// unit = YEAR, MONTH, DAT, HOUR, MINUTE, SECOND 등

- TIMESTEMP는 다르게 생각해야한다. 차이를 계산하는 거라고 생각해야한다. 위에서도 차이가 아니었냐? 하지만. 위에서는 뺀다는 부분에서 이해를 해야하고 여기는 시작점과 종료지점의 차이를 구하는 것이라 위에서와는 다르다.

- 실제로는 date1에서 date2를 빼는 것이고, 시작점과 종료 지점의 차이를 양수로 반환한다.

- 그래서 DATEDIFF와 빼는 건 같은데, DATEDIFF에서는 큰 값이 앞이고 TIMESTEMPDIFF에서는 큰 값(종료값)이 뒤로 와야한다는 것이다.

- 경과된 기간을 계산하는 함수로, 연도, 월, 일 등의 차이를 계산할 때 두 날짜의 순서를 고려하여 반환값을 결정한다. 따라서 UNIT,시작점, 종료점 을 잘 기억하고 사용하도록 하자.


오늘의 회고 

- 어제 사전캠프 이후 추가로 SQL 걷기반을 달렸다. 다소 늦게 참여했으니, 빠르게 속도를 내고 싶었다.

- 그리하여 오늘은 [9단계] 까지 완료했다! 저녁먹고 빨리 SQL을 마무리할 생각이다 : >

- 기본을 얼른 마무리 해야지 강의를 들을 수 있기 때문에 최대한 노력 할 것이다 !

+) 생각보다.. 걷기반 문제가 오래 걸린다 ㅠㅡㅠ ..