SQL 연습2 - TIL 23_07_27 (목)

jegw·2023년 7월 28일
0

TIL

목록 보기
53/77
post-custom-banner

오늘 한 일

키오스크 과제

  • 발주 상태 수정
  • 상품 주문 (미완성)

후발대 - SQL 실습


SQL

  1. 삭제되지 않은 order_review의 모든 내용과 리뷰를 작성한 메뉴의 이름을 조회
select r.*, om.menu_name from order_review r
inner join order_menu om on r.order_menu_id = om.id
where is_deleted = null;

❌ is_deleted = null
✅ is_deleted = 0

정답

select r.*, om.menu_name from order_review r
inner join order_menu om on r.order_menu_id = om.id
where is_deleted = 0;
  1. order(주문) 주문한 고객의 이름과 주문 메뉴 이름, 주문 메뉴의 가격, 주문 메뉴의 개수를 출력 (inner join 사용)
select o.orderer_name, om.menu_name, om.price, om.count from `order` o
inner join order_menu om on o.id = om.order_id;


order를 ``로 감싼 이유는 예약어이기 때문에 datagrip이 헷갈리지 않도록 쓴 것.
datagrip : jetbrains의 프로그램

  1. 주문한 음식중에서 아직 리뷰가 작성되지 않은 주문의 주문자 이름과 주문한 메뉴 이름을 출력
<order 기준>

select o.orderer_name, om.menu_name from `order` o
left join order_menu om on o.id = om.order_id
left join order_review r on om.id = r.order_menu_id
where r.id = null;

<order_menu 기준>

select o.orderer_name, om.menu_name from order_menu om
left join `order` o on om.order_id = o.id
left join order_review r on om.id = r.order_menu_id

❌ where r.id = null;
✅ where r.id is null;



1. seller(판매자)가 소유하고 있는 store(매장)의 개수와 seller의 id를 조회

SELECT seller.id, count(*) as 매장개수 FROM seller 
inner join store s on seller.id = s.seller_id
group by seller.id;
  • 정답 (결과는 같다. join이 필요없을뿐)
select seller_id, count(*) from store
group by seller_id;

2. seller(판매자)가 소유하고 있는 store(매장)의 개수와 seller의 id, owner_name(대표자명) 을 조회하고 소유하는 매장이 적은 순으로 정렬

select se.id, se.owner_name, count(s.id) as 매장개수 from store s
inner join seller se on s.seller_id = se.id
group by se.id
order by 매장개수;

  1. 등록된 (삭제되지 않은) 리뷰의 평균 리뷰점수를 조회
select avg(score) from order_review
where is_deleted is false;
  • 답 (둘 다 가능한 것인가?) 결과는 같게 나온다.
select avg(score) from order_review
where is_deleted=0;

1. 고객별로 주문횟수와 고객의 이름과, 이메일을 조회 (단, 주문횟수가 많은 순으로 정렬)

select name, email, count(*) as 주문개수 from customer c
inner join `order` o on c.id = o.customer_id
group by c.id
order by 주문개수 desc;

1. 소유한 매장이 4개 이상인 seller(판매자)의 대표자명(owner_name)을 조회

select owner_name from seller se
inner join store s on se.id = s.seller_id
group by se.id
order by count(*)
having count(*) > 3;

❌order by는 필요 없다.

select owner_name, count(s.id) as 매장개수 from seller se
inner join store s on se.id = s.seller_id
group by se.id
having 매장개수> 3;

1. 각 메뉴별로 몇개가 팔렸는지 메뉴이름과 함께 조회하고 많이 팔린 개수 순으로 정렬

주문이 아니라 주문개수의 총합 

select menu_name, sum(count) as 판매개수 from order_menu
group by menu_id
order by 판매개수 desc;

❌ order_menu를 기준으로 하면 팔린 메뉴들의 판매개수만 조회된다.

한번도 안팔린 메뉴(주문이 없는 메뉴)들은 조회되지 않는다.

select m.name, sum(om.count) as 판매개수 from menu m
left join order_menu om on m.id = om.menu_id
group by m.id
order by 판매개수 desc;

7. 전체주문의 평균 결제금액을 조회 (서브쿼리 이용)

전체 주문의 가격의 합

select (a.전체가격/ a.주문개수)
from (select count(*) as 주문개수 , sum(price*count) as 전체가격 from order_menu) as a

❌ order_menu 테이블에는 order_id가 겹치는 것도 있다. 그러므로 그것들은 1개의 주문으로 봐야한다. 그러니 order_id로 그룹화해야 한다.
주문 별로 그룹화됐기 때문에 avg를 사용하면 평균을 구할 수 있다.

정답

select avg(table1.전체가격)
from (select sum(price*count) as 전체가격
      from order_menu 
			group by order_id) as table1

8. 결제 금액이 가장 많은 주문 고객의 이름을 조회
```sql
  1. 주문당 평균 결제금액을 조회
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 7월 28일

이런 유용한 정보를 나눠주셔서 감사합니다.

답글 달기