MySQL8.0的WITH查询详情

当使用 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日

相关文章

  • Go语言配置数据库连接池的实现

    下面我将为你讲解如何使用Go语言实现配置数据库连接池的完整攻略。 1. 什么是数据库连接池? 通常情况下,每次操作数据库时,都需要建立一次数据库连接。如果是频繁的建立销毁连接会占用大量的系统资源并且影响性能。此时,使用数据库连接池就能够有效提高数据库连接的复用率,避免重复建立和销毁连接,从而提升系统性能。 2. Go语言如何实现连接池? Go语言提供了dat…

    database 2023年5月22日
    00
  • Ubuntu安装MySQL5.7并配置数据存储路径的方法步骤

    下面是详细的Ubuntu安装MySQL5.7并配置数据存储路径的方法步骤攻略。 下载并安装MySQL5.7 步骤1:在Ubuntu终端中更新APT软件包 在终端中输入以下命令更新APT软件包: sudo apt-get update 步骤2:下载并安装MySQL5.7 在终端中输入以下命令下载并安装MySQL5.7: sudo apt-get install…

    database 2023年5月22日
    00
  • DBMS 分层模型

    DBMS分层模型是一种将数据库管理系统分层的方法,可以使DBMS的设计更加清晰和快速的开发。下面我将从三个层次来详细讲解DBMS分层模型,同时给出相应的实例说明。 1. 外模式层 外模式层也叫用户视图层,是用户与DBMS交互的接口层,提供给用户一种方便使用的方式,使用户能够通过一些简单的操作完成各种数据库相关的应用任务。外模式是对整个数据库的一个子集,对于每…

    database 2023年3月27日
    00
  • 2019年Web开发与全站工程师技术指南和趋势

    2019年Web开发与全站工程师技术指南和趋势 Web开发和全站工程师是当前IT行业中非常热门的职位之一,而随着技术的不断发展,这个领域也急速发展,需要不断学习新技术和新趋势。下面我们来讲解一下2019年Web开发与全站工程师技术指南和趋势,帮助读者把握发展机遇。 前端技术指南和趋势 前端技术一直是Web开发中的重要组成部分,越来越多的新技术和新趋势正在涌现…

    database 2023年5月21日
    00
  • postgresql修改完端口后直接psql连接数据库报错的解决

    针对“postgresql修改完端口后直接psql连接数据库报错”的解决方案,以下是完整攻略: 1. 查看端口 首先,建议使用如下命令查看 postgresql 当前正在使用的端口: $ sudo netstat -tanpl | grep postgres 上述命令可以列出系统中正在占用端口的进程,若 PostgreSQL 正在运行,应该能看到相应端口(默…

    database 2023年5月19日
    00
  • LINUX下Oracle数据导入导出的方法详解

    LINUX下Oracle数据导入导出的方法详解 本文将介绍在LINUX系统下如何进行Oracle数据库的数据导入和导出,以及一些常用的导入导出命令。 数据库导出 在LINUX系统下,在使用Oracle数据库进行数据导出时,可以使用expdp命令进行导出。该命令的语法如下: expdp system/password@ORACLE_SID SCHEMAS=SC…

    database 2023年5月22日
    00
  • 记录一次清理Redis 病毒程序 kdevtmpfsi

    首先贴上情况    一个redis 程序占用cpu 46%,虽然redis-server 有定时清理过期的键,但也不会占用这么高的CPU吧,一般都是0.3%   看看这个进程什么鬼 systemctl status 14561 然后找到了它的父亲进程 在 /var/tmp/kinsing     删除掉 它  /tmp/kdevtmpfsi  和 /var/…

    Redis 2023年4月12日
    00
  • 详解MySQL运算符的优先级

    MySQL 运算符优先级是指在表达式中,哪些运算符先执行,哪些运算符后执行的问题。在 MySQL 中,像加减乘除等算术运算符、比较运算符、逻辑运算符等都有自己的优先级,且按照一定的规则进行执行。 本文将为大家介绍MySQL中的运算符优先级,并提供相应的代码示例。 MySQL 运算符优先级的分类 MySQL 运算符的优先级按照由高到低的顺序为以下几类: 圆括号…

    MySQL 2023年3月9日
    00
合作推广
合作推广
分享本页
返回顶部