目录
什么是 CTE?
示例:使用 CTE 查找每个用户的最新订单
CTE 和子查询的区别
使用 CTE 的几个小技巧
首页 数据库 mysql教程 mysql公共表表达式(CTE)示例

mysql公共表表达式(CTE)示例

Jul 14, 2025 am 02:28 AM
mysql CTE

CTE 是 MySQL 中用于简化复杂查询的临时结果集。它在当前查询中可多次引用,提升代码可读性和维护性。例如,在 orders 表中查找每个用户的最新订单时,可通过 CTE 先获取每个用户的最新订单日期,再与原表关联获取完整记录。相比子查询,CTE 结构更清晰,逻辑更易调试。使用技巧包括明确别名、串联多个 CTE 以及利用递归 CTE 处理树形数据。掌握 CTE 能使 SQL 更优雅高效。

mysql common table expression (cte) example

CTE(Common Table Expression)是 MySQL 中一种非常实用的查询结构,尤其在处理复杂查询时能让逻辑更清晰、代码更易读。下面通过一个简单但典型的例子来说明 CTE 的用法。

mysql common table expression (cte) example

什么是 CTE?

CTE 是一种临时结果集,可以在一个查询中多次引用,它的生命周期只存在于当前查询中。和子查询相比,CTE 更加清晰,也更容易调试。

比如你有一张订单表 orders,里面记录了每个用户的下单金额和时间,你想找出每个用户最近的一笔订单信息,这时候就可以用 CTE 来写。

mysql common table expression (cte) example

示例:使用 CTE 查找每个用户的最新订单

假设我们有一个 orders 表,字段如下:

  • order_id
  • user_id
  • amount
  • order_date

现在要查出每个用户最新的订单记录。

mysql common table expression (cte) example
WITH latest_orders AS (
    SELECT 
        user_id, 
        MAX(order_date) AS latest_date
    FROM orders
    GROUP BY user_id
)
SELECT o.*
FROM orders o
JOIN latest_orders lo 
    ON o.user_id = lo.user_id AND o.order_date = lo.latest_date;

这段 SQL 做了两件事:

  1. 先用 CTE 找出每个用户的最新订单日期。
  2. 然后把原表和这个 CTE 进行关联,找到完整的订单信息。

这样写的好处是逻辑清晰,而且如果后面还需要复用 latest_orders,直接再 JOIN 就行。


CTE 和子查询的区别

虽然上面的需求也可以用子查询完成,但 CTE 更具可读性。比如上面的例子如果换成嵌套子查询,可能看起来会有点绕:

SELECT o.*
FROM orders o
WHERE (o.user_id, o.order_date) IN (
    SELECT user_id, MAX(order_date)
    FROM orders
    GROUP BY user_id
);

这种写法也能实现相同效果,但当逻辑更复杂的时候,CTE 的结构优势就体现出来了。


使用 CTE 的几个小技巧

  • 别名必须明确:CTE 后面跟的结果列可以不指定别名,但建议写清楚,特别是做复杂计算时。
  • 多个 CTE 可以串联:你可以写多个 CTE,中间用逗号分隔。
  • 递归 CTE 也很有用:比如查找树形结构数据(如组织架构、评论嵌套等),可以用 WITH RECURSIVE

举个多个 CTE 的例子:

WITH cte1 AS (...),
     cte2 AS (...)
SELECT ...
FROM cte1
JOIN cte2 ON ...;

基本上就这些。CTE 不难,但在实际开发中特别有用,特别是在写报表类 SQL 或者需要多层聚合的场景里。掌握好它,会让你的 SQL 更优雅也更容易维护。

以上是mysql公共表表达式(CTE)示例的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

PHP教程
1537
276
管理大型MySQL表的最佳实践 管理大型MySQL表的最佳实践 Aug 05, 2025 am 03:55 AM

处理大表时,MySQL性能和可维护性面临挑战,需从结构设计、索引优化、分表策略等方面入手。1.合理设计主键和索引:推荐使用自增整数作为主键以减少页分裂;使用覆盖索引提升查询效率;定期分析慢查询日志并删除无效索引。2.分区表的合理使用:按时间范围等策略分区,提升查询和维护效率,但需注意分区裁剪问题。3.考虑读写分离和分库分表:读写分离缓解主库压力,分库分表适用于数据量极大场景,建议使用中间件并评估事务和跨库查询问题。前期规划和持续优化是关键。

