集合操作#

函数

描述

EXCEPT

合并两个SELECT语句的结果集,只返回出现在第一个结果集中但不在第二个结果集中的行。

INTERSECT

将两个SELECT语句的结果集合并,仅返回在两个结果集中都出现的行。

UNION

合并两个或多个SELECT语句的不同结果集。 最终结果集将没有重复的行。

UNION ALL

将两个或多个SELECT语句的完整结果集合并。 最终结果集将由每个查询的所有行组成。

UNION [ALL] BY NAME

将两个或多个SELECT语句的结果集合并,按名称而不是按顺序位置对齐列;如果省略ALL,最终结果将没有重复行。这也将合并两个数据集的列。

EXCEPT#

合并两个SELECT语句的结果集,仅返回出现在第一个结果集中但不在第二个结果集中的行。

示例:

lf1 = pl.LazyFrame({
    "id": [1, 2, 3],
    "name": ["Alice", "Bob", "Charlie"],
})
lf2 = pl.LazyFrame({
    "id": [2, 3, 4],
    "age": [30, 25, 45],
    "name": ["Bob", "Charlie", "David"],
})
pl.sql("""
    SELECT id, name FROM lf1
    EXCEPT
    SELECT id, name FROM lf2
""").sort(by="id").collect()
# shape: (1, 2)
# ┌─────┬───────┐
# │ id  ┆ name  │
# │ --- ┆ ---   │
# │ i64 ┆ str   │
# ╞═════╪═══════╡
# │ 1   ┆ Alice │
# └─────┴───────┘

交集#

将两个SELECT语句的结果集合并,仅返回在两个结果集中都出现的行。

示例:

pl.sql("""
    SELECT id, name FROM lf1
    INTERSECT
    SELECT id, name FROM lf2
""").sort(by="id").collect()
# shape: (2, 2)
# ┌─────┬─────────┐
# │ id  ┆ name    │
# │ --- ┆ ---     │
# │ i64 ┆ str     │
# ╞═════╪═════════╡
# │ 2   ┆ Bob     │
# │ 3   ┆ Charlie │
# └─────┴─────────┘

UNION#

合并两个或多个SELECT语句的不同结果集。 最终结果集将没有重复的行。

示例:

pl.sql("""
    SELECT id, name FROM lf1
    UNION
    SELECT id, name FROM lf2
""").sort(by="id").collect()
# shape: (4, 2)
# ┌─────┬─────────┐
# │ id  ┆ name    │
# │ --- ┆ ---     │
# │ i64 ┆ str     │
# ╞═════╪═════════╡
# │ 1   ┆ Alice   │
# │ 2   ┆ Bob     │
# │ 3   ┆ Charlie │
# │ 4   ┆ David   │
# └─────┴─────────┘

UNION ALL#

将两个或多个SELECT语句的完整结果集合并。 最终结果集将由每个查询的所有行组成。

示例:

pl.sql("""
    SELECT id, name FROM lf1
    UNION ALL
    SELECT id, name FROM lf2
""").sort(by="id").collect()
# shape: (6, 2)
# ┌─────┬─────────┐
# │ id  ┆ name    │
# │ --- ┆ ---     │
# │ i64 ┆ str     │
# ╞═════╪═════════╡
# │ 1   ┆ Alice   │
# │ 2   ┆ Bob     │
# │ 2   ┆ Bob     │
# │ 3   ┆ Charlie │
# │ 3   ┆ Charlie │
# │ 4   ┆ David   │
# └─────┴─────────┘

按名称合并#

将两个或多个SELECT语句的结果集合并,按名称而不是按顺序位置对齐列;如果省略ALL,最终结果将没有重复行。这也将合并两个数据集的列。

示例:

pl.sql("""
    SELECT * FROM lf1
    UNION BY NAME
    SELECT * FROM lf2
""").sort(by="id").collect()
# shape: (6, 3)
# ┌─────┬─────────┬──────┐
# │ id  ┆ name    ┆ age  │
# │ --- ┆ ---     ┆ ---  │
# │ i64 ┆ str     ┆ i64  │
# ╞═════╪═════════╪══════╡
# │ 1   ┆ Alice   ┆ null │
# │ 2   ┆ Bob     ┆ null │
# │ 2   ┆ Bob     ┆ 30   │
# │ 3   ┆ Charlie ┆ 25   │
# │ 3   ┆ Charlie ┆ null │
# │ 4   ┆ David   ┆ 45   │
# └─────┴─────────┴──────┘