当前位置: 首页 > news >正文

让SQL更优雅!深入浅出【公用表表达式(CTE)】语法及实战案例

全文目录:

    • 开篇语
    • 🌟 前言
    • 📜 目录
    • 💡 什么是CTE?
    • 🎨 CTE的语法与结构
    • 💥 使用场景:CTE何时更香?
    • 🎬 CTE实战案例
      • 案例1:统计每个部门的平均薪资
      • 案例2:递归查询——公司架构层级
    • 🧩 递归CTE:挑战升级
    • 🛠️ CTE与子查询的比较
    • 🚀 总结
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

🌟 前言

Hello,各位数据库玩家们!在SQL查询中,我们有时会写出长到让人窒息的查询语句,越往下读,脑子越容易变成一团浆糊……有没有想过,有没有更简洁、更优雅的方式来写出复杂查询?答案就是今天的主角:公用表表达式(CTE,Common Table Expressions)。如果你对SQL优化、可读性提升以及代码复用有兴趣,那就别走开,接下来我们一起探索CTE的魅力!🤩

📜 目录

  1. 💡 什么是CTE?
  2. 🎨 CTE的语法与结构
  3. 💥 使用场景:CTE何时更香?
  4. 🎬 CTE实战案例
  5. 🧩 递归CTE:挑战升级
  6. 🛠️ CTE与子查询的比较
  7. 🚀 总结

💡 什么是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;

基本语法分为三步:

  1. 使用关键字WITH引入CTE。
  2. 起个名字,比如cte_name,方便后续调用。
  3. 在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_idmanager_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 作为注册中心实现自动服务发现&#xff0c;示例基于 Spring Boot 应用展开&#xff0c;可在此查看 完整示例代码 1 基本配置 1.1 增加依赖 增加 dubbo、nacos-client 依赖&#xff1a; <dependencies><…...

【面试分享】xshell连接Linux服务器22端口执行命令top期间的技术细节和底层逻辑

通过SSH客户端&#xff08;如Xshell&#xff09;连接到服务器的22端口并执行top命令&#xff0c;涉及多个技术细节和底层逻辑。以下是对这一过程的详细解释&#xff1a; 一、技术细节 SSH协议&#xff1a; SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;…...

stm32以太网接口:MII和RMII

前言 使用stm32和lwip进行网络通信开发时&#xff0c;实现结构如下&#xff1a; 而MII和RMII就是stm32与PHY芯片之间的通信接口&#xff0c;类似于I2C、UART等。 stm32以太网模块有专用的DMA控制器&#xff0c;通过AHB接口将以太网内核和存储器相连。 数据发送时&#xff0c;…...

ChromeDriver 官方下载地址_测试自动化浏览器驱动

大家在做selenium自动化测试时&#xff0c;需要下载谷歌浏览器驱动&#xff0c;可以从以下官网地址下载 &#xff08;1&#xff09; ChromeDriver 下载地址1 http://chromedriver.storage.googleapis.com/index.html 这个地址最后版本到 114.0.5735.90 &#xff08;2&#…...

力扣 LeetCode 206. 反转链表(Day2:链表)

解题思路&#xff1a; pre &#xff0c;cur双指针 需要通过tmp暂存cur的下一个位置&#xff0c;以方便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恢复

华硕工厂文件恢复系统 &#xff0c;安装结束后带隐藏分区&#xff0c;一键恢复&#xff0c;以及机器所有驱动软件。 系统版本&#xff1a;windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 需准备一个20G以上u盘进行恢复 请注意&#xff1a;仅支持以上型号专用…...

【含开题报告+文档+PPT+源码】基于springboot的毕业设计选题管理系统

开题报告 毕业设计选题作为高校教学环节中的重要一环&#xff0c;其选题质量和管理效率直接关系到学生毕业设计的质量和毕业要求的达成。然而&#xff0c;传统的选题管理方式往往存在信息不对称、流程繁琐、效率低下等问题&#xff0c;无法满足高校教学管理现代化、信息化的需…...

fastadmin常用操作

