0

0

MySQL 8.0新特性全面解读:窗口函数、CTE、原子DDL等

夢幻星辰

夢幻星辰

发布时间:2025-09-11 11:34:01

|

1040人浏览过

|

来源于php中文网

原创

MySQL 8.0引入窗口函数、CTE和原子DDL,提升查询能力、代码可读性与数据一致性;窗口函数支持分区计算,CTE简化复杂查询,原子DDL确保操作的原子性,增强系统可靠性与开发效率。

mysql 8.0新特性全面解读:窗口函数、cte、原子ddl等

MySQL 8.0带来了许多令人兴奋的新特性,显著提升了数据库的性能、安全性和易用性。其中,窗口函数、公共表表达式(CTE)和原子DDL是尤为重要的几个方面,它们改变了我们编写和管理SQL的方式。

窗口函数、CTE、原子DDL的详细解读和应用场景。

窗口函数是什么?它能解决什么问题?

窗口函数允许我们在一个结果集的分区(窗口)上执行计算,而无需像GROUP BY那样折叠行。 想象一下,你想知道每个员工的工资与部门平均工资的比较,或者想计算每个产品的销售额占总销售额的百分比。 使用传统的SQL,这些操作通常需要复杂的子查询或自连接才能实现。 窗口函数则可以轻松解决这些问题。

例如,假设我们有一个

employees
表,包含
id
,
name
,
department
,
salary
字段。我们可以使用窗口函数计算每个部门的平均工资,并将其与每个员工的工资进行比较:

SELECT
    id,
    name,
    department,
    salary,
    AVG(salary) OVER (PARTITION BY department) AS avg_department_salary
FROM
    employees;

AVG(salary) OVER (PARTITION BY department)
这部分就是窗口函数。
PARTITION BY department
定义了窗口,即每个部门。
AVG(salary)
在每个窗口内计算平均工资。 结果集将包含每个员工的工资以及其所在部门的平均工资,而不会像
GROUP BY
那样减少行数。

窗口函数还支持各种其他函数,如

RANK()
,
DENSE_RANK()
,
ROW_NUMBER()
,
LAG()
,
LEAD()
等,可以用于排名、分页、计算差值等。 它们极大地简化了复杂的SQL查询,提高了代码的可读性和可维护性。

CTE(公共表表达式)的实际应用场景有哪些?

CTE 允许我们定义一个临时的、命名的结果集,可以在一个查询中多次引用。 它可以看作是一个命名的子查询,但比子查询更易于阅读和维护。 CTE使用

WITH
关键字定义。

一个常见的应用场景是处理递归数据。 例如,假设我们有一个

employee_hierarchy
表,表示员工的上下级关系:

CREATE TABLE employee_hierarchy (
    employee_id INT,
    manager_id INT,
    employee_name VARCHAR(255)
);

INSERT INTO employee_hierarchy (employee_id, manager_id, employee_name) VALUES
(1, NULL, 'John CEO'),
(2, 1, 'Alice Manager'),
(3, 1, 'Bob Manager'),
(4, 2, 'Charlie Developer'),
(5, 2, 'David Developer'),
(6, 3, 'Eve Analyst');

我们可以使用 CTE 递归地查询某个员工的所有下属:

WITH RECURSIVE subordinate_tree AS (
    SELECT employee_id, manager_id, employee_name
    FROM employee_hierarchy
    WHERE employee_id = 1  -- 找到CEO

    UNION ALL

    SELECT e.employee_id, e.manager_id, e.employee_name
    FROM employee_hierarchy e
    INNER JOIN subordinate_tree st ON e.manager_id = st.employee_id
)
SELECT * FROM subordinate_tree;

这个 CTE 首先选择 CEO 作为根节点,然后递归地连接

employee_hierarchy
表,找到所有直接或间接下属。 CTE 还可以用于简化复杂的查询,提高可读性。 比如,可以将一个复杂的子查询定义为一个 CTE,然后在主查询中引用它。

原子DDL是什么?它的优势是什么?

在 MySQL 5.7 及更早版本中,DDL 操作(如创建表、修改表结构等)不是原子性的。 这意味着如果在 DDL 操作过程中发生错误,可能会导致数据库处于不一致的状态。 例如,如果在添加一个新列的过程中,数据库服务器崩溃了,可能只有一部分数据被更新,导致数据损坏。

