MySQL8的新特性CTE

2022-06-21 17:42:09 字數 3000 閱讀 1470

瞎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)

MySQL 8 新特性介紹

原文 what s new in mysql 8.0mysql是眾多 技術棧中的標準配置,是廣受歡迎的開源資料庫,已經推出了8.0的第乙個候選發行版本。mysql 8.0的新特性包括 根據mysql的策略 乙個新的 一般 版本發布的週期是18 24個月 mysql並沒有承諾mysql 8.0的發布日...

MySQL 8的關鍵新特性

mysql的第八個版本蓄勢待發,並有望於2018年發布。在mysql 5.7.9的首個通用版本推出後的28個月內,mysql 8發布了從8.0.0到8.0.4這五個候選版本。這些發布候選僅針對開發使用,而不應該生產系統中使用。因為這些候選版並不支援版本公升級,使用者可能會碰上候選版與一般可用 ga ...

MySQL 8的關鍵新特性

mysql的第八個版本蓄勢待發,並有望於2018年發布。在mysql 5.7.9的首個通用版本推出後的28個月內,mysql 8發布了從8.0.0到8.0.4這五個候選版本。這些發布候選僅針對開發使用,而不應該生產系統中使用。因為這些候選版並不支援版本公升級,使用者可能會碰上候選版與一般可用 ga ...