백엔드 부트캠프[사전캠프]/문제풀이

[내일배움캠프-사전캠프] SQL 단계별 문제 풀이

sintory-04 2025. 1. 18. 22:31

빠르게 자바를 배우고자, SQL은 주말에 시간을 내어 진도를 빼보고자 한다.

SQL은 몇번 배운 적이 있기 때문에 리마인드 하는 느낌으로 문제를 풀어보고자 한다.

 

[3단계] 상품 주문이 들어왔으니 주문을 처리해봅시다!

9. orders 테이블에서 주문 수량(amount)이 2개 이상인 주문을 진행한 소비자의 ID(customer_id)만 선택하는 쿼리를 작성해주세요!

SELECT customer_id
FROM orders
WHERE amount >= 2

뭐를? 소비자 아이디를.

어디서? orders에서

조건은? amount가 2개 이상인것만.

10. orders 테이블에서 2023년 11월 2일 이후에 주문된 주문 수량(amount)이 2개 이상인 주문을 선택하는 쿼리를 작성해주세요!

SELECT *
FROM orders
WHERE order_date > '2023-11-02' AND amount >= 2

- 날짜도 문자열로 처리해서 이상, 이하(>,<) 주면 됨.

- 뭐를? 모든 열을/ 특정 컬럼을 제시하지 않음.

- 어디서?  orders에서

- 조건은? amount >=2 And(그리고) order_date > '2023-11-02'


11. orders 테이블에서 주문 수량이 3개 미만이면서 배송비(shipping_fee)가 15000원보다 비싼 주문을 선택하는 쿼리를 작성해주세요!

SELECT *
FROM orders
WHERE amount < 3 AND shipping_fee > 15000

- 뭐를? 모든 열을/ 특정 컬럼을 제시하지 않음.

- 어디서? orders 에서

- 조건은? amount < 3 AND shipping_fee >= 15000 AND


12. orders 테이블에서 배송비가 높은 금액 순으로 정렬하는 쿼리를 작성해주세요!

- 뭐를? 모든 열을/ 특정 컬럼을 제시하지 않음.

- 어디서? orders에서

- 조건은? 없음

- 정렬은? ORDER BY shipping_fee DESC

SELECT *
FROM orders
ORDER BY shipping_fee DESC

* 정렬은 2가지가 있다. 오름차순과 내림차순.

- ASC 오름차순, DESC 내림차순

- 값이 높은게 올려면 DESC 를 해야한다.

 

[4단계] 이제 놀만큼 놀았으니 다시 공부해봅시다!


13. sparta_students 테이블에서 모든 학생의 이름(name)과 트랙(track)을 선택하는 쿼리를 작성해주세요!

- 뭐를? name과 track을

- 어디서? sparta_students 에서

SELECT name, track 
FROM sparta_students


14. sparta_students 테이블에서 Unity 트랙 소속이 아닌 학생들을 선택하는 쿼리를 작성해주세요!

- 뭐를? 모든 열을/ 특정 컬럼을 제시하지 않음.

- 어디서? sparta_students 에서 

- 조건은? track 이 Unity가 아닌 것 

SELECT * FROM sparta_students WHERE track != 'Unity' 
SELECT * FROM sparta_students WHERE track NOT IN ('Unity')


15. sparta_students 테이블에서 입학년도(enrollment_year)가 2021년인 학생과 2023년인 학생을 선택하는 쿼리를 작성해주세요!

- 뭐를? 모든 열을/ 특정 컬럼을 제시하지 않음.

- 어디서? sparta_students 에서

- 조건은?  2021년, 2023년 학생.

SELECT * 
FROM sparta_students 
WHERE enrollment_year IN (2021, 2023)

16. sparta_students 테이블에서 Node.js 트랙 소속이고 학점이 ‘A’인 학생의 입학년도를 선택하는 쿼리를 작성해주세요!

- 뭐를? 입학년도를

- 어디서? sparta_students에서 

