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