公用表表达式(CTE)详解:针对 MySQL 和 SQL Server 数据库

公用表表达式(CTE,Common Table Expressions)是一种在 SQL 中定义临时结果集的方法,该结果集在单个查询的执行过程中可以被引用。CTE 提高了查询的可读性和结构化,特别适用于复杂的子查询和递归查询。本文将详细介绍 CTE 的概念和用法,并分别针对 MySQL 和 SQL Server 数据库进行说明。

什么是公用表表达式(CTE)

CTE 是一个命名的临时结果集,它在查询的执行范围内有效。CTE 的定义在 WITH 子句中,紧随其后的是查询主体。CTE 分为两种类型:

  1. 非递归 CTE:用于定义一次性计算结果的临时表。
  2. 递归 CTE:用于处理递归查询,如处理层次结构数据(例如组织结构图)。

CTE 的语法

基本语法
WITH cte_name AS (SELECT column1, column2, ...FROM table_nameWHERE condition
)
SELECT column1, column2, ...
FROM cte_name
WHERE condition;

MySQL 中的 CTE

MySQL 从 8.0 版本开始支持 CTE。下面是一些常见的使用场景。

示例 1:非递归 CTE

假设我们有一个名为 bs_bill_day 的表,并且希望使用 CTE 从该表中选择数据,然后限制结果为前 10 行。

WITH bill_cte AS (SELECT * FROM bs_bill_day
)
SELECT * 
FROM bill_cte 
LIMIT 10;
示例 2:递归 CTE

假设我们有一个表示员工和经理关系的表 employees,其中包含 employee_idmanager_id 列,我们希望找到某个经理及其所有下属。

WITH RECURSIVE employee_cte AS (-- 初始查询,选择顶层经理SELECT employee_id, manager_id, 1 AS levelFROM employeesWHERE manager_id IS NULLUNION ALL-- 递归部分,选择下一级员工SELECT e.employee_id, e.manager_id, ec.level + 1FROM employees eINNER JOIN employee_cte ec ON e.manager_id = ec.employee_id
)
SELECT * 
FROM employee_cte;

SQL Server 中的 CTE

SQL Server 从 2005 版本开始支持 CTE。它的语法和 MySQL 类似。

示例 1:非递归 CTE

假设我们有一个名为 bs_bill_day 的表,并且希望使用 CTE 从该表中选择数据,然后限制结果为前 10 行。

WITH bill_cte AS (SELECT * FROM bs_bill_day
)
SELECT TOP 10 * 
FROM bill_cte;
示例 2:递归 CTE

假设我们有一个表示员工和经理关系的表 employees,其中包含 employee_idmanager_id 列,我们希望找到某个经理及其所有下属。

WITH employee_cte AS (-- 初始查询,选择顶层经理SELECT employee_id, manager_id, 1 AS levelFROM employeesWHERE manager_id IS NULLUNION ALL-- 递归部分,选择下一级员工SELECT e.employee_id, e.manager_id, ec.level + 1FROM employees eINNER JOIN employee_cte ec ON e.manager_id = ec.employee_id
)
SELECT * 
FROM employee_cte;

使用 CTE 进行分页

在大数据集的分页查询中,CTE 也非常有用。以下是在 MySQL 和 SQL Server 中使用 CTE 进行分页的示例。

MySQL 分页
WITH bill_cte AS (SELECT * FROM bs_bill_day
)
SELECT * 
FROM bill_cte 
LIMIT 10 OFFSET 0; -- 获取第一页的10条记录

SQL Server 分页

WITH bill_cte AS (SELECT *, ROW_NUMBER() OVER (ORDER BY some_column) AS row_numFROM bs_bill_day
)
SELECT * 
FROM bill_cte
WHERE row_num BETWEEN 1 AND 10; -- 获取第一页的10条记录

mysql实现返回最近三十天的列


WITH RECURSIVE recent_day_cte AS (-- 初始查询,获取当前日期的订单记录SELECT CURDATE() AS dayKeyUNION ALL-- 递归查询,获取前一天的订单记录SELECT DATE_SUB(dayKey, INTERVAL 1 DAY)FROM recent_day_cteWHERE dayKey >= CURDATE() - INTERVAL 29 DAY
)
SELECT *
FROM recent_day_cte;

sql server 实现返回最近三十天的列

WITH recent_dates_cte AS (-- 初始查询,获取当前日期的订单记录SELECT CAST(GETDATE() AS DATE) AS dayKeyUNION ALL-- 递归查询,获取前一天的日期SELECT DATEADD(DAY, -1, dayKey)FROM recent_dates_cteWHERE dayKey >= DATEADD(DAY, -29, CAST(GETDATE() AS DATE))
)
SELECT *
FROM recent_dates_cte;

