MySQL8的新特性CTE
【瞎BB】
十一长假的最后一天,想到明天要就回去上班了;内心的激动无法用平常的言语来表达,可能是国人的感情向来比较内敛(这个锅不能我一个人背)
也可能是我们比较重行动(Just Do IT)。但... 我还是有写一些什么东西的必要得,那我今天就写两点吧!
1): 趁着十一长假还没有过去,我在这里给大家拜个早年
2): 讲讲MySQL-8.0.x的新特性(公共表表达式)CTE
【CTE有什么牛逼的地方】
1、从SQL的写法上看逻辑更加清晰
2、直接递归
【CTE的语法格式】
CTE的主要思想就先生成临时结果集,以方便后面的使用;与临时表不同的是这个结果集的作用域不是当前session而是当前语句,对!不是
session级是语句级别的
with_clause:
WITH [RECURSIVE]
cte_name [(col_name [, col_name] ...)] AS (subquery)
[, cte_name [(col_name [, col_name] ...)] AS (subquery)] ...
【例子一:朴素使用场景】
假设我们有一个Person表用来保存一些自然人的信息
create table person(id int not null auto_increment primary key,name varchar(16));
insert into person(name) values('Tom'),('Jry'),('Bob'),('Foo'),('Bar');
select * from person;
+----+------+
| id | name |
+----+------+
| 1 | Tom |
| 2 | Jry |
| 3 | Bob |
| 4 | Foo |
| 5 | Bar |
+----+------+
5 rows in set (0.00 sec)
如果我们要查询id可以被2整除的那些行,通常我们可以这样写SQL
select name from person where id % 2 = 0;
+------+
| name |
+------+
| Jry |
| Foo |
+------+
2 rows in set (0.00 sec)
如果出于某种不可描述的压力,一定要让你用CTE表达式来写的话,你也可以样混过去
with ct(name) as (select name from person where id % 2 = 0) select name from ct;
+------+
| name |
+------+
| Jry |
| Foo |
+------+
2 rows in set (0.00 sec)
事实上CTE不只是可以用于select语句中,update,delete,insert也都是支持的,你只要知道CTE代表的是一个结果集就好了,通常就
不会用错。
还是出现某种不可描述的压力,要把所有id可以被2整除的公民的name改成"Hello SQL",CTE要硬上了哈!
with ct(id) as (select name from person where id % 2 = 0) update person,ct set person.name="Hello SQL" where person.id = ct.id;
Query OK, 2 rows affected (0.08 sec)
Rows matched: 2 Changed: 2 Warnings: 0 select * from person;
+----+-----------+
| id | name |
+----+-----------+
| 1 | Tom |
| 2 | Hello SQL |
| 3 | Bob |
| 4 | Hello SQL |
| 5 | Bar |
+----+-----------+
5 rows in set (0.00 sec)
【例子二:递归场景】
还是直接上比较学院派的例子吧、反正牛逼的我也想不出来!直接生成一个斐波那契数列吧!
mysql> with recursive fib as (
-> select 0 as x, 1 as y
-> union all
-> select
-> fib.y as x,
-> fib.x+fib.y as y
-> from fib where fib.x < 20)
-> select y as n from fib;
+------+
| n |
+------+
| 1 |
| 1 |
| 2 |
| 3 |
| 5 |
| 8 |
| 13 |
| 21 |
| 34 |
+------+
9 rows in set (0.00 sec)
【参考文档】
WITH Syntax (Common Table Expressions)
【学习交流】
-----------------------------http://www.sqlpy.com-------------------------------------------------


