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

 

----


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM