公用表表达式(或通用表表达式)简称为CTE(Common Table Expressions)。CTE是一个命名的临时结果集,作用范围是当前语句。CTE可以理解成一个可以复用的子查询,当然跟子查询还是有点区别的,CTE可以引用其他CTE,但子查询不能引用其他子查询。所以,可以考虑代替子查询。

1. 普通公用表表达式

  1. WITH CTE名称
  2. AS (子查询)
  3. SELECT|DELETE|UPDATE 语句;

查询所有有员工的部门的部门信息
子查询

SELECT * FROM departments
WHERE department_id IN (
          SELECT DISTINCT department_id
          FROM employees);

公用表表达式

WITH `cte_test`
AS 
(SELECT DISTINCT department_id FROM emp)

SELECT *
FROM departments d JOIN cte_test e
ON d.department_id = e.department_id;

2. 递归的公用表表达式

递归公用表表达式也是一种公用表表达式,只不过,除了普通公用表表达式的特点以外,它还有自己的特点,就是可以调用自己。

WITH RECURSIVE
CTE名称 AS (子查询)
SELECT|DELETE|UPDATE 语句;