本文實例講述了mysql8 公用表表達式CTE的使用方法。,具體如下:
公用表表達式CTE就是命名的臨時結果集,作用范圍是當前語句。
說白點你可以理解成一個可以復用的子查詢,當然跟子查詢還是有點區別的,CTE可以引用其他CTE,但子查詢不能引用其他子查詢。
一、cte的語法格式:
with_clause: WITH [RECURSIVE] cte_name [(col_name [, col_name] ...)] AS (subquery) [, cte_name [(col_name [, col_name] ...)] AS (subquery)] ...
二、哪些地方可以使用with語句創建cte
1、select, update,delete 語句的開頭
WITH ... SELECT ...WITH ... UPDATE ...WITH ... DELETE ...
2、在子查詢的開頭或派生表子查詢的開頭
SELECT ... WHERE id IN (WITH ... SELECT ...) ...SELECT * FROM (WITH ... SELECT ...) AS dt ...
3、緊接SELECT,在包含 SELECT聲明的語句之前
INSERT ... WITH ... SELECT ...REPLACE ... WITH ... SELECT ...CREATE TABLE ... WITH ... SELECT ...CREATE VIEW ... WITH ... SELECT ...DECLARE CURSOR ... WITH ... SELECT ...EXPLAIN ... WITH ... SELECT ...
三、我們先建個表,準備點數據
CREATE TABLE `menu` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(32) DEFAULT '' COMMENT '名稱', `url` varchar(255) DEFAULT '' COMMENT 'url地址', `pid` int(11) DEFAULT '0' COMMENT '父級ID', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
插入點數據:
INSERT INTO `menu` (`id`, `name`, `url`, `pid`) VALUES ('1', '后臺管理', '/manage', '0');INSERT INTO `menu` (`id`, `name`, `url`, `pid`) VALUES ('2', '用戶管理', '/manage/user', '1');INSERT INTO `menu` (`id`, `name`, `url`, `pid`) VALUES ('3', '文章管理', '/manage/article', '1');INSERT INTO `menu` (`id`, `name`, `url`, `pid`) VALUES ('4', '添加用戶', '/manage/user/add', '2');INSERT INTO `menu` (`id`, `name`, `url`, `pid`) VALUES ('5', '用戶列表', '/manage/user/list', '2');INSERT INTO `menu` (`id`, `name`, `url`, `pid`) VALUES ('6', '添加文章', '/manage/article/add', '3');INSERT INTO `menu` (`id`, `name`, `url`, `pid`) VALUES ('7', '文章列表', '/manage/article/list', '3');
四、非遞歸CTE
這里查詢每個菜單對應的直接上級名稱,通過子查詢的方式。
select m.*, (select name from menu where id = m.pid) as pname from menu as m;
這里換成用cte完成上面的功能
with cte as ( select * from menu) select m.*, (select cte.name from cte where cte.id = m.pid) as pname from menu as m;
上面的示例并不是很好,只是用來演示cte的使用。你只需要知道 cte 就是一個可復用的結果集就好了。
新聞熱點
疑難解答