让SQL更优雅!深入浅出【公用表表达式(CTE)】语法及实战案例
全文目录:
- 开篇语
- 🌟 前言
- 📜 目录
- 💡 什么是CTE?
- 🎨 CTE的语法与结构
- 💥 使用场景:CTE何时更香?
- 🎬 CTE实战案例
- 案例1:统计每个部门的平均薪资
- 案例2:递归查询——公司架构层级
- 🧩 递归CTE:挑战升级
- 🛠️ CTE与子查询的比较
- 🚀 总结
- 文末
开篇语
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
🌟 前言
Hello,各位数据库玩家们!在SQL查询中,我们有时会写出长到让人窒息的查询语句,越往下读,脑子越容易变成一团浆糊……有没有想过,有没有更简洁、更优雅的方式来写出复杂查询?答案就是今天的主角:公用表表达式(CTE,Common Table Expressions)。如果你对SQL优化、可读性提升以及代码复用有兴趣,那就别走开,接下来我们一起探索CTE的魅力!🤩
📜 目录
- 💡 什么是CTE?
- 🎨 CTE的语法与结构
- 💥 使用场景:CTE何时更香?
- 🎬 CTE实战案例
- 🧩 递归CTE:挑战升级
- 🛠️ CTE与子查询的比较
- 🚀 总结
💡 什么是CTE?
公用表表达式(CTE)其实是SQL语句中的“临时表”,定义后可以在同一个查询中多次使用。相比传统子查询,CTE让代码更简洁、结构更清晰。CTE的出现就是为了提升SQL查询的可读性,特别是对于复杂查询场景,CTE简直是救世主!🙏
简而言之,CTE是SQL代码中的“局部变量”,你可以用它来暂时存储中间结果,就像在打游戏时暂存进度一样。
🎨 CTE的语法与结构
写CTE其实很简单,来个大体结构先:
WITH cte_name AS (-- 这里放查询逻辑SELECT column1, column2FROM your_tableWHERE conditions
)
SELECT * FROM cte_name;
基本语法分为三步:
- 使用关键字
WITH
引入CTE。 - 起个名字,比如
cte_name
,方便后续调用。 - 在CTE内写SQL查询,随后在主查询中使用。
是不是挺轻松?现在,让我们进入更有趣的实战环节吧!💪
💥 使用场景:CTE何时更香?
CTE非常适合以下场景:
- 多步查询的中间结果:如果查询逻辑复杂,有多步计算的需求,可以用CTE来清晰地表达每一步。
- 递归查询:想从某个父节点找到所有子节点?使用递归CTE非常合适。
- 代码复用:在一个查询中多次用到同一中间表时,CTE比子查询更直观。
小提示:CTE并不是性能优化的“灵丹妙药”,更多的是一种结构优化。所以有些场景下,CTE可能会提高性能,但更多时候,它的作用是提升代码的可读性。
🎬 CTE实战案例
案例1:统计每个部门的平均薪资
假设我们有一张员工表,包含员工姓名、部门ID和薪资信息。我们想统计每个部门的平均薪资,最基础的写法可能是这样的:
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;
不过,假设我们还想加入一些复杂的筛选条件和分组逻辑,这时可以使用CTE来优化代码的结构:
WITH department_avg AS (SELECT department_id, AVG(salary) AS avg_salaryFROM employeesGROUP BY department_id
)
SELECT d.department_id, e.employee_name, department_avg.avg_salary
FROM employees e
JOIN department_avg d ON e.department_id = d.department_id
WHERE e.salary > department_avg.avg_salary;
在这个例子中,我们先通过CTE计算出每个部门的平均薪资,再通过主查询对比员工的薪资是否高于部门平均值。这样分步骤编写,逻辑一目了然。🔍
案例2:递归查询——公司架构层级
递归CTE也是非常经典的应用场景。假设我们有一张表记录了员工与上级的关系(employee_id
、manager_id
)。如果我们想查看某个员工的所有上下级关系,就可以使用递归CTE来解决这个问题。
WITH RECURSIVE org_chart AS (SELECT employee_id, manager_id, 1 AS levelFROM employeesWHERE manager_id IS NULL -- 找到顶层管理者UNION ALLSELECT e.employee_id, e.manager_id, org_chart.level + 1FROM employees eINNER JOIN org_chart ON e.manager_id = org_chart.employee_id
)
SELECT * FROM org_chart;
这里的递归CTE通过自连接实现层级递归,将顶层管理者的所有下属关系输出。这个查询语句让人耳目一新,使用递归CTE后,复杂的上下级关系链条也变得很清晰。👨💼
🧩 递归CTE:挑战升级
递归CTE不仅能用来处理员工层级关系,还能应对例如路径分析、数列生成等场景。递归CTE的核心在于自我调用,但也要小心使用,避免形成“死循环”。
提示:递归CTE默认会有100层的递归限制,避免无限循环。使用时建议给递归CTE的层数设限,以提高查询的稳定性。
🛠️ CTE与子查询的比较
很多同学会问,CTE和子查询到底有啥不同?其实两者都能实现类似的效果,但在代码结构上,CTE往往更直观、易读。以下是两者的对比:
特点 | CTE | 子查询 |
---|---|---|
可读性 | 👍 易读 | 👎 略复杂 |
重用性 | 👍 可以在主查询多次调用 | 👎 通常只能使用一次 |
性能优化 | 👎 有时会增加性能开销 | 👍 有时更快 |
适用场景 | 复杂查询、递归查询 | 简单查询 |
📌 小贴士:如果查询比较简单,建议使用子查询;如果查询逻辑较复杂且需要复用中间结果,CTE则是更好的选择。
🚀 总结
CTE带来的不仅仅是SQL结构上的优化,更是一种“代码洁癖”式的编程体验。通过CTE,你的SQL查询代码会更加整洁、可读性更强。在合适的场景下使用CTE,代码不仅不会失去性能优势,反而更容易维护、优化。
在下次编写复杂SQL查询时,记得考虑CTE哦,它会帮你提升代码的美观度和可读性!希望这篇文章对你理解CTE有所帮助,祝大家写SQL越来越顺手!🖖
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
相关文章:
让SQL更优雅!深入浅出【公用表表达式(CTE)】语法及实战案例
全文目录: 开篇语🌟 前言📜 目录💡 什么是CTE?🎨 CTE的语法与结构💥 使用场景:CTE何时更香?🎬 CTE实战案例案例1:统计每个部门的平均薪资案例2&am…...
快递物流查询API接口如何用PHP调用
在现代商业中,供应链的协同运作至关重要。 快递物流查询API接口可以实现供应商、电商平台、物流企业和消费者之间的信息无缝对接,各方能够及时获取快递物流信息,从而更好地协调生产、销售和配送等环节,提高整个供应链的效率和效益…...

