zoukankan      html  css  js  c++  java
  • SQL---公共表表达式(CTEs)

    公共表表达式(CTEs)是一个命名的临时结果集。CTE不作为对象存储,仅在查询执行期间持续。

    有时我们在处理一些复杂查询的时候,需要把查询内容一步步分解,最后计算出想要的结果。因此我们需要保存这些中间数据,但是计算出最后结果之后这些数据就没用了,因此我们需要把这些中间计算过程保存在一个临时的结果集里。

    语法:

    WITH cte_name AS (
        query
    );

    注:CTE后面也可以跟其他的CTE,但只能使用一个with,多个CTE中间用逗号(,)分隔。

    例子:

    在合并两张表之前先进行筛选,尽可能删减掉不需要的行,只保留需要的行,这样编写出的SQL更高效。

    以下的SQL是非常低效的,因为它将先合并两个表,之后才对“2017年1月9日”之后的时间进行筛选:

    SELECT *
    FROM table_a a
    INNER JOIN table_b b
    ON a.username = b.username
    WHERE a.day >= '2017-09-01'

    正确的表达方式是在合并表之前使用CTEs进行筛选,如下:

    with a as (
         SELECT *
         FROM table_a
         WHERE day >= '2017-09-01'),
    
    b as (
         SELECT *
         FROM table_b
         WHERE day >= '2017-09-01')
    
    SELECT *
    FROM a
    INNER JOIN b
    ON a.username=b.username;

    CTEs会预存子查询的结果,所以运行速度通常比子查询要快。尤其是当某个子查询的表被重复使用的时候,效率会显著提升。

  • 相关阅读:
    python-opencv-绘图函数
    sublime下package control安装无效解决
    关于vue.js中slot的理解
    关于vue.js父子组件数据传递
    oAuth2.0及jwt介绍
    nodejs文件上传组件multer使用
    nodejs设置服务端允许跨域
    添加swagger api文档到node服务
    关于for循环里面异步操作的问题
    nodejs记录2——一行代码实现文件下载
  • 原文地址:https://www.cnblogs.com/HuZihu/p/12598375.html
Copyright © 2011-2022 走看看