인사말

안녕하세요~!

사전캠프도 이번주 금요일이 마지막이네요

아쉽게도 이번주 금요일엔 개인 사정이 있어서 참석은 못 하지만,

SQL의 마지막 문제는 풀어보았답니다!

오늘 공부한 내용도 포스팅 해보도록 하겠습니다!

ps. 부쩍 추워진 거 같으니, 감기 조심하세요 😘


🎁 마지막 연습 문제!

데이터 베이스가 될 파일 내용입니다.
마지막 문제_20241121배민경.sql
0.00MB

 

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

select p.name, o.id
from products p
join orders o
on p.id = o.product_id;

이제는 "Join"을 어떻게 쓰는지 이해가 된 거 같아요!

막힘없이 쭈르륵 나열한 저를 보니까 기분이 좋았습니다 😋.

팀원분들이랑 대화를 나눴는데 "Join"만 쓸 때는 "Inner"를 내포하는 거라고 하더라구요

그래서

"left join"를 쓰는 게 아닐까 싶은 생각을 했습니다

좀 더 확실한 범위값에서 데이터를 갖고 오는 느낌?으로 이해했거든요 😎

 

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

select p.id, sum(p.price * o.quantity) as total
from products p
join orders o
on p.id = o.product_id
group by p.id
order by total desc
limit 1;

이렇게 킨 코드를 막힘없이 적어내린 저한테 너무 신기했어요 😋

sum이랑 avg랑 count를 쓸 때는 "group by"를 함께 적어줘야 한다는 거!

스스로 인지하고 있다는 느낌을 받아서 기분 좋았습니다

점점 익숙해져 가는 걸지두요? 😏

 

하지만, 틀렸죠?

제가 보여드린 코드는, 데이터가 작아서 가능했던 거였구요

데이터의 크기가 만일 컸더라면

select p.id, SUM(p.price * o.quantity) as 총매출
from products p
join orders o
on p.id = o.product_id
group by p.id
order by 총매출 DESC
LIMIT 1;

이렇게 Sum을 기입하여야 정확히 값을 불러와질 수 있음을 배웠습니다

 

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

select p.name, p.id, o.quantity
from products p
join orders o
on p.id = o.product_id;

저는 이번 문제들의 기준을 "Products" 파일로 작업하였습니다!

기준 파일을 정해놓고 작업을 하니까 편하더라구요!

그래서 막힘없이 코드를 만들어내지 않았을까 싶었어요 😊

 

하지만, 또 실수했죠?

"총 수량"이기 때문에

만일, 데이터 파일이 컸더라면 이번에도 Sum을 활용하는 게 맞았다고 생각합니다.

select o.product_id, SUM(o.quantity) as 총수량
from orders o
group by o.product_id;

 

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

select p.name
from products p
join orders o
on p.id = o.product_id
where o.order_date > '2023-03-03'
order by p.name desc;

"나열" 보자마자 'order by ~ desc 써야겠다'를 생각해낸 문제였습니다

아직은 SQL과 친해지는 과정이라서 그런지

코드를 짜낼 때마다 즐거움이 퐁~ 퐁~ 올라오네요

역시, 무엇이든지 새롭게 배우고 적응하고 공부한다는 행위 자체가

너무 즐겁고 성장해가는 저의 모습을 볼 수 있어서 좋습니다!

계속 공부하며 성장해나가는 저의 과정과 모습도 잘 담아보겠습니다 😋

 

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

select p.name, o.quantity
from products p
join orders o
on p.id = o.product_id
order by o.quantity desc
limit 1;

"가장 많이 판매된"이라는 문구를 보고

"limit"를 마지막에 작성함으로써 Best 1를 끌어온 문제였습니다

 

이번에도, Sum을 활용해야 했지 않았나 싶었어요

"가장 많이 판매된"이기 때문에 합해야 한다고 생각하거든요

그래서 팀원분들께 피드백 받은 후 수정하였습니다.

select p.name
from products p
join orders o on p.id = o.product_id
group by p.name
order by SUM(o.quantity) DESC
LIMIT 1;

 

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

select p.id, avg(o.quantity) as avg_orders
from products p
join orders o
on p.id = o.product_id
group by p.id;

앞서 언급하였던 avg 때도 group by 쓰는 걸 잊지 않았구요

여기서 제가 계속 놓치는 걸 찾았습니다

한 번 오류가 나서 뭐가 문제인지 코드를 천천히 살펴보았는데,

select p.id avg(o.quantity) as avg_orders
select p.id, avg(o.quantity) as avg_orders

두 개의 차이점이 보이시나요?

그렇습니다

제가 계속 콤마(,)를 빼먹어서 오류가 나더라구요

이제부터 알았으니, 다음 코드를 짤 때는 더 신경쓰면서 해야 할 거 같습니다

저의 실수를 이렇게 알게 되어서 다행이에요!

 

오늘의 마지막 문제입니다!

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

select p.id, p.name
from products p
left join orders o
on p.id = o.product_id 
where o.id is null;

여기서 제가 틀린 코드를 짰더라구요..

지금 보고 계시는 코드는 수정이 완료된 코드구요.

이전에는

select p.id, p.name
from products p
join orders o
on p.id = o.product_id 
where o.quantity is null;

이렇게 작성하였습니다.

생각을 해보니까,

지금 데이터 파일의 크기가 작아서 가능한 거고,

실제로 보는 데이터들은 파일 크기가 클 테니까

명확한 범위값을 주는 게 맞다고 생각합니다!

이 부분을 간과하고 있었던 거 같아요

이제라도 알았으면 됐죠 😋


마무리

최근에 새로운 팀원분이 오셨는데

다른 데서 조금은 배우고 오셨다 하셨거든요

그 분의 데이터를 바라볼 때 관점과 저의 관점을 비교할 수 있어서

너무 좋았습니다

저의 부족한 관점이 무엇이고, 데이터를 바라볼 때 접근법을 어떻게 해야 할지

생각할 수 있었던 기회였거든요 😋

차차 발전해가고, 여럿 사람들과 대화를 많이 나누고 싶습니다

서로 발전해나갔으면 좋겠어요 🤗

 

이제 다음주부터는 본 캠프 내용으로 찾아뵙겠습니다!

감사합니다 🤗

 

<새롭게 알게 된 것들>

1. "Join"은 "Inner"의 개념을 내포하고 있음

2. 데이터 값이 클 때를 생각해야 함

3. left join을 잘 활용해보자!

4. "총", "모든"이 들어갈 땐 Sum을 활용하여 데이터 명확히 끌고 오기! 

+ Recent posts