📜  SQL | WITH子句(1)

📅  最后修改于: 2023-12-03 15:05:18.108000             🧑  作者: Mango

SQL | WITH子句

简介

WITH子句也被称为“公共表表达式”(Common Table Expression,CTE)。它是SQL的一种特殊语法,可以让你在查询中定义临时的、命名的查询结果集。这些临时的命名查询结果集可以被其他查询使用,从而避免了大量嵌套查询的代码。

语法

WITH子句有以下语法:

WITH cte_name (column_list) AS (
   SELECT statement
)
  • cte_name:你定义的临时表的名称。
  • column_list:可选,指定CTE返回的列的名称。
  • SELECT statement:指定CTE的查询语句。

你还可以在查询语句中使用CTE名称,如下所示:

SELECT column_list
FROM cte_name
WHERE condition;
实例
示例1

我们先来看一个使用WITH子句的简单示例。假设我们有一张books表,它包含以下列:book_id、title、author、publisher和price。我们想要查询出发布商为"Apress"的所有书籍的信息。下面是实现的步骤。

  1. 使用WITH子句定义一个临时表。我们将它命名为apress_books,它将返回publishers列为"Apress"的书籍的book_id、title、author、publisher和price列。
WITH apress_books AS (
   SELECT book_id, title, author, publisher, price
   FROM books
   WHERE publisher = 'Apress'
)
  1. 通过查询apress_books表来获取我们所需要的结果。
SELECT * FROM apress_books;
示例2

让我们再看一个稍微复杂一点的例子。假设我们有一张orders表,它包含以下列:order_id、order_date、customer_id和amount。我们想要查询出2018年1月份所有客户的销售额,按销售额从大到小排序。下面是实现的步骤。

  1. 使用WITH子句定义两个临时表。
    • 第一个临时表sales_by_customer将返回每个客户的销售额。
    • 第二个临时表sales_by_month将返回2018年1月份的总销售额。
WITH sales_by_customer AS (
   SELECT customer_id, SUM(amount) AS total_sales
   FROM orders
   WHERE order_date >= '2018-01-01' AND order_date <= '2018-01-31'
   GROUP BY customer_id
), 
sales_by_month AS (
   SELECT SUM(total_sales) AS sales
   FROM sales_by_customer
)
  1. 通过从sales_by_customer和customers表中获取客户信息,以及从sales_by_month表中获取销售总额来获取我们所需要的结果。我们同时还在查询语句中嵌套了一个子查询,以便按销售额从大到小排序。
SELECT c.customer_id, c.first_name, c.last_name, s.total_sales
FROM sales_by_customer s
INNER JOIN customers c ON s.customer_id = c.customer_id
CROSS JOIN sales_by_month m
ORDER BY s.total_sales DESC;
总结

使用WITH子句可以让你在查询中定义临时的、命名的查询结果集。这样可以使查询更加简洁、易读、易理解。同时,在大型的查询语句中使用WITH子句可以提高SQL查询的性能。