12.SQL (Subquery)여러번의 연산을 한 번에 하기

김요한·2024년 6월 26일

Subquery

  • 여러번의 연산을 수행해야 할 때 필요
  • 조건문에 연산 결과를 사용해야 할 때
    (ex 음식 타입별 평균 주문금액에 따라 음식비를 상/중/하로 나누고 싶을 때)
  • 조건에 Query 결과를 사용하고 싶을 때
    (ex 30대 이상이 주문한 결과만 조회하고 싶을 때)

Subquery의 기본 구조

select column1, special_column
from
    ( /* subquery */
    select column1, column2 special_column
    from table1
    ) a

*Subquery가 끝나면 ()소괄호 끝에 Alias를 붙여준다(네이밍은 상관없음)



Subquery 예제1- 음식 주문시간이 25분보다 초과한 시간을 가져오기

select order_id, restaurant_name, if(over_time>=0, over_time, 0) over_time
from                          #-25를 했을 때 0이하인 -n값이 올수 있으니if문으로 처리해준다.
(
select order_id, restaurant_name, food_preparation_time-25 over_time
from food_orders   #음식 준비 시간에서 -25를 빼 초과한 시간을 over_time으로 as해준다.
) a



Subqury 예제2

  • 음식점의 평균 단가별 segmentation 을 진행하고, 그룹에 따라 수수료 연산하기
    (수수료 구간 -
    ~5000원 미만 0.05%
    ~20000원 미만 1%
    ~30000원 미만 2%
    30000원 초과 3%)
select restaurant_name,
       price_per_plate*ratio_of_add "수수료" 
from       #3.최종적으로 음식점이름과 수수료율을 적용한 판매단가를 조회한다.
(
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  #2.판매단가(price_per_plate)를 불러와 CASE문을 활용해 각 수수료율을 계산
from 
(
select restaurant_name, avg(price/quantity) price_per_plate
from food_orders     #1.음식점 이름과 평균판매단가를 연산
group by 1           #음식점 이름을 기준으로 나열
) a
) b

1.조건이 복잡해 질 경우에는 흐름을 먼저 파악하자.
2.Subquery의 첫 번째 안쪽 부분1. (a) 2. (b) 순대로 파악하자.

  • 2.구문으로 만들기
    1. 어떤 테이블에서 데이터를 뽑을 것인가
    2. 어떤 컬럼을 이용할 것인가
    3. 어떤 조건을 지정해야 하는가
    4. 어떤 함수 (수식) 을 이용해야 하는가
  • 2.구문으로 만들기 (해답)
    1. 어떤 테이블에서 데이터를 뽑을 것인가 → from food_orders
    2. 어떤 컬럼을 이용할 것인가 → restaurant_name, price, quantity
    3. 어떤 조건을 지정해야 하는가 → X
    4. 어떤 함수 (수식) 을 이용해야 하는가 → avg(price/quantity), case when, group by

0개의 댓글