SQL2005 学习笔记 公用表表达式(CTE)

SQL2005 学习笔记 公用表表达式(CTE)

公用表表达式(CTE)是SQL 2005引入的一项非常强大的功能。可以把它想象成为一个临时性视图,从多张表中获取数据并创建一个只读的虚拟数据集。CTE提供了一种优雅而有力的方式,允许开发人员重用代码,同时还可以提供更好的可读性和可维护性。

CTE的基本语法

WITH [CTE名称] ([列名列表]) AS
(
    -- SELECT 语句
)

其中,WITH子句引入了一个公用表表达式,可以给这个公用表表达式指定名称,方便之后的引用。在AS的后面,可以指定公用表中输出的列名列表。

CTE的使用注意事项

以下是使用CTE时需要注意的一些事项:

  • CTE只在包含它们的语句中可见,不能在同一语句块外部或其他查询中引用。
  • CTE的生命周期只在包含它们的查询语句中,它们不会被存储在数据库中。
  • CTE不能与SELECT INTO结合使用,也不能创建索引或统计信息。
  • CTE不允许附加表提示或表达式。
  • 在一个查询中可以使用多个CTE,但是同一个CTE名称只能在一个查询中使用一次。

CTE的示例

示例1:使用CTE计算销售订单总额

假设我们有两个表,一个是客户信息表OrderCustomers,包含客户ID和客户名称;另一个是销售订单表OrderSales,包含订单ID、客户ID和订单金额。

我们可以使用CTE来计算每一个客户的订单总额。

WITH CTE_Sales (CustomerID, TotalSales) AS
(
    SELECT CustomerID, SUM(SalesAmount) AS TotalSales
    FROM OrderSales
    GROUP BY CustomerID
)
SELECT C.CustomerName, S.TotalSales
FROM OrderCustomers C
JOIN CTE_Sales S ON C.CustomerID = S.CustomerID;

在上面的查询中,我们创建了一个名为CTE_Sales的公用表。这个公用表使用了OrderSales表,计算每个客户的销售总额。最后,我们将客户名称和销售总额从两个表中连接起来并输出。

示例2:使用CTE进行递归查询

CTE还可以用于递归查询。假设我们有一个包含员工信息的表Employee,每一个员工都有一个上级名称作为他们的Manager。我们想要查询一个员工的所有上级名称,包括这个员工本身。

首先,我们需要创建一个公用表,它包含一个包含根节点的“基本”查询和一个递归查询。

WITH CTE_Managers (EmployeeID, EmployeeName, ManagerID, ManagerName, ManagerHierarchy) AS
(
    -- 该查询选择每个员工的雇员名称和上级名称,并使用0作为根节点的ID。
    SELECT EmployeeID,
           EmployeeName,
           ManagerID,
           ManagerName,
           CAST(EmployeeID AS VARCHAR(MAX)) AS ManagerHierarchy
    FROM Employee
    WHERE EmployeeID = 1

    UNION ALL

    -- 递归查询,将每个节点的上级节点添加到结果集中。同时,每个节点的ManagerHierarchy列都将增加其祖先的EmployeeID。
    SELECT E.EmployeeID,
           E.EmployeeName,
           E.ManagerID,
           E.ManagerName,
           CAST(M.ManagerHierarchy + '.' + CAST(E.EmployeeID AS VARCHAR(MAX)) AS VARCHAR(MAX))
    FROM Employee E
    INNER JOIN CTE_Managers M
        ON E.EmployeeID = M.ManagerID
)

在上面的查询中,我们使用了一个基本查询和一个递归查询。对于基本查询,我们仅选择EmployeeID为1的员工作为根节点。而对于递归查询,则是找到每个节点的上级节点,并将每个节点的ManagerHierarchy列增加其祖先的EmployeeID。

最后,我们可以从CTE_Managers中选择某个员工的所有上级名称

SELECT EmployeeName, ManagerName
FROM CTE_Managers
WHERE ManagerHierarchy LIKE '%.1.%'
ORDER BY ManagerHierarchy;

