瞎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的更多相关文章

  1. 跨时代的MySQL8.0新特性解读

    目录 MySQL发展历程 MySQL8.0新特性 秒级加列 性能提升 文档数据库 SQL增强 共用表表达式(CTEs) 不可见索引(Invisible Indexes) 降序索引(Descending ...

  2. MySQL8.0新特性实验1

    Server层,选项持久化 mysql> show variables like '%max_connections%';+------------------------+-------+| ...

  3. mysql8.0 新特性,对json类型的常用操作

    mysql8 新特性-json数据类型操作 -- 根据key(可多个)获取value SELECT JSON_EXTRACT('{"id": 14, "name" ...

  4. Mysql8.0新特性【详细版本】

    1.  账户与安全 用户创建与授权 之前:创建用户并授权 1 grant all privileges on *.* to 'myuser'@'%' identified by '3edc#EDC'; ...

  5. 深入解读MySQL8.0 新特性 :Crash Safe DDL

    前言 在MySQL8.0之前的版本中,由于架构的原因,mysql在server层使用统一的frm文件来存储表元数据信息,这个信息能够被不同的存储引擎识别.而实际上innodb本身也存储有元数据信息.这 ...

  6. MySQL-08 MySQL8.0新特性

    性能 MySQL 8.0 在一定的用户访问条件下,速度要比 MySQL 5.7 快 2 倍.MySQL 8.0 在以下方面带来了更好的性能:读/写工作负载.IO 密集型工作负载.以及高竞争(" ...

  7. MySQL8.0新特性总览

    1.消除了buffer pool mutex (Percona的贡献) 2.数据字典全部采用InnoDB引擎存储,支持DDL原子性.crash safe.metadata管理更完善(可以利用ibd2s ...

  8. MySQL8的新特性ROLE

    [MySQL的ROLE解决了什么问题] 假设你是一个职业素养良好的DBA比较同时又比较注重权限管理的话:可能遇到过这样的问题,数据库中有多个开发人员的账号:有一天要建 一个新的schema,如果你希望 ...

  9. MySQL8.0 新特性 Hash Join

    概述&背景 MySQL一直被人诟病没有实现HashJoin,最新发布的8.0.18已经带上了这个功能,令人欣喜.有时候在想,MySQL为什么一直不支持HashJoin呢?我想可能是因为MySQ ...

随机推荐

  1. java推断字符串中是否包括字母

    1.java代码推断字符串中是否包括字母: 思路:使用正則表達式的来验证 1.1演示样例代码例如以下: /** * 该方法主要使用正則表達式来推断字符串中是否包括字母 * @author fengga ...

  2. 有关/proc/uptime这个文件里两个参数所代表的意义

    有关/proc/uptime这个文件里两个参数所代表的意义: [root@app ~]#cat /proc/uptime 3387048.81 3310821.00 第一个参数是代表从系统启动到现在的 ...

  3. python操作Excel的几种方式

    Python对Excel的读写主要有xlrd.xlwt.xlutils.openpyxl.xlsxwriter几种. 1.xlrd主要是用来读取excel文件 import xlrd workbook ...

  4. VB数组的清除

    在一个程序中,同一数组只能用Dim语句定义一次.但有时可能需要清除数组的内容或对数组重新定义,这可以用:Erase语句来实现. 格式:Erase(数组名)[,(数组名)] 功能:用于重新初始化静态数组 ...

  5. 如何在MyEclipse配置Gradle

    1.首先下载gradle gdk http://services.gradle.org/distributions 选一个bin或者all的下载即可 2.配置path GRADLE_HOME  D:\ ...

  6. python 第三库卸载办法

    Microsoft Windows [版本 6.1.7601]版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\Users\Administrator> ...

  7. html 5检查Mobile App是否在线

    在PhoneGap应用,或者黑莓Java/HTML混搭应用中,如何使用JavaScript检查Mobile App网络连接状态呢? <script type="text/javascr ...

  8. 转 linux Crontab 使用

    cron用法说明 cron的用法老是记不住,索性写下来备忘.下文内容大部分是根据<Cron Help Guide>翻译而来,有些部分是自己加上的. 全文如下: cron来源于希腊单词chr ...

  9. 分布式 并行软件平台 Dryad Hadoop HPCC

    1.为了 能够方便记忆, 总结一下. 2.  并行软件平台,不是 一个. (1)这个特别熟悉的 以 hadoop 为平台的 生态系统 (2)还有以 微软的 并行软件平台 生态系统 (3) 还有Lexi ...

  10. 搭建 Node.js 环境

    安装 Node.js 环境 任务时间:5min ~ 10min Node.js 是运行在服务端的 JavaScript, 是基于 Chrome JavaScript V8 引擎建立的平台. 下载并安装 ...