【vue2.0入门】vue基本语法
目录 引言一、页面动态插值1. 一般用法 二、计算属性computed三、动态class、style绑定四、条件渲染与列表渲染五、事件处理六、表单输入绑定七、总结 引言 本系列教程旨在帮助一些零基础的玩家快速上手前端开发。基于我自学的经验会删减部分使用频率不高的内容,并不…...

Dubbo使用Nacos作为注册中心
使用 Nacos 作为注册中心实现自动服务发现 本示例演示 Nacos 作为注册中心实现自动服务发现,示例基于 Spring Boot 应用展开,可在此查看 完整示例代码 1 基本配置 1.1 增加依赖 增加 dubbo、nacos-client 依赖: <dependencies><…...
【面试分享】xshell连接Linux服务器22端口执行命令top期间的技术细节和底层逻辑
通过SSH客户端(如Xshell)连接到服务器的22端口并执行top命令,涉及多个技术细节和底层逻辑。以下是对这一过程的详细解释: 一、技术细节 SSH协议: SSH(Secure Shell)是一种网络协议,…...

stm32以太网接口:MII和RMII
前言 使用stm32和lwip进行网络通信开发时,实现结构如下: 而MII和RMII就是stm32与PHY芯片之间的通信接口,类似于I2C、UART等。 stm32以太网模块有专用的DMA控制器,通过AHB接口将以太网内核和存储器相连。 数据发送时,…...
ChromeDriver 官方下载地址_测试自动化浏览器驱动
大家在做selenium自动化测试时,需要下载谷歌浏览器驱动,可以从以下官网地址下载 (1) ChromeDriver 下载地址1 http://chromedriver.storage.googleapis.com/index.html 这个地址最后版本到 114.0.5735.90 (2&#…...

