인사말
안녕하세요~!
사전캠프도 이번주 금요일이 마지막이네요
아쉽게도 이번주 금요일엔 개인 사정이 있어서 참석은 못 하지만,
SQL의 마지막 문제는 풀어보았답니다!
오늘 공부한 내용도 포스팅 해보도록 하겠습니다!
ps. 부쩍 추워진 거 같으니, 감기 조심하세요 😘
🎁 마지막 연습 문제!
문제 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을 활용하여 데이터 명확히 끌고 오기!
'공부 > SQL 공부' 카테고리의 다른 글
[SQL] 내일배움캠프 퀘스트 8일차_ 9)와 10) (2) | 2024.11.20 |
---|---|
[SQL] 내일배움캠프 퀘스트 7일차_ 7)과 8) (0) | 2024.11.19 |
[SQL] 내일배움캠프 퀘스트 6일차_ 5)와 6) (0) | 2024.11.18 |
[SQL] 내일배움캠프 퀘스트 5일차_ 3)과 4) (3) | 2024.11.15 |
[SQL] 내일배움캠프 퀘스트 4일차_ 2) 이제 좀 벌었으니 flex 한 번 해볼까요?! (1) | 2024.11.14 |