-----------------------------http://www.sqlpy.com-------------------------------------------------
----
MySQL8的新特性CTE的更多相关文章
- 跨时代的MySQL8.0新特性解读
目录 MySQL发展历程 MySQL8.0新特性 秒级加列 性能提升 文档数据库 SQL增强 共用表表达式(CTEs) 不可见索引(Invisible Indexes) 降序索引(Descending ...
- MySQL8.0新特性实验1
Server层,选项持久化 mysql> show variables like '%max_connections%';+------------------------+-------+| ...
- mysql8.0 新特性,对json类型的常用操作
mysql8 新特性-json数据类型操作 -- 根据key(可多个)获取value SELECT JSON_EXTRACT('{"id": 14, "name" ...
- Mysql8.0新特性【详细版本】
1. 账户与安全 用户创建与授权 之前:创建用户并授权 1 grant all privileges on *.* to 'myuser'@'%' identified by '3edc#EDC'; ...
- 深入解读MySQL8.0 新特性 :Crash Safe DDL
前言 在MySQL8.0之前的版本中,由于架构的原因,mysql在server层使用统一的frm文件来存储表元数据信息,这个信息能够被不同的存储引擎识别.而实际上innodb本身也存储有元数据信息.这 ...
- MySQL-08 MySQL8.0新特性
性能 MySQL 8.0 在一定的用户访问条件下,速度要比 MySQL 5.7 快 2 倍.MySQL 8.0 在以下方面带来了更好的性能:读/写工作负载.IO 密集型工作负载.以及高竞争(" ...
- MySQL8.0新特性总览
1.消除了buffer pool mutex (Percona的贡献) 2.数据字典全部采用InnoDB引擎存储,支持DDL原子性.crash safe.metadata管理更完善(可以利用ibd2s ...
- MySQL8的新特性ROLE
[MySQL的ROLE解决了什么问题] 假设你是一个职业素养良好的DBA比较同时又比较注重权限管理的话:可能遇到过这样的问题,数据库中有多个开发人员的账号:有一天要建 一个新的schema,如果你希望 ...
- MySQL8.0 新特性 Hash Join
概述&背景 MySQL一直被人诟病没有实现HashJoin,最新发布的8.0.18已经带上了这个功能,令人欣喜.有时候在想,MySQL为什么一直不支持HashJoin呢?我想可能是因为MySQ ...
随机推荐
- 算法笔记_219:泊松分酒(Java)
目录 1 问题描述 2 解决方案 1 问题描述 泊松是法国数学家.物理学家和力学家.他一生致力科学事业,成果颇多.有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布. 有一次闲暇时,他 ...
- JavaScript公共函数
[在此处输入文章标题] // JScript 文件 /* ================================================================== JS 公 ...
- 代码实现分析mpeg-2文件
1.概述 把上一篇文章中讲到的mpeg-2文件结构分析用代码实现,结合mpeg-2文件分析.才easy看懂. 2.代码 /* *本程序主要分析MPEG-2文件 *作者:缪国凯(MK) *8214860 ...
- 软考历程(5)——extend 与 include
软考中涉及扩展与包括关系的辨认,先不说考试的事,扩展与包括关系是UML中非经常见.非常基础的一种关系,然而我发现非常多同学都特别easy混淆,甚至软考真题中都存在题目和答案有待商榷的地方.此篇博客实属 ...
- 亲历H5移动端游戏微信支付接入及那些坑(二)——获取Openid和授权
第一篇中将一些坑说明,那么这篇开始正式进入接入步骤.具体的参数说明,我不会列出,毕竟微信官方文档都有,我想大家都看的懂,而且这接口也有可能微信会变动,所以不列出来,也是不想引起大家的误解,接入步骤只起 ...
- ubuntu普通账户获取root权限的方法以及su和su -的区别
打开命令窗口 输入命令:sudo passwd root 然后按照上图中的操作进行即可. su和su -的命令的不同: su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shel ...
- mysql统计函数
数据记录统计函数: AVG(字段名) 得出一个表格栏平均值 COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计 MAX(字段名) 取得一个表格栏最大的值 MIN(字段名) 取得一个 ...
- DOM4J对于XML的用法
一.基本使用方式 语法 1.获取根元素 Element root = document.getRootElement(); 2.获取某个元素下的子元素 Element db_e ...
- Spring Cloud Eureka集群 动态扩展新节点
场景描述: Eureka的集群节点有两个,互相注册形成集群,已经支持动态刷新(不知道怎么让Eureka支持动态刷新的可以参考http://www.cnblogs.com/flying607/p/845 ...
- Vivaldi浏览器媲美Chrome
Vivaldi跨平台的浏览器,很好的兼容性...基本上跟Chrome一个层次的... 好的东西,用一次就明白!好酒,酒香巷子深... Download: https://vivaldi.com/dow ...