在 PostgreSQL 中,WITH 子句用于创建一个临时的命名查询,通常被称为公共表表达式(Common Table Expression,CTE)。CTE 允许你在查询中定义一个或多个临时表,然后在查询的主体中引用这些表。

以下是 WITH 子句的基本用法:
WITH cte_name (列1, 列2, 列3, ...) AS (
  SELECT 值1, 值2, 值3, ...
  FROM 表1
  WHERE 条件
)
SELECT *
FROM cte_name
WHERE 其他条件;

在这个语句中:

  •  cte_name 是公共表表达式的名称。

  •  (列1, 列2, 列3, ...) 是公共表表达式的列名列表。

  •  SELECT 值1, 值2, 值3, ... FROM 表1 WHERE 条件 是定义 CTE 的查询。

  •  最后的 SELECT * FROM cte_name WHERE 其他条件 是使用 CTE 的查询。


举例来说,假设你想要在一个查询中计算每个部门的平均工资并找出高于平均工资的员工,可以使用 WITH 子句:
WITH department_avg_salary AS (
  SELECT department_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY department_id
)
SELECT employees.*
FROM employees
JOIN department_avg_salary ON employees.department_id = department_avg_salary.department_id
WHERE employees.salary > department_avg_salary.avg_salary;

在这个例子中,department_avg_salary 是一个公共表表达式,它计算了每个部门的平均工资。然后,主查询通过与这个 CTE 进行连接来筛选出高于平均工资的员工。使用 CTE 可以使 SQL 查询更具可读性和模块化。


转载请注明出处:http://www.zyzy.cn/article/detail/8147/PostgreSQL