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

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

sintory-04 2025. 1. 21. 15:11

[마지막 연습 문제]

다음과 같은 상품(products) 테이블과 주문(orders) 테이블이 있습니다.

- 이번 문제에서는 MYSQL에서 실제 TABLE을 만들어서 진행하였다.

44. 모든 주문의 주문 ID와 주문된 상품의 이름을 나열하는 쿼리를 작성해주세요!

SELECT od.id, pd.name
FROM orders od, products pd
WHERE od.product_id = pd.id

- 결과는 아래와 같다.

45. 총 매출(price * quantity의 합)이 가장 높은 상품의 ID와 해당 상품의 총 매출을 가져오는 쿼리를 작성해주세요!

- GROUP BY 없이 집계함수와 비집계함수를 함께 사용되는 것이 허용되지 않을 수 있다.

- 생각해보니, 둘이 그냥 곱하고, 그걸 ORDERBY 한후, LIMIT를 주면 되었다.

> 근데 다른 경우를 대비하여 집계함수가 계산할 기준으로 그룹화 해주는 것이 좋을 거 같다.

> 그리하여 각 상품별로 총 매출을 계산하려면 product_id와 product_name으로 그룹화하는것이 나을 것이다.

SELECT SUM(pd.price*od.quantity) as total, pd.name
FROM products pd
join orders od on od.product_id = pd.id
GROUP BY pd.name, od.product_id
ORDER BY total DESC
LIMIT 1

46. 각 상품 ID별로 판매된 총 수량(quantity)을 계산하는 쿼리를 작성해주세요!

SELECT pd.name,SUM(od.quantity)
FROM products pd
JOIN orders od ON pd.id=od.product_id
GROUP BY od.product_id, pd.name

47. 2023년 3월 3일 이후에 주문된 모든 상품의 이름을 나열하는 쿼리를 작성해주세요!

SELECT pd.name, od.order_date
FROM orders od
JOIN products pd ON pd.id=od.product_id
WHERE od.order_date >= '2023-03-03'

48. 가장 많이 판매된 상품의 이름을 찾는 쿼리를 작성해주세요!

- 가장 많이 판매된 상품이라고 했기 때문에 수량이 많은걸 택하겠다.

SELECT pd.name, SUM(od.quantity) as total
FROM products pd
JOIN orders od ON od.product_id = pd.id
GROUP BY od.product_id,pd.name
ORDER BY total DESC
LIMIT 1

** 여기부터는 다른 데이터도 추가해 보았다. 예외로 처리될 경우를 대비해서 데이터를 조금 더 추가하였다.

INSERT INTO orders (id, product_id, quantity, order_date) VALUES
(104, 1, 4, '2023-04-01'),
(105, 2, 3, '2023-04-02'),
(106, 3, 2, '2023-04-04');

INSERT INTO products (id,name,price) VALUES (4,'테스트',500);

49. 각 상품 ID별로 평균 주문 수량을 계산하는 쿼리를 작성해주세요!

SELECT pd.name, AVG(od.quantity)
FROM orders od
JOIN products pd ON pd.id=od.product_id
GROUP BY od.product_id, pd.name

50. 판매되지 않은 상품의 ID와 이름을 찾는 쿼리를 작성해주세요!

SELECT id, name
FROM products
WHERE id NOT IN (SELECT product_id FROM orders);

 

SQL 걷기반 완료 : > ! 금,토,일,월,화 5일정도 걸렸다. 

SQL을 배운지 꽤 돼서 그런가 시간이 걸렸던 거 같다 ㅠㅡㅠ.. 

얼른 걷기반 자바 완료 후 SQLD 수업과 WEB수업을 들을 예정이다 !