MySQL8.0新特性中什么是CTE语法支持
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇文章将为大家详细讲解有关MySQL8.0新特性中什么是CTE语法支持,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。CTE(common table
千家信息网最后更新 2025年11月08日MySQL8.0新特性中什么是CTE语法支持
这篇文章将为大家详细讲解有关MySQL8.0新特性中什么是CTE语法支持,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
CTE(common table expression),针对同一个FROM子查询在SQL中出现多次的情况,在创建计划的时候,只对其中一个子查询创建计划,并将结果放到临时表中,其它的子查询直接使用临时表。比如Oracle中经常使用的with as /*+materialize*/ 用法。
首先,我们看一下简单非递归的CTE的工作过程
CREATE TABLE t(a int);INSERT INTO t VALUES(1),(2);mysql>WITH abc as(SELECT * FROM t)SELECT * FROM abc;+-------------+| a |+-------------+| 1 || 2 |+-------------+返回行数:[2],耗时:9 ms.--为了清楚的看到OPTIMIZER的优化过程,我们先暂且关闭derived_merge特性。mysql>SET OPTIMIZER_SWITCH='derived_merge=off';执行成功,耗时:9 ms.mysql>explain WITH abc as (SELECT * FROM t) SELECT * FROM abc;+----+-------------+------------+------------+------+---------------+-----+---------+-----+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+------------+------------+------+---------------+-----+---------+-----+------+----------+-------+| 1 | PRIMARY || | ALL | | | | | 2 | 100 | || 2 | DERIVED | t | | ALL | | | | | 2 | 100 | |+----+-------------+------------+------------+------+---------------+-----+---------+-----+------+----------+-------+返回行数:[2],耗时:9 ms.
mysql>SET OPTIMIZER_SWITCH='derived_merge=on';执行成功,耗时:9 ms.mysql>explain WITH abc as (SELECT * FROM t) SELECT * FROM abc;+----+-------------+-------+------------+------+---------------+-----+---------+-----+------+------------+-------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+------+---------------+-----+---------+-----+------+------------+-------+| 1 | SIMPLE | t | | ALL | | | | | 2 | 100 | |+----+-------------+-------+------------+------+---------------+-----+---------+-----+------+------------+-------+返回行数:[1],耗时:9 ms.
啊
mysql>EXPLAIN format = json WITH cte(x) as (SELECT * FROM t) SELECT * FROM (SELECT * FROM cte) AS t1, (SELECT * FROM cte) AS t2;-----------------------------------------| { "query_block": { "select_id": 1, "cost_info": { "query_cost": "5.65" }, "nested_loop": [ { "table": { "table_name": "t1", "access_type": "ALL", "rows_examined_per_scan": 2, "rows_produced_per_join": 2, "filtered": "100.00", "cost_info": { "read_cost": "2.52", "eval_cost": "0.20", "prefix_cost": "2.73", "data_read_per_join": "32" }, "used_columns": [ "x" ], "materialized_from_subquery": { "using_temporary_table": true, "dependent": false, "cacheable": true, "query_block": { "select_id": 2, "cost_info": { "query_cost": "2.72" }, "table": { "table_name": "cte", "access_type": "ALL", "rows_examined_per_scan": 2, "rows_produced_per_join": 2, "filtered": "100.00", "cost_info": { "read_cost": "2.52", "eval_cost": "0.20", "prefix_cost": "2.73", "data_read_per_join": "32" }, "used_columns": [ "x" ], "materialized_from_subquery": { "using_temporary_table": true, "dependent": false, "cacheable": true, "query_block": { "select_id": 3, "cost_info": { "query_cost": "0.45" }, "table": { "table_name": "t", "access_type": "ALL", "rows_examined_per_scan": 2, "rows_produced_per_join": 2, "filtered": "100.00", "cost_info": { "read_cost": "0.25", "eval_cost": "0.20", "prefix_cost": "0.45", "data_read_per_join": "32" }, "used_columns": [ "a" ] } } } } } } } }, { "table": { "table_name": "t2", "access_type": "ALL", "rows_examined_per_scan": 2, "rows_produced_per_join": 4, "filtered": "100.00", "using_join_buffer": "Block Nested Loop", "cost_info": { "read_cost": "2.53", "eval_cost": "0.40", "prefix_cost": "5.65", "data_read_per_join": "64" }, "used_columns": [ "x" ], "materialized_from_subquery": { "using_temporary_table": true, "dependent": false, "cacheable": true, "query_block": { "select_id": 4, "cost_info": { "query_cost": "2.72" }, "table": { "table_name": "cte", "access_type": "ALL", "rows_examined_per_scan": 2, "rows_produced_per_join": 2, "filtered": "100.00", "cost_info": { "read_cost": "2.52", "eval_cost": "0.20", "prefix_cost": "2.73", "data_read_per_join": "32" }, "used_columns": [ "x" ], "materialized_from_subquery": { "sharing_temporary_table_with": { "select_id": 3 } } } } } } } ] }} |关于MySQL8.0新特性中什么是CTE语法支持就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
特性
查询
语法
支持
成功
内容
文章
更多
知识
篇文章
过程
不错
清楚
个子
情况
时候
结果
质量
并将
递归
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发 cmm
软件开发拓展业务
数据库表怎么自己增长
网络安全测试关注点
数据库子集
网络资料会被服务器储存嘛
计算机网络技术求职计划书
互苗网络安全课视频
湖南长峰汇聚网络技术中标
如何提高服务器的安全防护
综合网络技术推广信息推荐
电信的网络技术是哪来的
美国软件开发工作签证
软件开发周期管理过程
乐词数据库加载失败
金牛区悦双网络技术有限公司
数据库相关的法律法规
软件开发和软件维护相互关系
鸿蒙OS软件开发完整项目
江西有什么软件开发专业大专学校
网络安全拼音
为什么说网络安全
中间件一般占服务器多大内存
数据库新建表sql案例
大专读软件开发好吗
软件开发成员角色
天龙集团有无网络安全
数据库怎么查同学过生日
开通企业号服务器维护中啥意思
广州爆款软件开发中心