MySQL8.0的WITH查询详情

yizhihongxing

当使用 MySQL 8.0 时,我们可以使用 Common Table Expressions (CTE) 或者简称为 WITH 查询来简化查询语句。本文将向您介绍MySQL 8.0的 WITH 查询详情及其用法的完整攻略。

什么是WITH查询

WITH查询在MySQL8.0中被称为公共表达式。使用WITH语句,我们可以为一次查询创建一个临时表,并在查询中使用它。这个临时表可以由其他查询使用,因此可以大大简化复杂的查询。

一个公共表达式由以下部分组成:

  • WITH 子句定义公共表达式的名称和列。
  • 声明子句定义公共子句的内容。
  • SELECT语句是执行实际查询的语句。

如何使用WITH查询

WITH查询的语法如下:

WITH cte_name [(column_name [, column_name] ...)] AS ( subquery ) SELECT statement;

其中cte_name是您给公共表达式命名的名称,column_name是您要包含在新创建的表中的列名,subquery是公共表达式的内容和SELECT语句是执行实际查询的语句。WITH查询支持递归和非递归、多个公共表达式和多个定义等特性。

非递归公共表达式

以下是一个用于举例的基本非递归公共表达式:

WITH sales AS (
    SELECT customer_id, SUM(amount) AS total_sales FROM orders 
    GROUP BY customer_id
)
SELECT customer_id, total_sales
FROM sales
WHERE total_sales > 100000;

这个查询使用了一个公共表达式,该公共表达式被命名为sales。在这个表达式中,我们从订单表中获取每个客户的总销售额。在使用了公共表达式后,我们可以很容易地使用WHERE条件语句筛选出我们需要的结果。

递归公共表达式

递归公共表达式是与自身递归关系的查询。在表的行之间建立关系时,这种公共表达式非常有用。

这是递归公共表达式的基本语法:

WITH recursive cte_name (column_name,column_name...) AS ( subquery_with_union )

其中recursive告诉MYSQL这是一个递归的公共表达式,cte_name是您给公共表达式命名的名称,subquery_with_union是公共表达式的内容和SELECT语句是执行实际查询的语句。

以下面的例子为例。它的功能是从指定的起始节点开始递归地遍历所有子节点,最终返回所有与起始节点相邻的子节点(直接相邻或间接相邻)。使用递归公共表达式可以简化查询。

WITH RECURSIVE search_graph(id, link, data, depth, path, cycle) AS (
    SELECT g.id, g.link, g.data, 1,
           CAST(CONCAT('/',g.id,'/') AS CHAR(100)), false
        FROM graph g
       WHERE g.id = start_node_id
     UNION ALL
    SELECT g.id, g.link, g.data, sg.depth + 1,
           CAST(CONCAT(sg.path,g.id,'/') AS CHAR(100)),
           g.id REGEXP sg.path as cycle
        FROM graph g, search_graph sg
       WHERE g.id = sg.link AND NOT cycle AND sg.depth < max_depth
)
SELECT * FROM search_graph;

在这个示例中,我们从graph表中选择了第1步。我们选择起始节点为start_node_id,然后创建一个公共表达式search_graph,用于追踪图表中的所有行。我们使用 UNION ALL 运算符将常规 SQL 查询与递归公共表达式组合在一起,并基于是否出现异常数据(即和起始节点直接或间接相邻的子节点是否存在环)以及遍历深度的限制来确定何时应停止递归。

公共表达式的输出也可以作为其他查询的输入。例如,下面的查询使用公共表达式来查找所有客户及其订购的产品数量。

WITH sales AS (
    SELECT customer_id, SUM(amount) AS total_sales FROM orders 
    GROUP BY customer_id
)
SELECT customers.customer_name, sales.total_sales, product_count
FROM customers 
JOIN sales ON customers.customer_id = sales.customer_id
JOIN (
    SELECT customer_id, COUNT(*) AS product_count FROM order_details 
    GROUP BY customer_id
) AS products ON customers.customer_id = products.customer_id;

在这个示例中,我们使用了两个公共表达式。一个是“sales”公共表达式,另一个是products子查询。

总结

