ClickHouse 中的公用表表达式Common Table Expression (CTE)

本文介绍了在ClickHouse中如何使用公共表表达式(CTE)来优化查询,特别是在处理可多次复用的查询结果、递归查询以及提升SQL可读性时。CTE与临时表和子查询相比,具有更优的性能和内存效率。通过示例展示了如何创建和使用CTE,并插入和查询数据。通过CTE,可以简化复杂查询,提高查询效率。
摘要由CSDN通过智能技术生成

在以下情况下使用 CTE在以下情况下使用 CTE在以下情况下使用 CTE很方便:

  • 当一个请求可以获取数据,并且它的大小适合内存空间时
  • 需要多次使用此查询的结果
  • 创建递归查询

一个好处是您的 SQL 查询的可读性得到了提高您的 SQL 查询的可读性得到了提高您的 SQL 查询的可读性得到了提高

CTE 与临时表和嵌套查询有什么区别?

  • 如果子查询是相关的如果子查询是相关的如果子查询是相关的,然后对选择中的每一行重复其调用,从而大大增加了执行此查询的成本。
  • 用大量数据填充临时表会在磁盘上产生负载。
  • 由于存储临时表的特殊性,使用它们执行查询会增加执行时间

句法

ClickHouse支持WITH <expression> AS <identifier> 以及WITH <identifier> AS <subquery expression>语法。

  • 使用 启动 CTE WITH
  • 为查询提供名称。
  • 跟随AS
  • 定义查询。
  • 如果需要多个 CTE,请用逗号分隔它们

WITH locations AS
    (
        SELECT location
        FROM table
        WHERE date > (today() - 10)
    )
SELECT *
FROM locations

  • 使用 启动 CTE WITH
  • 定义一个表达式。
  • 跟随AS
  • 为表达式提供一个名称。
  • 如果需要多个 CTE,请用逗号分隔它们。

WITH ('USA', 'BRA') AS locations
SELECT 'ARG' IN (locations)

Example

Create:

CREATE TABLE SpareParts
(
    `id` UInt32,
    `partName` String,
    `partOrigin` String,
    `storeID` UInt32
)
ENGINE = MergeTree()
ORDER BY id

Insert:

INSERT INTO SpareParts VALUES (1, 'headlight', 'USA', 1)
INSERT INTO SpareParts VALUES (2, 'hood', 'JPN', 1)
INSERT INTO SpareParts VALUES (3, 'bumper', 'USA', 1)
INSERT INTO SpareParts VALUES (4, 'radiator', 'BRA', 3)
INSERT INTO SpareParts VALUES (5, 'wheel', 'BRA', 2)
INSERT INTO SpareParts VALUES (6, 'stabilizer', 'ARG', 3)
INSERT INTO SpareParts VALUES (7, 'absorber', 'TUR', 2)
INSERT INTO SpareParts VALUES (8, 'cable', 'MEX', 1)
INSERT INTO SpareParts VALUES (9, 'spring', 'MEX', 3)
INSERT INTO SpareParts VALUES (10, 'door', 'USA', 2)

Select:

WITH
    originsByStore AS
    (
        SELECT
            storeID,
            groupArray(partOrigin) AS origins
        FROM SpareParts
        GROUP BY storeID
    ),
    partsByStore AS
    (
        SELECT
            storeID,
            groupArray(partName) AS partNames
        FROM SpareParts
        GROUP BY storeID
    ),
    has(origins, 'USA') = 1 AS isUSA
SELECT
    storeID,
    origins,
    partNames,
    isUSA
FROM originsByStore AS t1
LEFT JOIN
(
    SELECT
        storeID,
        partNames
    FROM partsByStore
) AS t2 USING (storeID)

Result:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

复杂的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值