Skip to content

常用表表达式

公共表表达式(CTEs)是SQL的一个特性,它允许你定义一个临时的命名结果集,该结果集可以在SQL语句中被引用。CTEs提供了一种将复杂的SQL查询分解为更小、更易管理的部分的方法,使得它们更易于阅读、编写和维护。

CTE 使用 WITH 关键字定义,后跟一个以逗号分隔的子查询列表,每个子查询定义一个可以在后续查询中使用的命名结果集。CTE 的语法如下:

WITH cte_name AS (
    subquery
)
SELECT ...

在这个语法中,cte_name 是CTE的名称,subquery 是定义结果集的子查询。然后,CTE可以在后续的查询中被引用,就像它是一个表或视图一样。

CTEs在处理涉及多级子查询的复杂查询时特别有用,因为它们允许您将查询分解为更小、更易管理的部分,这些部分更容易理解和调试。此外,CTEs可以通过允许数据库优化和缓存子查询的结果来帮助提高查询性能,减少需要执行的次数。

Polars 支持使用 SQL 语法中的 WITH 子句来实现公共表表达式(CTEs)。以下是一个示例

register · execute

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  │
└─────────┴─────┘

在这个例子中,我们使用SQLContextexecute()方法来执行一个包含CTE的SQL查询。CTE从my_table LazyFrame中选择age列大于30的所有行,并给它起别名older_people。然后我们执行第二个SQL查询,从older_people CTE中选择name列以字母'C'开头的所有行。