-
<TIL> 2023-12-07내일배움캠프(데이터 분석 부트캠프 1기)/TIL & WIL 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해서 연결하는 것으로
- 주문번호, 레스토랑명, 가격, 수수료율, 가격*수수료율(수수료) 를 출력함
'내일배움캠프(데이터 분석 부트캠프 1기) > TIL & WIL' 카테고리의 다른 글
<TIL> 2023-12-12 (0) 2023.12.12 <TIL> 2023-12-11 (1) 2023.12.11 <TIL> 2023-12-06 (1) 2023.12.06 <TIL> 2023-12-05 (3) 2023.12.05 <TIL> 2023-12-04 (1) 2023.12.04 - 서브쿼리를 사용할 때