公共表表达式
通用表表达式 (CTE) 是 SQL 的一项特性,允许您定义一个可在 SQL 语句中引用的临时命名结果集。CTE 提供了一种将复杂的 SQL 查询分解为更小、更易于管理的部分的方法,使其更易于阅读、编写和维护。
CTE 使用 WITH
关键字定义,后跟逗号分隔的子查询列表,每个子查询都定义了一个可在后续查询中使用的命名结果集。CTE 的语法如下
WITH cte_name AS (
subquery
)
SELECT ...
在此语法中,cte_name
是 CTE 的名称,而 subquery
是定义结果集的子查询。然后,CTE 可以在后续查询中被引用,就像它是一个表或视图一样。
CTE 在处理涉及多层子查询的复杂查询时特别有用,因为它们允许您将查询分解为更小、更易于理解和调试的部分。此外,CTE 可以通过允许数据库优化和缓存子查询的结果,从而减少其执行次数,帮助提高查询性能。
Polars 支持使用 SQL 语法中的 WITH
子句的通用表表达式 (CTE)。下面是一个示例
ctx = pl.SQLContext()
df = pl.LazyFrame(
{"name": ["Alice", "Bob", "Charlie", "David"], "age": [25, 30, 35, 40]}
)
ctx.register("my_table", df)
result = ctx.execute(
"""
WITH older_people AS (
SELECT * FROM my_table WHERE age > 30
)
SELECT * FROM older_people WHERE STARTS_WITH(name,'C')
""",
eager=True,
)
print(result)
shape: (1, 2)
┌─────────┬─────┐
│ name ┆ age │
│ --- ┆ --- │
│ str ┆ i64 │
╞═════════╪═════╡
│ Charlie ┆ 35 │
└─────────┴─────┘
在此示例中,我们使用 SQLContext
的 execute()
方法执行包含 CTE 的 SQL 查询。该 CTE 从 my_table
LazyFrame 中选择 age
列大于 30 的所有行,并将其别名为 older_people
。然后我们执行第二个 SQL 查询,该查询从 older_people
CTE 中选择 name
列以字母 'C' 开头的所有行。