데이터분석 기록일지

문제풀이/스파르타 - sql 문제

[사전캠프] SQL 연습문제(5)

야하루 2024. 6. 14. 23:52

 

1. 테이블에서 AWS 예산(aws_cost)이 40000 이상 들어간 프로젝트들의 이름을 선택하는 쿼리를 작성해주세요!
select name
from practice5
where aws_cost>=40000

 

 

 

2. 테이블에서 2022년에 시작된 프로젝트를 선택하는 쿼리를 작성해주세요! 단, start_date < ‘2023-01-01’ 조건을 사용하지 말고 쿼리를 작성해주세요!
# 내풀이
select *
from practice5
where start_date like '2022%'
# 다른 정답풀이
select *
from practice5
where year(start_date)=2022

 

나는 year() 함수를 몰라서 like를 이용해서 풀었는데, 저렇게 년도, 월, 일 등을 반환해주는 함수가 있었다.

year(), month(), day(), hour(), minute(), second() 등이 다 가능!

 

 

 

 

3. 테이블에서 현재 진행중인 프로젝트를 선택하는 쿼리를 작성해주세요. 단, 지금 시점의 날짜를 하드코딩해서 쿼리하지 말아주세요!
# 정답
select *
from practice5
WHERE CURDATE() BETWEEN start_date AND end_date

 

이 문제는 문제가 의미하는 바가 뭔지 잘 모르겠어서 못 풀었었는데,

날짜를 하드코딩한다는 표현은 오늘의 날짜를 직접 쳐서 쿼리하는 것을 의미한다고 한다.

즉, 오늘 날짜를 직접 치지 말고 지금 시점을 가져오는 함수를 이용하여 푸는 것.

 

curdate() 함수가 현재 날짜를  ‘YYYY-MM-DD’  또는 'YYYYMMDD' 형식의 날짜 값으로 제공하는 함수라고 한다.

WHERE CURDATE() BETWEEN start_date AND end_date

따라서 이 부분 현재 날짜(curdate()가 반환하는 값) 가 start_date 와 end_date 사이에 있는지를 확인하는 조건을 나타낸다.

 

 

 

 

4. 테이블에서 각 프로젝트의 지속 기간을 일 수로 계산하는 쿼리를 작성해주세요!
# 내풀이
select name, substr(end_date, 9, 10) - substr(start_date, 9, 10) +1 "지속기간"
from practice5
# 정답풀이
SELECT name, DATEDIFF(end_date, start_date) AS working_days 
FROM practice5

내풀이
정답풀이

이 문제도 datediff()라는 함수를 알지 못해서 내 멋대로 풀었다.

날짜 기간이 같은 달에 시작하고 끝나서 저렇게 풀이 할 수 있던거고 월이 넘어갔으면 틀린 풀이이다.

그리고 지속기간이라길래 시작한 날과 끝난 날을 모두 포함하는거라 생각해서 1을 더했는데 아니었나 보다.

 

datediff()두 날짜 사이의 일 수를 반환해주는 함수이다.

datediff(a, b) 로 사용하고 a에서 b를 뺀 일 수를 반환해 주어서 만약 날짜 반대로 넣으면 음수가 나오게 된다.

 

 


사실 이번 연습문제는 푼지는 좀 되었는데, 모르는 함수가 많이 나왔어서 새로 찾고 정리하느라 포스팅은 늦었다.

새롭게 알게 된 함수들은 sql 기초문법에 추가해서 올려야겠다.