美文网首页
SQL:with 查询

SQL:with 查询

作者: 蓝笔头 | 来源:发表于2021-06-18 18:36 被阅读0次

术语表

  • CTEcommon table expression,公共表表达式。

简介

WITH 提供了一种方式来书写在一个大型查询中使用的辅助语句。
这些语句通常被称为公共表表达式 或 CTE,它们可以被看成是仅在单个 SQL语句( SELECTINSERTUPDATEDELETE)的执行范围内存在中存在的临时表。

WITH 子句中的每一个辅助语句可以是一个 SELECTINSERTUPDATEDELETE,并且 WITH 子句本身也可以被附加到一个主语句,主语句也可以是 SELECTINSERTUPDATEDELETE

语法

WITH cte_name AS (
    query
)
SELECT * FROM cte_name;

案例

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

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

SELECT *
FROM table_a a
JOIN table_b b
ON a.username = b.username
WHERE a.day >= '2017-09-01' and b.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
JOIN b
ON a.username=b.username;

比如 table_atable_b 各有 1000 条数据,day >= '2017-09-01' 的数据为 10 条。

  • 【先连表再过滤】要处理 1000 * 1000 = 100w 条数据
  • 【先过滤再连表】只要处理 10 * 10 = 100 条数据,包含两次过滤的数据量 200,一共 300 条数据。

正常人都知道,100 条数据处理比 100w 条数据处理块,所以【先过滤再连表】比【先连表再过滤】效率更高。

参考

相关文章

  • EF Core 备忘

    模糊查询sql linq 内连接查询sql linq 左连接查询sql linq 左连接查询(连接内带条件)sql...

  • ThinkPHP查询

    查询方式 表达式查询 快捷查询 区间查询 组合查询 统计查询 动态查询 SQL查询 ThikPHP支持原生SQL查...

  • 数据分析之SQL子查询

    文章阅读路线: SQL子查询概念 独立子查询实例 相关子查询实例 SQL子查询常见玩伴 1.SQL子查询概念 子查...

  • JPA 动态生成sql

    1. 构建格式化时间查询sql: 生成sql: 2. 构建多条件查询sql: 生成sql: 3. 构建子查询: 生...

  • sqlserver,oracle,mysql分页查询通用sql

    摘要: sqlserver,oracle,mysql分页查询通用sql1:mysql通用查询sql /* sql:...

  • 无限极分类-全路径方式

    创建表SQL 测试数据 组装SQL查询 查询结果

  • 定位和处理执行慢的sql

    查询正在获取锁的sql 查询正在执行的sql 停止正在执行的sql

  • SQL查询语句

    常用SQL查询语句 一、简单查询语句 1. 查看表结构 SQL>DESC emp; 2. 查询所有列 SQL>SE...

  • MySQL学习笔记- SQL 查询都是以 SELECT 开始的吗

    SQL 查询都是以 SELECT 开始的的吗?SQL 查询的执行顺序是怎样的? SQL 查询的执行顺序 SELEC...

  • 搜索

    直接sql查询 用sql语句like查询,复杂的用sql语句拼接。 视图和存储过程查询 简化程序,提高执行效率,维...

网友评论

      本文标题:SQL:with 查询

      本文链接:https://www.haomeiwen.com/subject/zjklyltx.html