19.1 公用表表达式
从MySQL 8.x版本开始支持公用表表达式(简称为CTE)。公用表表达式通过WITH语句实现,可以分为非递归公用表表达式和递归公用表表达式。
在常规的子查询中,派生表无法被引用两次,否则会引起MySQL的性能问题。如果使用CTE查询的话,子查询只会被引用一次,这也是使用CTE的一个重要原因。
19.1.1 非递归CTE
MySQL 8.0之前,想要进行数据表的复杂查询,需要借助子查询语句实现,但SQL语句的性能低下,而且子查询的派生表不能被多次引用。CTE的出现极大地简化了复杂SQL的编写,提高了数据查询的性能。
非递归CTE的语法格式如下:
WITH
cte_name [(col_name [, col_name] ...)] AS (subquery)
[, cte_name [(col_name [, col_name] ...)] AS (subquery)] …
SELECT [(col_name [, col_name] ...)] FROM cte_name;
可以对比子查询与CTE的查询来加深对CTE的理