📜  CTE 语句 sql server - SQL (1)

📅  最后修改于: 2023-12-03 14:40:23.388000             🧑  作者: Mango

CTE 语句 sql server - SQL

什么是CTE语句?

CTE(Common Table Expression)语句是一种可以创建临时表的SQL语句,这些临时表只供当前查询使用,并在查询执行完毕后自动删除。CTE语句可以帮助我们创建复杂的查询,提高查询性能和可读性。

CTE语句的语法
WITH CTE_NAME (column1,column2,...,columnN)
AS
(
    SELECT column1,column2,...,columnN
    FROM table_name
    WHERE condition
)
SELECT * FROM CTE_NAME;
  • WITH用于指定CTE语句
  • CTE_NAME是我们创建的临时表的名称
  • column1,column2,...,columnN是我们指定的列的名称
  • SELECT语句用于从表中选择数据
  • WHERE语句用于指定过滤条件
CTE语句的示例

例如我们有如下两张表:

SalesOrder表包含了销售订单的信息,包括订单号、订单日期、订单金额等。

CREATE TABLE SalesOrder(
    OrderID INT,
    OrderDate DATE,
    Amount DECIMAL(10,2)
);

INSERT INTO SalesOrder (OrderID, OrderDate, Amount)
VALUES (1, '2020-01-01', 100.00),
       (2, '2021-01-01', 200.00),
       (3, '2021-02-01', 300.00),
       (4, '2021-03-01', 400.00),
       (5, '2021-04-01', 500.00);

Discount表包含了销售订单的折扣信息,包括订单号、折扣率等。

CREATE TABLE Discount(
    OrderID INT,
    DiscountRate DECIMAL(10,2)
);

INSERT INTO Discount(OrderID, DiscountRate)
VALUES (1, 0.1), (2, 0.2), (3, 0.15), (4, 0.25), (5, 0.05);

现在,我们要查询所有订单的实际金额(减去折扣后的金额),并按照订单日期递增排序。

使用普通的SQL语句,可能需要进行多次的嵌套查询,甚至需要使用复杂的子查询。但是使用CTE语句,可以轻松地实现这个操作。

WITH CTE_SalesOrder AS
(
    SELECT OrderID, OrderDate, Amount
    FROM SalesOrder
),
CTE_Discount AS
(
    SELECT OrderID, DiscountRate
    FROM Discount
)
SELECT OrderDate, (Amount * (1-DiscountRate)) AS ActualAmount
FROM CTE_SalesOrder so
     INNER JOIN CTE_Discount dis ON so.OrderID = dis.OrderID
ORDER BY OrderDate;

以上CTE语句可以把需要的数据抽象成临时表来进行计算,使用更为直观,也更加易懂。

CTE语句的优点
  • 提高可读性。使用CTE语句,可以将SQL语句进行模块化,每个模块都只关注其自身的任务,使得整个SQL语句易于理解和修改。
  • 提高性能。CTE语句可以避免重复查询,减少了I/O操作和CPU时间,提高了查询的性能。
  • 支持递归查询。CTE语句可以在查询中递归使用,例如查询员工和上级领导的关系。

以上是CTE语句的介绍,希望对开发人员在SQL Server中使用CTE语句有些帮助!