- 조건은? track 이 Node.js 랑 grade 도 'A' 인것.

SELECT enrollment_year 
FROM sparta_students 
WHERE track = 'Node.js' AND grade = 'A';

 

[5단계] 공부하다보니 팀 프로젝트 시간이 왔어요!

17. team_projects 테이블에서 AWS 예산(aws_cost)이 40000 이상 들어간 프로젝트들의 이름을 선택하는 쿼리를 작성해주세요!

- 뭐를? name

- 어디서? team_projects 에서

- 조건은? aws_cost >= 40000

SELECT name
FROM team_projects 
WHERE aws_cost >= 40000


18. team_projects 테이블에서 2022년에 시작된 프로젝트를 선택하는 쿼리를 작성해주요! 단, start_date < ‘2023-01-01’ 조건을 사용하지 말고 쿼리를 작성해주세요!

- 뭐를? 모든 열을/ 특정 컬럼을 제시하지 않음.

- 어디서? team_projects 에서

- 조건은? start_date LIKE "2023%"

SELECT *
FROM team_projects 
WHERE YEAR(start_date) = 2022
SELECT *
FROM team_projects 
WHERE start_date LIKE "2022%"

** 두가지 사용 가능하다. 

** LIKE 문을 사용하여 "2022%" 와 같이 사용하거나,

** year() 함수를 이용해서 년도만 추출 후 YEAR()= 2022 이런식으로 사용해도 된다.


19. team_projects 테이블에서 현재 진행중인 프로젝트를 선택하는 쿼리를 작성해주세요. 단, 지금 시점의 날짜를 하드코딩해서 쿼리하지 말아주세요!

** 여기서 하드코딩이란? 코드가 동적으로 작동하는 것이 아닌 정적으로 작동되는 걸 말한다. 그러니까 값(오늘 날짜)이 달라지면 값도 달라져야하는데. 하드코딩 해버리면 (즉 오늘이라는 날짜를 값으로 고정시켜버리면), 값이 동적으로 변경되지 않는다는 것이다.

** 그렇다면 어떻게 하여야하나? 바로 "CURDATE()"라는 함수를 이용할 수 있다. 오늘 날짜를 반환해주는 함수로 BETWEEN 과 함께 사용하겠다.

- 뭐를? 모든 열을/ 특정 컬럼을 제시하지 않음.

- 어디서? team_projects 에서  

- 조건은?  CURDATE() BETWEEN start_date AND end_date

SELECT * 
FROM team_projects 
WHERE CURDATE() BETWEEN start_date AND end_date


20. team_projects 테이블에서 각 프로젝트의 지속 기간을 일 수로 계산하는 쿼리를 작성해주세요!

** 지속 기간을 어떻게 구하냐? 바로 날짜 간의 차이를 구하면 된다.

** 그런데, SQL 문에는 직접적인 뺄셈 문이 없다. 심지어 String(Date)문은 덧셈 시 에러가 난다. 그리하여 DATEDIFF 라는 함수를 사용해 줄 것이다. 두 날짜 간의 차이를 반환해주는 함수이다.

- 뭐를? DATEDIFF(start, end) 

- 어디서? team_projects 에서

SELECT name, DATEDIFF(end_date, start_date) 
FROM team_projects

** 여기서 헷갈릴 수 있는 부분이 있다. 바로 DATEDIFF를 SELECT 문제 넣은 것이다. 왜 조건문 같은데 SELECT 에 넣냐? 라고 할 수 있지만, 우리가 조회할 것이 바로 차이값을 낸 컬럼이기 때문이다. WHERE은 어떠한 문에 해당하는 컬럼을 조회하는 것이고 SELECT는 계산된 컬럼을 보여라. 라는 것으로 이 차이를 이해해야 한다. 우리가 '지속 기간'의 조건을 가진 컬럼을 찾는 것이 아니라, 지속기간 이라는 열을 조회하는 것이라고 이해하면 쉬울 거 같다. 

 

 

오늘은 끝 : >