MySQL 8.0 引入了原子 DDL,通过将 DDL 操作封装在一个事务中,确保 DDL 操作要么完全成功,要么完全失败。 如果在 DDL 操作过程中发生错误,数据库会自动回滚到之前的状态,保证数据的一致性。

蛙蛙写作——超级AI智能写作助手
蛙蛙写作——超级AI智能写作助手

蛙蛙写作辅助AI写文,帮助获取创意灵感,提供拆书、小说转剧本、视频生成等功能,是一款功能全面的AI智能写作工具。

下载

原子 DDL 极大地提高了数据库的可靠性。 即使在 DDL 操作过程中发生意外情况,也不会导致数据损坏。 此外,原子 DDL 还简化了数据库的管理,因为不再需要手动处理 DDL 操作失败的情况。

例如,创建一个带有原子 DDL 的表:

CREATE TABLE my_table (
    id INT PRIMARY KEY,
    name VARCHAR(255)
) ENGINE=InnoDB;

如果在创建表的过程中发生错误(例如磁盘空间不足),MySQL 会自动回滚操作,保证数据库的完整性。

窗口函数有哪些常见的类型和用法?

窗口函数根据功能可以分为多种类型,常见的包括:

  • 聚合窗口函数:
    AVG()
    ,
    SUM()
    ,
    MIN()
    ,
    MAX()
    ,
    COUNT()
    。 它们在窗口内计算聚合值,但不会像
    GROUP BY
    那样减少行数。
  • 排名窗口函数:
    RANK()
    ,
    DENSE_RANK()
    ,
    ROW_NUMBER()
    。 它们用于在窗口内对行进行排名。
    RANK()
    会跳过排名,而
    DENSE_RANK()
    不会。
    ROW_NUMBER()
    为每一行分配一个唯一的序号。
  • 值窗口函数:
    LAG()
    ,
    LEAD()
    ,
    FIRST_VALUE()
    ,
    LAST_VALUE()
    ,
    NTH_VALUE()
    。 它们用于访问窗口内其他行的数据。
    LAG()
    LEAD()
    可以访问前一行和后一行的数据,
    FIRST_VALUE()
    LAST_VALUE()
    可以访问第一行和最后一行的数据,
    NTH_VALUE()
    可以访问指定行的数据。

这些窗口函数可以结合

PARTITION BY
子句和
ORDER BY
子句,实现各种复杂的查询需求。 例如,可以使用
LAG()
函数计算每个月的销售额与上个月的销售额的差值:

SELECT
    month,
    sales,
    sales - LAG(sales, 1, 0) OVER (ORDER BY month) AS sales_difference
FROM
    monthly_sales;

LAG(sales, 1, 0) OVER (ORDER BY month)
表示访问前一行的
sales
值。
1
表示偏移量,即前一行。
0
表示默认值,如果前一行不存在,则返回 0。

如何在实际项目中选择使用窗口函数还是 CTE?

选择使用窗口函数还是 CTE 取决于具体的查询需求。

  • 如果需要在结果集的分区上执行计算,并且不需要减少行数,则应该使用窗口函数。 窗口函数可以简化复杂的聚合查询,提高代码的可读性和可维护性。
  • 如果需要定义一个临时的、命名的结果集,并在一个查询中多次引用,则应该使用 CTE。 CTE 可以简化复杂的查询,提高可读性。 尤其是在处理递归数据时,CTE 是一个非常强大的工具

在某些情况下,可以同时使用窗口函数和 CTE。 例如,可以使用 CTE 定义一个中间结果集,然后在窗口函数中使用它。

原子DDL对数据库运维和开发有哪些影响?

原子 DDL 极大地简化了数据库运维和开发。

  • 运维方面: 原子 DDL 提高了数据库的可靠性,减少了数据损坏的风险。 运维人员不再需要手动处理 DDL 操作失败的情况,降低了运维成本。
  • 开发方面: 原子 DDL 使得开发人员可以更放心地执行 DDL 操作,而不用担心数据一致性问题。 这提高了开发效率,降低了开发风险。

总的来说,MySQL 8.0 的原子 DDL 是一项非常重要的改进,它提高了数据库的可靠性、简化了数据库的管理,并提高了开发效率。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

682

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

347

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

676

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

575

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

417

2024.04.29

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

3

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 4.7万人学习

Node.js 教程
Node.js 教程

共57课时 | 8.9万人学习

CSS3 教程
CSS3 教程

共18课时 | 4.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号