使用WITH查询可以大大简化复杂查询。它提供了一种方便的方法,可以将一个查询分成多个查询块,提高可读性和可维护性。在MySQL 8.0中,公共表达式支持非递归和递归查询,您可以使用它来处理大量数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL8.0的WITH查询详情 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • Java使用RedisTemplate模糊删除key操作

    下面就详细讲解Java使用RedisTemplate模糊删除key操作的攻略。 什么是RedisTemplate RedisTemplate是Spring Data Redis提供的一个操作Redis的工具类,它封装了对Redis服务器的访问并提供了一些常用的操作方法,包括基本的CRUD操作和一些高级操作,比如事务和lua脚本等。 RedisTemplate…

    database 2023年5月22日
    00
  • 宝塔Linux面板之好用免费的中文Linux VPS主机控制面板适合快速建站

    宝塔Linux面板简介 宝塔Linux面板是一个免费的服务器运维面板,适合于Linux服务器,提供了简单易用的管理界面,提供可视化的操作,便于新手用户快速上手,同时也能满足高级用户的使用需求。 宝塔Linux面板安装 安装宝塔Linux面板非常简单,只需要在Linux服务器上运行以下命令即可: curl -sSO http://download.bt.cn/…

    database 2023年5月22日
    00
  • DBCA命令行搭建Oracle ADG的流程

    下面我将详细讲解“DBCA命令行搭建Oracle ADG的流程”的完整攻略,包含以下的信息: 环境准备 创建主库 创建备库 配置ADG 验证配置 环境准备 在进行ADG搭建前,我们需要先准备好以下环境: Oracle数据库软件 Listener配置文件 TNS配置文件 操作系统用户和组的创建 创建主库 运行dbca命令,进入到DBCA的交互界面。 dbca …

    database 2023年5月22日
    00
  • Spring Boot 通过AOP和自定义注解实现权限控制的方法

    为了实现权限控制,你可以使用Spring AOP和自定义注解。在这个过程中,AOP用于实施横切关注点,而自定义注解用于定义访问控制的规则。 以下是实现权限控制的完整攻略: 第一步:创建自定义注解 首先,在你的项目中定义一个自定义注解。自定义注解用于定义哪些方法需要进行安全性检查,这样你就可以在运行时进行安全性检查。 @Retention(RetentionP…

    database 2023年5月22日
    00
  • Linux Redis的性能展示

    我们可以通过redis-cli 连接上redis ,例如 : redis-cli -h 127.0.0.1 -p 6379 连接上redis,然后通过INFO查看redis的一些信息。我们可以查看一些INFO信息,如查看redis的内存使用情况:info memory ,查看redis当前客户端的连接情况: redis client 。 其中发现了一个不错的…

    Redis 2023年4月11日
    00
  • NoSQL是什么?

    NoSQL是指“非关系型数据库”(Not only SQL),是一类数据库管理系统的统称。相对于传统的关系型数据库(SQL),NoSQL数据库不依赖固定的表格模式,通常以键-值对、文档、列族或者图形结构来存储数据。 NoSQL数据库被广泛应用于Web应用程序、大数据和实时分析等领域,因为它们能够处理大量的非结构化数据,并具有可扩展性和高可用性等优点。 NoS…

    2023年3月13日
    00
  • PouchDB 和 MS SQL Server 的区别

    PouchDB和MS SQL Server是两种不同的数据库系统,它们拥有不同的数据存储和查询特性。下面对它们的区别进行详细的讲解: PouchDB PouchDB是一个本地化的JavaScript数据库,可以在浏览器、Node.js和Electron等平台上使用。它基于Apache CouchDB,提供了类似CouchDB的API和功能,但是可以在客户端使…

    database 2023年3月27日
    00
  • Mysql 切换数据存储目录的实现方法

    Mysql 切换数据存储目录的实现方法需要以下步骤: 步骤一:关闭Mysql服务 在进行目录切换前,首先需要关闭Mysql服务,可以使用以下命令: $ service mysql stop 步骤二:复制数据存储目录 将原数据存储目录复制到新的目录下,可以使用以下命令: $ cp -r /var/lib/mysql /new_data_dir/ 其中,/var…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部