서브쿼리와 공통 테이블 식

Snowflake SQL 입문

George Boorman

Senior Curriculum Manager, DataCamp

서브쿼리

  • 중첩 쿼리
  • FROM, WHERE, HAVING, SELECT 절에서 사용
  • 예:
    SELECT column1 
    FROM table1 
    WHERE column1 = (SELECT column2 FROM table2 WHERE condition)
    
  • 유형: 상관/비상관 서브쿼리
Snowflake SQL 입문

비상관 서브쿼리

-- 서브쿼리에서 찾은 최대 가격과 같은 피자를 반환하는 메인 쿼리
SELECT pizza_id
FROM pizzas
-- 가장 높은 피자 가격을 구하는 비상관 서브쿼리
WHERE price = (
    SELECT MAX(price)
    FROM pizzas
)
  • 서브쿼리는 메인 쿼리와 상호작용하지 않음
Snowflake SQL 입문

상관 서브쿼리

  • 서브쿼리가 메인 쿼리의 컬럼을 참조
SELECT pt.name, 
       pz.price, 
       pt.category
FROM pizzas AS pz
JOIN pizza_type AS pt 
    ON pz.pizza_type_id = pt.pizza_type_id
WHERE pz.price = (
  -- 카테고리별 최대 가격 식별
    SELECT MAX(p2.price) -- 최대 가격
    FROM pizzas AS p2
    WHERE -- 상관: 외부 쿼리 컬럼 사용 
      p2.pizza_type_id = pz.pizza_type_id
)
Snowflake SQL 입문

공통 테이블 식

일반 문법:

-- WITH 키워드
WITH cte1 AS ( -- CTE 이름
        SELECT col_1, col_2
            FROM table1
    )
    ...
SELECT ... 
FROM cte1 -- CTE 조회
;
Snowflake SQL 입문

공통 테이블 식

WITH max_price AS ( -- max_price 라는 CTE
    SELECT pizza_type_id, 
           MAX(price) AS max_price
    FROM pizzas
    GROUP BY pizza_type_id
)

-- 메인 쿼리 SELECT pt.name, pz.price, pt.category FROM pizzas AS pz JOIN pizza_type AS pt ON pz.pizza_type_id = pt.pizza_type_id JOIN max_price AS mp -- CTE max_price 조인 ON pt.pizza_type_id = mp.pizza_type_id WHERE pz.price < mp.max_price -- CTE 컬럼 max_price와 비교
Snowflake SQL 입문

다중 CTE

-- 여러 CTE를 콤마로 구분해 정의
WITH cte1 AS (
    SELECT ...
    FROM ...
),

cte2 AS ( SELECT ... FROM ... )
-- 두 CTE를 결합하는 메인 쿼리 SELECT ... FROM cte1 JOIN cte2 ON ... WHERE ...
Snowflake SQL 입문

CTE를 사용하는 이유

  • 복잡한 작업 관리
  • 모듈화
  • 가독성 향상
  • 재사용 가능
Snowflake SQL 입문

연습해 봅시다!

Snowflake SQL 입문

Preparing Video For Download...