常用表表达式
公共表表达式(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)。以下是一个示例
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'开头的所有行。