力扣 LeetCode 206. 反转链表(Day2:链表)
解题思路: pre ,cur双指针 需要通过tmp暂存cur的下一个位置,以方便cur的下一步移动 class Solution {public ListNode reverseList(ListNode head) {ListNode pre null;ListNode cur head;while (cur ! null) {ListNode tmp cur.next;c…...
kafka消费数据太慢了,给优化下
原代码 public class KafkaConsumerDemo {public static void main(String[] args) {int numConsumers 5; // 增加消费者的数量for (int i 0; i < numConsumers; i) {new Thread(new KafkaConsumerThread()).start();}}static class KafkaConsumerThread implements Runn…...

ASUS/华硕灵耀X双屏Pro UX8402Z 原厂Win11-22H2系统 工厂文件 带ASUS Recovery恢复
华硕工厂文件恢复系统 ,安装结束后带隐藏分区,一键恢复,以及机器所有驱动软件。 系统版本:windows11 原厂系统下载网址:http://www.bioxt.cn 需准备一个20G以上u盘进行恢复 请注意:仅支持以上型号专用…...

【含开题报告+文档+PPT+源码】基于springboot的毕业设计选题管理系统
开题报告 毕业设计选题作为高校教学环节中的重要一环,其选题质量和管理效率直接关系到学生毕业设计的质量和毕业要求的达成。然而,传统的选题管理方式往往存在信息不对称、流程繁琐、效率低下等问题,无法满足高校教学管理现代化、信息化的需…...
fastadmin常用操作
数据库中遇到的操作 查询字段是json的某个值 $map[json_extract(goods, "$.brand_id")] (int)$params[brand_id]; //获取数据库中某个字段是json中得某个值,进行查询,goods是表中字段,brand_id是json中要查詢的字段。数据类型一定…...

IPguard与Ping32:谁是企业数据防泄密的最佳选择?
在当前信息化快速发展的背景下,企业数据安全已成为公司运营中最重要的议题之一。为了防止数据泄漏,越来越多的企业开始依赖专业的加密软件来进行防护。今天,我们对比了两款业内领先的加密软件——IPguard和Ping32,帮助您选择最适合…...
C++20新特性的补充讲解
C20 标志着 C 语言的一次重要更新,除了 Concepts、Ranges、协程等被广泛讨论的特性外,还有许多值得注意的改进。本文将详细探讨其他一些核心新特性,包括 constexpr 扩展、新增的 std::format、std::span、std::bit 操作、原子智能指针、char8…...

uni-app移动端与PC端兼容预览PDF文件
过程遇到的问题 1、如果用的是最新的版本的pdfjs的话,就会报Promise.withResolvers 不是一个方法的错误,原因是Promise.withResolvers是ES15新特性,想了解可参考链接,这里的解决方案是将插件里的涉及到Promise.withResolvers的地…...
Elman 神经网络算法详解
Elman 神经网络算法详解 一、引言 Elman 神经网络作为一种经典的递归神经网络(RNN),在处理动态系统和时间序列数据方面具有独特的优势。它通过特殊的结构设计,能够有效地捕捉数据中的时间依赖关系,在语音识别、自然语…...
卓胜微嵌入式面试题及参考答案(2万字长文)
freeRTOS 任务是怎么调度的? 在 freeRTOS 中,任务调度主要是基于优先级的抢占式调度。每个任务都有一个优先级,系统会根据任务的优先级来决定哪个任务获得 CPU 的使用权。 当一个高优先级的任务准备运行,并且当前运行的任务优先级较低时,高优先级任务会抢占 CPU。例如,假…...

【Python】爬虫使用代理IP
1、代理池 IP 代理池可以理解为一个池子,里面装了很多代理IP。 池子里的IP是有生命周期的,它们将被定期验证,其中失效的将被从池子里面剔除池子里的ip是有补充渠道的,会有新的代理ip不断被加入池子中池子中的代理ip是可以被随机…...

金融机构-业务架构方案(高光版)
一、金融机构的设计架构 首先视角很重要,比如这样的战略视角,站得高、看得远。设计业务架构,一定要有战略高度和前瞻性。 二、什么样的架构更适合你们公司呢? 三、从架构着手,进行产品和服务创新性变革 四、具体如何设计业务架构呢?...
ubuntu内核切换network unclaimed 网卡丢失
现象一、 查网络的时候 提示只有lo network unclaimed wifi 本地局域网全部丢失 显卡丢失 解决思路 首先查看了 网卡类型 sudo lshw -C network 会显示使用的网卡 然后把这个网卡 去到realtek的官网去找驱动 驱动下下来发现debug提示 没有build目录 /libs/modules/6.8…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...