手记

【九月打卡】第19天 MySQL8.0 通用表表达式

第一板块:玩转MySQL8.0新特性,4-1;4-2;4-3;4-4,董旭阳

第二,三板块:

  1. 通用表表达式

    (1)非递归CTE

  2. (2)递归 CTE

    如果某个 CTE 在子查询中引用了自己,就称为递归 CTE。

    (3)递归限制

    对于递归 CTE 而言,需要在递归SELECT部分包含一个终止递归的条件。

    系统变量 cte_max_recursion_depth 用于设置 CTE 递归的次数限制。如果 CTE 递归的次数超过了该变量的值,服务器将会强制终止语句的执行。

    系统变量 max_execution_time 用于设置当前会话中查询语句的超时时间。

    优化器提示 MAX_EXECUTION_TIME 用于设置当前查询语句的超时时间。

  3. CTE语法

    通用表表达式使用WITH子句进行定义,该子句可以包含一个或多个逗号分隔的从句。每个从句包含一个子查询,以及指定的名称。以下示例在WITH子句中定义了两个 CTE:cte1 和 

cte2,然后在顶层SELECT中进行引用:
WITH
  cte1 AS (SELECT a, b FROM table1),
  cte2 AS (SELECT c, d FROM table2)
SELECT b, d FROM cte1 JOIN cte2
WHERE cte1.a = cte2.c;
//举例:
-- 不适用CTE
select * from (select 1) as dt;
-- 使用CTE
with dt as (select 1)
select * from dt;

//举例:递归

WITH RECURSIVE cte (n) AS
(
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM cte WHERE n < 5
)
SELECT * FROM cte;
// 以上语句的执行结果是一个连续的数字序列:
+------+
| n    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+

// 举例限止递归
考虑以下递归 CTE,它没有包含递归终止条件
WITH RECURSIVE cte (n) AS
(
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM cte
)
SELECT * FROM cte;

第四板块:


0人推荐
随时随地看视频
慕课网APP