sql server 获取最近七个月的月份信息

WITH recent_dates_cte AS (-- 初始查询,获取当前日期的订单记录SELECT CAST(GETDATE() AS DATE) AS dayKeyUNION ALL-- 递归查询,获取前一天的日期SELECT DATEADD(MONTH, -1, dayKey)FROM recent_dates_cteWHERE dayKey >= DATEADD(MONTH, -5, CAST(GETDATE() AS DATE))
),
month_key_cte as (
SELECT CONVERT(varchar(7),dayKey,120)  as monKey
FROM recent_dates_cte
)select * from month_key_cte

sql server 获取最近七周的周信息

WITH recent_dates_cte AS (-- 初始查询,获取当前日期的订单记录SELECT CAST(GETDATE() AS DATE) AS dayKeyUNION ALL-- 递归查询,获取前一天的日期SELECT DATEADD(WEEK, -1, dayKey)FROM recent_dates_cteWHERE dayKey >= DATEADD(WEEK, -5, CAST(GETDATE() AS DATE))
),
week_key_cte as (SELECT CONCAT(DATEPART(YEAR, dayKey), '-', FORMAT(DATEPART(WEEK, dayKey), '00')) AS weekKey,CASE WHEN DATEDIFF(WEEK, dayKey, GETDATE()) = 0 THEN '本周'WHEN DATEDIFF(WEEK, dayKey, GETDATE()) = 1 THEN '前1周'WHEN DATEDIFF(WEEK, dayKey, GETDATE()) = 2 THEN '前2周'WHEN DATEDIFF(WEEK, dayKey, GETDATE()) = 3 THEN '前3周'WHEN DATEDIFF(WEEK, dayKey, GETDATE()) = 4 THEN '前4周'WHEN DATEDIFF(WEEK, dayKey, GETDATE()) = 5 THEN '前5周'WHEN DATEDIFF(WEEK, dayKey, GETDATE()) = 6 THEN '前6周'END AS labelFROM recent_dates_cte
)select * from week_key_cte

有了这样的基础,实现最近6个月,最近5年,最近6周是不是特别简单了,方便统计,比如统计最近六周,半年,最近六年,有了with以后是不是好理解多了。

公用表表达式(CTE)是处理复杂查询的强大工具,提供了更好的代码可读性和结构化。在 MySQL 和 SQL Server 中使用 CTE,能够简化复杂的子查询,并且方便处理递归查询和分页查询。通过本文的介绍,希望读者能对 CTE 的概念和用法有更清晰的理解,并能在实际工作中应用这些技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/17474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cfa三级大神复习经验分享系列(六)

Behavioral Finance 这一般是大家拿来入门的章节,可是上来就那么多名词,那么多原理真的完全看晕了。其实这一章节最大的重点就是各个bias,其他的东西都是帮助理解的,考试不会考。我自己列了一个清单,把所有bias根据分类…

【Linux学习】进程间通信 (2) —— 信号

下面是有关进程通信中信号的相关介绍,希望对你有所帮助! 小海编程心语录-CSDN博客 目录 1. 信号 1.1 概念 1.2 信号的产生 1.3 信号的处理方式 2. 函数 2.1 kill() 函数 2.2 signal()函数 2.3 sigaction()函数 2.4 sigprocmask()函数 …

Python中的`*args`和`**kwargs`:深入理解可变参数传递

Python中的*args和**kwargs:深入理解可变参数传递 在Python函数编程中,*args和**kwargs是两个非常有用的特性,它们允许我们在调用函数时传递任意数量和类型的参数。这种灵活性使得函数更加通用和可重用。本文将深入探讨*args和**kwargs的工作原理、应用场景以及它们如何增强…

c++对rgb数据进行抽样

