내일배움캠프(데이터 분석 부트캠프 1기)/TIL & WIL
<TIL> 2023-12-07
배또가또
2023. 12. 7. 20:26
내일배움캠프 사전학습캠프 넷째 날
스파르타코딩클럽 / 엑셀보다 쉽고 빠른 SQL 4주차 수강완료
슬슬 SQL도 난이도가 높아짐
배운 것 : 서브쿼리와 조인문
이제 서브쿼리에 조인문 써가면서 1~3주차 때 배웠던 내용들 응용해가면서 복잡한 SQL를 적으니
공부할 맛이 더 나는 것 같다.
서브쿼리(Subquery)
- 서브쿼리를 사용할 때
- 여러 번의 연산을 수행해야할 때
- 조건문에 연산의 결과를 사용하고 싶을 때
- 조건문에 쿼리를 사용하고 싶을 때
SELECT restaurant_name,
sum_quantity,
sum_price,
CASE WHEN sum_quantity<=5 THEN 0.1
WHEN sum_quantity>15 AND sum_price>=300000 THEN 0.005
ELSE 0.01
END discount_rate
FROM
(
SELECT restaurant_name,
SUM(price) sum_price,
SUM(quantity) sum_quantity
FROM food_orders
GROUP BY 1
) a;
- 쿼리 해석
- 레스토랑에 따른 가격과 주문량의 합계를 서브쿼리로 하여
- 그 값을 기준으로 CASE구문을 사용하여 할인율을 정하는 쿼리
SELECT restaurant_name,
price_per_plate*ratio_of_add "수수료"
FROM
(
SELECT restaurant_name,
CASE WHEN price_per_plate<5000 THEN 0.005
WHEN price_per_plate between 5000 AND 19999 THEN 0.01
WHEN price_per_plate between 20000 AND 29999 THEN 0.02
ELSE 0.03
END ratio_of_add,
price_per_plate
FROM
(
SELECT restaurant_name, AVG(price/quantity) price_per_plate
FROM food_orders
GROUP BY 1
) a
) b;
- 쿼리 해석(서브쿼리를 통해 3중으로 구성)
- 레스토랑에 따른 평균 메뉴 가격을 계산하고
- 계산한 평균메뉴가격에 따른 수수료율을 CASE문으로 나누어주고
- 레스토랑별 메뉴 하나 당 평균 수수료를 계산함
조인문(Join)
- 두 테이블의 데이터를 합쳐서 사용하고 싶을 때 조인문을 사용
- LEFT JOIN, RIGHT JOIN, INNER JOIN이 있는데 LEFT와 RIGHT는 사실 기능적으로 같기 때문에 RIGHT는 생략
LEFT JOIN
- 공통 컬럼 (키값) 을 기준으로, 조인문 우측의 테이블에 값이 없더라도 모두 조회되는 경우
SELECT a.cuisine_type,
SUM(a.price),
SUM(a.price*discount_rate) discounted_price
FROM
(
SELECT f.price,
f.cuisine_type,
c.age,
(c.age-50) * 0.005 discount_rate
FROM food_orders f LEFT JOIN customers c ON f.customer_id = c.customer_id
WHERE c.age >=50
) a
GROUP BY 1
ORDER BY 3 DESC;
서브쿼리로 실행한 경우 서브쿼리의 alias인 a를 SELECT문에 이용하거나 생략할 수도 있다.
- 쿼리 해석
- 음식 주문테이블에 고객테이블을 LEFT JOIN해서
- 50살이 넘는 고객을 대상으로 나이가 더 높을수록 높아지는 할인율(discount_rate)를 계산
- 음식 종류(cuisine_type)에 따른 음식가격 합계와, 2에서 계산한 할인율을 적용한 음식가격의 합계를 계산
- 그리고 이를 할인된 음식 가격합계가 높은 순으로 출력
INNER JOIN
- 공통 컬럼 (키값) 을 기준으로, 두 테이블 모두에 있는 값만 조회
SELECT f.order_id,
f.restaurant_name,
f.price,
p.vat,
f.price * p.vat vat2
FROM food_orders f INNER JOIN payments p ON f.order_id = p.order_id;
- 쿼리 해석
- 음식 주문테이블에 결제테이블을 INNER JOIN해서 연결하는 것으로
- 주문번호, 레스토랑명, 가격, 수수료율, 가격*수수료율(수수료) 를 출력함