子查询与公用表表达式(CTE)

Snowflake SQL 入门

George Boorman

Senior Curriculum Manager, DataCamp

子查询

  • 嵌套查询
  • 可用于 FROMWHEREHAVINGSELECT 子句
  • 示例:
    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 入门

公用表表达式(CTE)

一般语法:

-- WITH 关键字
WITH cte1 AS ( -- CTE 名称
        SELECT col_1, col_2
            FROM table1
    )
    ...
SELECT ... 
FROM cte1 -- 查询 CTE
;
Snowflake SQL 入门

公用表表达式(CTE)

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...