一、简介
With SQL 或称为 CTE(Common Table Expressions),是标准 SQL 中一个非常强大且十分实用的特性。它允许我们在 SQL 查询中使用诸如 SELECT、INSERT、DELETE 和 UPDATE 等操作。可类比编程语言中的变量,With SQL 在 SQL 查询过程中起到了变量的作用,减少了多次复杂查询重复操作,同时也提高了查询的性能。
CTE 可以在 WITH 子句中定义多个表,这些表的名称和定义与查询的其余部分分开。常见的使用场景包括:递归查询,过滤重复数据,使用窗口函数进行排序。
WITH employees_working_in_USA AS (
SELECT *
FROM employees
JOIN departments ON employees.department_id = departments.department_id
WHERE departments.country = 'USA'
)
SELECT * FROM employees_working_in_USA;
上述示例展示了一个简单的 With SQL 查询。该查询首先创建一个名为 employees_working_in_USA 的临时表格,其中存储了来自 employees 表和 departments 表的所有员工和其工作部门信息,且只选择部门在美国的员工。然后,该查询从 employees_working_in_USA 表中选择所有列。
二、新增列、表或子查询
With SQL 查询中,我们不仅可以选择常规查询的列,还可以添加新的列或子查询。这使我们可以在查询中计算一些值或使用其他更高级别的查询。
WITH revenue AS (
SELECT order_id, (quantity * price) AS order_revenue
FROM order_details
)
SELECT MAX(order_revenue)
FROM revenue;
上述示例展示了一个 With SQL 查询,具有从 order_details 表计算总收入的计算列(即使用 quantity 和 price 计算 order_revenue)。这种计算列可以被其他查询继续使用。
With SQL 还可以被用作子查询的一部分。这意味着您可以从一个 With SQL 查询中选择并连接数据,而不必为每个子查询重复执行相同的工作。
WITH high_sales AS (
SELECT region, SUM(sales) AS total_sales
FROM sales
GROUP BY region
HAVING SUM(sales) >= 1000000
)
SELECT * FROM employees
WHERE department_id IN (
SELECT department_id FROM high_sales
);
三、递归查询
递归查询是 With SQL 最为重要的应用之一。递归查询主要是针对有父子结构关系的数据表进行处理,并且对于需要多次递归访问相同表格的操作,使用 With SQL 可以减少重复代码并提高性能。
WITH RECURSIVE tree(id, name, parent_id) AS (
SELECT id, name, parent_id
FROM menu
WHERE name = 'Home'
UNION ALL
SELECT m.id, m.name, m.parent_id
FROM menu m
INNER JOIN tree t ON m.parent_id = t.id
)
SELECT * FROM tree;
上述示例中,我们使用了递归查询来获取“Home”节点的所有子节点信息,这里的 menu 表必须具有自引用关系,即有父节点和子节点的关联。查询首先从 menu 表中选出根节点 name='Home' 的项,然后使用 union all 递归地加入所有子项,直到完全遍历完所有子节点。
四、使用连接数据
With SQL 还可以被用作连接数据的一种方式。下面是一个使用 With SQL 和 INNER JOIN 语句来连接两个数据表的查询示例:
WITH ActiveOrders AS (
SELECT order_id
FROM orders
WHERE order_status = 'Active'
)
SELECT *
FROM customers c
INNER JOIN ActiveOrders o ON c.customer_id = o.customer_id;
上述示例中,我们先创建一个名为 ActiveOrders 的 With SQL 查询,它选择所有状态为“Active”的订单。然后,我们将其与 customers 表格 INNER JOIN 在一起,以检索所有客户和其关联的活动订单。
总结
With SQL 是 SQL 查询中非常实用的特性之一。使用 With SQL 可以减少在代码中的冗余,同时提高查询的可读性和性能。本文介绍了几个使用 With SQL 的示例,您可以根据需求和场景进行灵活运用。