[SQL] Query 안의 Query - SubQuery

2024. 8. 18. 19:03Language/SQL

 지금까지는 SELETE 절이나 WHERE 절을 사용해 필요한 데이터만을 추리거나 필요에 따라 데이터를 가공하는 과정을 거치도록 쿼리를 작성했다. 이는 당장 작성에는 괜찮을지 몰라도 추후에 다시 보거나 다른 이가 봤을 땐 한 번에 이해하기 어렵다는 문제를 갖는다. 그래서 SQL 에는 좀 더 보기 편한 쿼리를 작성할 수 있게 'SubQuery' 라는 것이 있다. 개인적으로 학습하고 느낀점은 SQL 만을 사용해서 데이터에 접근하지 않을 나로써는 딱히 마음에 드는 방식은 아니었다. 아무튼 'SubQuery' 에 대해 알아보자.

 

1. 기본 문법

SELECT 컬럼명3, 컬럼명4	// A Query
FROM
(
SELECT 컬럼명1, 컬럼명2	// B Query
FROM 테이블명
) AS 별명

 

기본 구조를 통해 파악해보면 'A Query' 가 `B Query` 를 통해 생성된 결과 테이블을 가져다 쿼리가 수행되는 것이다. 즉, 기존처럼 중간에 데이터를 가공하고 변경하는 등의 과정이 아닌 미리 필요한 데이터를 가공하고 그 결과를 가져다 사용하는 방식으로 이해했다. 좀 더 줄여보면 `B Query` 결과 테이블을 `A Query` 의 FROM 절에 지정해 사용하는 것이다. 개인적으로 느끼기에는 사실 이전 방식이나 현재 이야기하는 방식 모두 복잡한 조건을 만족하면 둘 다 보기 불편해진다는 것은 똑같아 보인다. 더욱이 나의 경우는 SQL 만으로 데이터에 접근해 데이터를 사용하는 것이 아닐지라 '별로 매력적이지는 않은데?' 라는 생각이 들었다.

 

 

2. 사용 예시

 'food_orders' 테이블에서 각 음식점(본점, 분점 따로)별 위치한 '시/도' 의 정보배달의 평균 소요시간을 평가한 결과를 출력해보자. 배달 평균 소요시간의 평가 기준은 25분 미만이라면 '빠름', 25분 이상 40분 미만은 '보통' 그리고 그 외의 경우는 '느림' 으로 평가한다.

SELECT restaurant_name '음식점명', sido '시/도',
       CASE WHEN dt < 25 THEN '빠름'
            WHEN dt >= 25 AND dt < 40 THEN '보통'
            ELSE '느림' END '배달속도평가'
FROM
(
SELECT restaurant_name, SUBSTR(addr, 1, 2) sido, AVG(delivery_time) dt
FROM food_orders
GROUP BY 1,2
) a

음식점의 지점별 위치(시/도) 정보와 평균 배달속도 평가