以下算法是对rgb数据进行抽样,将数据在内容不变的情况下,降低数据的内存占用,方便应用处理和网络传输。 int scaleRGB(const unsigned char* src_img, unsigned char* dst_img, unsigned int src_width, unsigned int src_height, unsigned int dst_width, unsigned int ds…

文盘Rust -- 生命周期问题引发的 static hashmap 锁

100编程书屋_孔夫子旧书网 2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了。项目地址:https://github.com/jiashiwen/interactcli-rs。 春节以前看到axum已经0.4.x了,于是想看看能不能用rust做个服务端的框架。 春节…

如何从Android恢复已删除的文件?3 种有效的方式

有时我们可能会错误地删除Android设备上的重要文件。更疯狂的是,Android手机上的文件在一夜之间消失了,我们不知道为什么。我们感到非常遗憾和恼火,但不知道。但是,此时学习如何从Android手机恢复已删除的文件为时已晚&#xff0c…

Excel 取出每组最后一行

Excel的前两列是两层的分组列,后两列是明细 ABCD1CM11112CM12123CM13134CM14145CM25156CM26167BM11218BM12229BM232310AM113111AM323212AM333313AM3434 现在要取出每小组的最后一行: ABCD1CM14142CM26163BM12224BM23235AM11316AM3434 使用 SPL XLL sp…

拼多多商品详情商品标题sku等信息抓取接口API调用步骤演示

接口名称:item_get_app_pro 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_sho…

两台电脑怎么互传文件?这些方法你值得一试

在日常生活和工作中,我们经常需要在不同电脑之间传输文件,这可能是文档、照片、音乐或其他类型的文件。两台电脑怎么互传文件是非常有用的技能,可以提高工作效率并简化文件共享过程。本文将介绍三种常见的方法,帮助您了解如何在两…

先进制造aps专题十 aps项目成功指南

aps项目成功指南 为了保证aps项目的成功 现在国内的aps项目 一是看aps软件本身是不是实现了复杂的排程算法和优化算法,算法引擎使用c高性能编译语言开发,支持工序的复杂关系,考虑副资源约束和特殊规格约束,提供了能考虑各种约束…

2020职称继续教育--石化企业突发事件 应急管理及典型案例分析

单选题(共7题,每题5分) 1、生产经营单位应当在编制应急预案的基础上,针对工作场所、岗位的特点,编制简明、实用、有效的()。 A、应急处置卡 2、()快速响应的是世界一流企…

苹果手机怎么看海拔高度?快速掌握使用技巧

手机不仅能满足我们日常的通讯需求,还内置了许多实用的功能,其中包括查看海拔高度。无论是登山、徒步、骑行还是只是好奇地想要了解所在地的海拔高度,苹果手机都能够满足您的需求。苹果手机怎么看海拔高度?在本文中,我…

wps能打开caj文件吗?CAJ应该如何打开?caj转pdf

问题1:wps能打开caj文件吗? WPS不能直接打开CAJ文件。 CAJ是中国知网开发的一种文件格式,主要用于存储学术文献,需要使用专门的阅读器才能打开。 问题2:CAJ应该如何打开? 要打开CAJ文件,你可…

羧甲基纤维素钠(CMC-Na)市场规模不断增长 我国生产企业众多

羧甲基纤维素钠(CMC-Na)市场规模不断增长 我国生产企业众多 羧甲基纤维素钠(CMC-Na)又称CMC-钠,化学式为[C6H7O2(OH)2OCH2COONa]n,是一种离子型纤维素醚。CMC-Na外观呈白色颗粒状或纤…

【AIGC调研系列】LlamaFS-使用llama3操作文件夹

LlamaFS是一个基于Llama 3模型的自组织文件管理系统,旨在帮助用户自动重命名和组织电脑中的文件。它通过智能化的AI技术,能够根据文件内容和已知约定(例如时间)自动进行文件的重命名和分类整理[1][5][8]。 LlamaFS有两种运行模式…

柳宗元,政治坎坷与文学辉煌的交织

💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。 柳宗元,字子厚,生于唐代宗大历年间(公元773年),卒于唐宪宗元和年间(公元…

【全开源】在线题库微信小程序系统源码(ThinkPHP+FastAdmin+UniApp)

打造个性化学习平台 一、引言:在线学习的未来趋势 在数字化时代,线上学习已逐渐成为主流。随着移动互联网的普及,小程序以其轻便、快捷、无需安装的特点,成为用户日常学习的新选择。为了满足广大用户对于在线学习的需求&#xf…

光学测量反射率定标版

在光学测量和成像领域,准确性和一致性是至关重要的。为了确保设备能够提供可靠的数据,必须对其进行精确的校准。这就是反射率定标版发挥作用的地方。本文将深入探讨反射率定标版的概念、重要性、使用方式以及它们如何帮助科学家和工程师实现光学测量的精…

我们需要首席人工智能安全官 (CAISO)?

简介 人工智能(AI)已经迅速,不,爆炸性地从一个科幻概念转变为现代商业的基础支柱。麦肯锡最近的一份报告强调了生成式人工智能的兴起,报告显示,在公开亮相不到一年的时间里,三分之一的受访组织将生成式人工智能集成到…

LeetCode刷题之HOT100之最长回文串

2024/5/28 大家上午好啊,我又来做题了 1、题目描述 2、逻辑分析 题目要求找出最长的回文子串。我回去看了一下回文数字和回文链表这两道题。这个题目的思想其实跟以上两题也差不多,但是结合了最长子串这一概念。那么怎么解决这个题目呢?那么…