SQL中的WITH语句:公共表达式CTE,用作临时视图或子查询的定义方式,创建临时的结果集

在SQL中,WITH语句通常被用作一种临时视图或子查询的定义方式,可以创建临时的结果集,这些结果集可以在主查询中被引用。这种结构也被称为公共表达式(CTE:Common Table Expressions)。

01 语法结构

WITH tmp_name AS (            SELECT column1, column2, ...            FROM table_name            WHERE condition            )            SELECT ...            FROM tmp_name            WHERE condition;

02 应用示例 

这里通过表data_learning.product_order(商品销量表)、data_learning.product(商品信息表)、data_learning.product_category(商品二级分类信息表)进行举例,data_learning是之前创建的数据库。数据表示例数据分别如下:

data_learning.product_order(商品销量表):    

data_learning.product(商品信息表):

data_learning.product_category(商品二级分类信息表):

具体的创建数据库和数据表的SQL语句可以查看我之前的文章。

SQL创建数据库和数据表

数据分析师的日常,公众号:数据分析师的日常SQL创建数据库和数据表

2.1 示例1、封装和重用临时表 

通过WITH语句,我们可以封装复杂的子查询或视图,使其可重用。这样可以提高查询的可读性和可维护性。例如,假设我们需要在多个查询中使用某个常用的逻辑操作。使用WITH语句,我们可以将该逻辑操作封装为一个临时表,并在需要的地方重复使用。

比如

问题:查询商品数量超过5的商品类别,常见的SQL如下:

SELECT                b.category_name                ,COUNT(DISTINCT a.product_id) as product_cnt            FROM                data_learning.product_order a            LEFT JOIN                 data_learning.product_category b             ON a.category_id = b.category_id            GROUP BY 1            HAVING COUNT(DISTINCT a.product_id) > 5            ORDER BY 2 DESC            ;

使用with语句可以转换为:

with tmp as(            SELECT                b.category_name                ,COUNT(DISTINCT a.product_id) as product_cnt            FROM                data_learning.product_order a            LEFT JOIN                 data_learning.product_category b             ON a.category_id = b.category_id            GROUP BY 1            )            SELECT            category_name            ,product_cnt            FROM            tmp            WHERE product_cnt > 5            ORDER BY 2 DESC            ;

在实际工作中,在涉及到要使用多个表的多个业务时间字段时,我会先使用with语句建一个临时结果集,再写其他查询语句。当然,有建表权限的话可以直接建一个临时表,再做查询。

2.2 示例2、分解多业务步骤逻辑

复杂的业务逻辑可能需要多个步骤来计算最终结果。使用WITH语句可以使这些步骤更清晰。问题:查询销量超过2000的商品类别,这个类别有哪些产品及对应的产品价格和销量时多少。

with tmp1 as(            -- 首先找出销量超过2000的商品类别            SELECT            category_id            ,sales_volume            FROM            data_learning.product_order            WHERE            sales_volume > 2000            ),            tmp2 as (            -- 接着找出属于这些商品类别的产品名称及价格、销量            SELECT              a.category_id              ,a.product_id              ,a.sales_volume              ,b.product_name              ,b.price            FROM              data_learning.product_order a            LEFT JOIN                data_learning.product b            ON a.product_id = b.product_id            WHERE              a.category_id IN (SELECT category_id FROM tmp1)            )            -- 从最终的表中选择结果            SELECT              *            FROM              tmp2            ;

实际工作中涉及到的情况比这个步骤可能更多,此示例仅供理解WITH语句在分解多业务步骤逻辑中的应用。

2.3 示例3、数据清洗  

WITH语句也可以用来进行数据清洗,例如以下查询将删除重复的数据。

以下SQL语句仅供理解使用。

WITH CTE AS            (            SELECT               *,              ROW_NUMBER() OVER (PARTITION BY duplicate_column ORDER BY duplicate_column) AS row_num            FROM your_table            )            DELETE FROM CTE            WHERE row_num > 1;

WITH语句在数据分析中非常有用,上述仅仅举了几个我在实际工作中比较常用的一些应用场景,实际上其应用场景远不止这些,也欢迎朋友们一起交流自己在实际工作中都如何使用WITH语句。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晨曦_子画

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

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

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

打赏作者

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

抵扣说明:

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

余额充值