在上面的查询中,我们可以通过LIKE运算符来选择一个员工的所有上级名称,使用ORDER BY ManagerHierarchy可以保证这些名称按照它们之间的级别顺序显示。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SQL2005 学习笔记 公用表表达式(CTE) - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • sql server 2008数据库连接字符串大全

    SQL Server 2008数据库连接字符串大全 在应用程序中连接SQL Server 2008数据库时,必须使用连接字符串。连接字符串的格式包含数据源地址、数据库名称、认证方式和其他附加属性。这篇文章将介绍SQL Server 2008数据库连接字符串的完整攻略,包括多种不同的连接字符串样式,连接字符串中各项参数的含义和不同情况下应该如何修改连接字符串。…

    database 2023年5月21日
    00
  • SQL实现LeetCode(175.联合两表)

    首先,我们需要明确一下这道题的要求:根据联合两张表的”id”字段,查询出对应的”first_name”、”last_name”和”city”字段。其中,第一张表名为”Person”,第二张表名为”Address”。如果这两张表中的”id”字段没有交集,即在某一张表中找不到对应的”id”值,则需要返回null值。 接下来,我们就可以根据这个要求来编写SQL语句…

    database 2023年5月22日
    00
  • Python操作MySQL的一个报错:IndexError: out of range

    # -*- coding: utf-8 -*-import sysimport MySQLdbtry: conn=MySQLdb.connect(host=”localhost”,user=”root”,passwd=”xxx”)except Exception,e:print e sys.exit()#获取操作游标cursor=conn.cursor()#…

    MySQL 2023年4月13日
    00
  • sql cast,convert,QUOTENAME,exec 函数学习记录

    让我来为您详细讲解一下“SQL CAST、CONVERT、QUOTENAME、EXEC 函数学习记录”的完整攻略。 CAST 和 CONVERT 函数 在 SQL 中,我们经常需要将一种数据类型转换为另一个数据类型,这时候我们可以使用 CAST 或 CONVERT 函数。 CAST 函数用于将一个数据类型转换为另一个数据类型,语法如下: CAST(expre…

    database 2023年5月21日
    00
  • MySQL忘记密码恢复密码的实现方法

    MySQL忘记密码恢复密码的实现方法 当你忘记MySQL的密码时,有多种方法可以重新设置它。下面详细介绍一些方法。 方法一:通过忘记密码向导进行重置 如果你使用的是MySQL 5.7.6及更高版本,则可以利用MySQL提供的“忘记密码向导”来重置密码。步骤如下: 停止MySQL服务 bash sudo systemctl stop mysql 在MySQL配…

    database 2023年5月22日
    00
  • php+mysql实现微信公众号回复关键词新闻列表

    非常抱歉,我之前理解有误。如果您想要实现在公众号发送关键词,返回新闻列表的功能,可以按照以下步骤进行操作: 1. 创建一个数据库表,用于存储新闻的标题、链接和内容等信息。例如,可以创建一个名为news的表,包含id、title、link和content等字段。 2. 在公众号后台设置自定义菜单或关键词回复,将用户发送的关键词作为参数传递到后台程序。 3. 在…

    MySQL 2023年4月16日
    00
  • 用PHP和Shell写Hadoop的MapReduce程序

    用PHP和Shell编写Hadoop的MapReduce程序需要遵循以下步骤: 1.编写Mapper和Reducer代码:Mapper和Reducer是Hadoop编程中最核心的两个部分。通常使用Java编写MapReduce程序,但是使用PHP和Shell编写也是可以的。Mapper的代码负责将输入文件中的每一个元素转换成键值对,Reducer的代码则负责…

    database 2023年5月22日
    00
  • Centos7 Redis主从搭建配置的实现

    下面是CentOS 7上 Redis主从搭建配置的实现攻略。 准备工作 1.安装必要的依赖 在终端中执行以下命令,安装需要的依赖: yum install gcc gcc-c++ kernel-devel 2.下载并安装Redis 在官网 https://redis.io/download 中下载最新版本的Redis,然后执行以下命令进行安装: tar xz…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部