如何使用检查约束来在MySQL中执行数据规则? 如何使用检查约束来在MySQL中执行数据规则? Aug 06, 2025 pm 04:49 PM

MySQL支持CHECK约束以强制域完整性,自8.0.16版本起生效;1.创建表时添加约束:使用CREATETABLE定义CHECK条件,如年龄≥18、薪资>0、部门限定值;2.修改表添加约束:用ALTERTABLEADDCONSTRAINT限制字段值,如姓名非空;3.使用复杂条件:支持多列逻辑和表达式,如结束日期≥开始日期且完成状态需有结束日期;4.删除约束:通过ALTERTABLEDROPCONSTRAINT指定名称删除;5.注意事项:需MySQL8.0.16 、InnoDB或MyISAM引

如何在MySQL数据库中实现标记系统? 如何在MySQL数据库中实现标记系统? Aug 05, 2025 am 05:41 AM

Useamany-to-manyrelationshipwithajunctiontabletolinkitemsandtagsviathreetables:items,tags,anditem_tags.2.Whenaddingtags,checkforexistingtagsinthetagstable,insertifnecessary,thencreatemappingsinitem_tagsusingtransactionsforconsistency.3.Queryitemsbyta

实施MySQL数据谱系跟踪 实施MySQL数据谱系跟踪 Aug 02, 2025 pm 12:37 PM

实现MySQL数据血缘追踪的核心方法包括:1.利用Binlog记录数据变更来源,开启并解析binlog,结合应用层上下文追溯具体业务动作;2.在ETL流程中注入血缘标签,通过工具同步时记录源与目标的映射关系;3.给数据加注释和元数据标签,在建表时说明字段来源,并接入元数据管理系统形成可视化图谱;4.注意主键一致性、避免过度依赖SQL解析、版本控制数据模型变化及定期校验血缘数据,确保血缘追踪准确可靠。

如何故障排除常见的mySQL连接错误? 如何故障排除常见的mySQL连接错误? Aug 08, 2025 am 06:44 AM

检查MySQL服务是否运行,使用sudosystemctlstatusmysql确认并启动;2.确保bind-address设置为0.0.0.0以允许远程连接,并重启服务;3.验证3306端口是否开放,通过netstat检查并配置防火墙规则允许该端口;4.对于“Accessdenied”错误,需核对用户名、密码和主机名,登录MySQL后查询mysql.user表确认权限,必要时创建或更新用户并授权,如使用'your_user'@'%';5.若因caching_sha2_password导致认证失

如何在MySQL中显示所有数据库 如何在MySQL中显示所有数据库 Aug 08, 2025 am 09:50 AM

要显示MySQL中的所有数据库,需使用SHOWDATABASES命令;1.登录MySQL服务器后执行SHOWDATABASES;命令即可列出当前用户有权访问的所有数据库;2.系统数据库如information_schema、mysql、performance_schema和sys默认存在,但权限不足的用户可能无法看到;3.也可通过SELECTSCHEMA_NAMEFROMinformation_schema.SCHEMATA;查询并筛选数据库,例如排除系统数据库以仅显示用户创建的数据库;确保使用

MySQL中的截断,删除和掉落有什么区别? MySQL中的截断,删除和掉落有什么区别? Aug 05, 2025 am 09:39 AM

DELETEremovesspecificorallrows,keepstablestructure,allowsrollbackandtriggers,anddoesnotresetauto-increment;2.TRUNCATEquicklyremovesallrows,resetsauto-increment,cannotberolledbackinmostcases,doesnotfiretriggers,andkeepstablestructure;3.DROPremovesthee

如何将MySQL Server升级到较新的版本? 如何将MySQL Server升级到较新的版本? Aug 03, 2025 am 09:04 AM

CheckcompatibilitywithOS,applications,andfeatures;2.Backupalldata,configs,andlogs;3.Chooseupgrademethod(packagemanager,MySQLInstaller,ormanual);4.Runpost-upgradechecksandtests;5.Resolveissueslikeauthenticationpluginsordeprecatedoptions.Alwaysbackup,t

See all articles