数据库中遇到的操作 查询字段是json的某个值 $map[json_extract(goods, "$.brand_id")] (int)$params[brand_id]; //获取数据库中某个字段是json中得某个值&#xff0c;进行查询&#xff0c;goods是表中字段&#xff0c;brand_id是json中要查詢的字段。数据类型一定…...

IPguard与Ping32:谁是企业数据防泄密的最佳选择?

在当前信息化快速发展的背景下&#xff0c;企业数据安全已成为公司运营中最重要的议题之一。为了防止数据泄漏&#xff0c;越来越多的企业开始依赖专业的加密软件来进行防护。今天&#xff0c;我们对比了两款业内领先的加密软件——IPguard和Ping32&#xff0c;帮助您选择最适合…...

C++20新特性的补充讲解

C20 标志着 C 语言的一次重要更新&#xff0c;除了 Concepts、Ranges、协程等被广泛讨论的特性外&#xff0c;还有许多值得注意的改进。本文将详细探讨其他一些核心新特性&#xff0c;包括 constexpr 扩展、新增的 std::format、std::span、std::bit 操作、原子智能指针、char8…...

uni-app移动端与PC端兼容预览PDF文件

过程遇到的问题 1、如果用的是最新的版本的pdfjs的话&#xff0c;就会报Promise.withResolvers 不是一个方法的错误&#xff0c;原因是Promise.withResolvers是ES15新特性&#xff0c;想了解可参考链接&#xff0c;这里的解决方案是将插件里的涉及到Promise.withResolvers的地…...

Elman 神经网络算法详解

Elman 神经网络算法详解 一、引言 Elman 神经网络作为一种经典的递归神经网络&#xff08;RNN&#xff09;&#xff0c;在处理动态系统和时间序列数据方面具有独特的优势。它通过特殊的结构设计&#xff0c;能够有效地捕捉数据中的时间依赖关系&#xff0c;在语音识别、自然语…...

卓胜微嵌入式面试题及参考答案(2万字长文)

freeRTOS 任务是怎么调度的? 在 freeRTOS 中,任务调度主要是基于优先级的抢占式调度。每个任务都有一个优先级,系统会根据任务的优先级来决定哪个任务获得 CPU 的使用权。 当一个高优先级的任务准备运行,并且当前运行的任务优先级较低时,高优先级任务会抢占 CPU。例如,假…...

【Python】爬虫使用代理IP

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

金融机构-业务架构方案(高光版)

一、金融机构的设计架构 首先视角很重要,比如这样的战略视角,站得高、看得远。设计业务架构,一定要有战略高度和前瞻性。 二、什么样的架构更适合你们公司呢? 三、从架构着手,进行产品和服务创新性变革 四、具体如何设计业务架构呢?...

ubuntu内核切换network unclaimed 网卡丢失

现象一、 查网络的时候 提示只有lo network unclaimed wifi 本地局域网全部丢失 显卡丢失 解决思路 首先查看了 网卡类型 sudo lshw -C network 会显示使用的网卡 然后把这个网卡 去到realtek的官网去找驱动 驱动下下来发现debug提示 没有build目录 /libs/modules/6.8…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...

Oracle实用参考(13)——Oracle for Linux物理DG环境搭建(2)

13.2. Oracle for Linux物理DG环境搭建 Oracle 数据库的DataGuard技术方案,业界也称为DG,其在数据库高可用、容灾及负载分离等方面,都有着非常广泛的应用,对此,前面相关章节已做过较为详尽的讲解,此处不再赘述。 需要说明的是, DG方案又分为物理DG和逻辑DG,两者的搭建…...

在MobaXterm 打开图形工具firefox

目录 1.安装 X 服务器软件 2.服务器端配置 3.客户端配置 4.安装并打开 Firefox 1.安装 X 服务器软件 Centos系统 # CentOS/RHEL 7 及之前&#xff08;YUM&#xff09; sudo yum install xorg-x11-server-Xorg xorg-x11-xinit xorg-x11-utils mesa-libEGL mesa-libGL mesa-…...