SQL关键字三分钟入门:WITH —— 公用表表达式让复杂查询更清晰

在实际的数据库开发和分析中,我们常常会遇到复杂的多层嵌套查询,这样的 SQL 语句不仅难以阅读,也容易出错。

这时候就需要使用一个非常实用又优雅的关键字 —— WITH

它可以帮助我们将复杂的子查询提取出来并命名,从而提升代码可读性、复用性和维护性。这个功能也被称为 CTE(Common Table Expressions,公用表表达式)


 1.什么是 WITH?

WITH 是 SQL 中用于定义临时结果集的关键字。这些临时结果集可以在后续查询中像普通表一样被引用,并且只在当前查询执行期间存在。

你可以把它理解为:“先写好一个中间结果,后面可以直接拿来用”。


 2.基本语法

WITH cte_name AS (-- 子查询内容SELECT ...
)
-- 后续主查询中使用 cte_name
SELECT * FROM cte_name;
  • cte_name 是你给中间结果集起的名字。
  • 可以定义多个 CTE,用逗号分隔。

 3.示例讲解

假设我们有一个 orders 表,记录了订单信息:

order_idcustomer_idamount
112999
22499
31199
43899

 示例1:计算每个客户的订单总金额(简单 CTE 使用)

WITH customer_totals AS (SELECT customer_id, SUM(amount) AS total_amountFROM ordersGROUP BY customer_id
)
SELECT *
FROM customer_totals
WHERE total_amount > 500;
结果:
customer_idtotal_amount
13198
3899

👉 这里我们先定义了一个 CTE customer_totals 来计算每位客户的总消费金额,然后主查询筛选出金额大于500的客户。


 示例2:多个 CTE 的使用(分步处理复杂逻辑)

WITH
-- 第一步:统计每位客户的总消费
customer_totals AS (SELECT customer_id, SUM(amount) AS total_amountFROM ordersGROUP BY customer_id
),
-- 第二步:根据总消费划分客户等级
customer_levels AS (SELECT customer_id, total_amount,CASEWHEN total_amount > 1000 THEN '高级客户'WHEN total_amount BETWEEN 500 AND 1000 THEN '中级客户'ELSE '普通客户'END AS levelFROM customer_totals
)
-- 最终查询:展示客户等级信息
SELECT * FROM customer_levels;
结果:
customer_idtotal_amountlevel
13198高级客户
2499普通客户
3899中级客户

 通过多个 CTE 分步骤处理,整个查询逻辑更加清晰易懂。


 示例3:递归 CTE(以员工层级为例)

递归 CTE 是 WITH 的一种高级用法,常用于处理树形结构或层级数据(如组织架构、分类目录等)。

假设我们有一个 employees 表:

employee_idnamemanager_id
1张三NULL
2李四1
3王五2
WITH RECURSIVE employee_hierarchy AS (-- 初始查询:没有上级的员工(即 CEO)SELECT employee_id, name, manager_id, CAST(name AS TEXT) AS hierarchy_pathFROM employeesWHERE manager_id IS NULLUNION ALL-- 递归部分:查找下属员工SELECT e.employee_id, e.name, e.manager_id,CAST(eh.hierarchy_path || ' → ' || e.name AS TEXT)FROM employees eINNER JOIN employee_hierarchy eh ON e.manager_id = eh.employee_id
)
SELECT * FROM employee_hierarchy;
结果:
employee_idnamemanager_idhierarchy_path
1张三NULL张三
2李四1张三 → 李四
3王五2张三 → 李四 → 王五

 这个例子展示了如何用递归 CTE 构建一个组织层级路径,非常适合处理树状结构数据。


对比项使用 WITH(CTE)不使用 CTE(嵌套子查询)
可读性更高,结构清晰较低,嵌套多层时难读
复用性可多次引用每次都要重复写
调试方便性易于单独测试每个 CTE难以调试嵌套部分
递归支持支持(RECURSIVE)不支持
性能与子查询基本一致,但逻辑优化后可能更好视具体实现而定

4. 总结对比表

功能SQL 示例
定义单个 CTEWITH cte AS (...) SELECT * FROM cte;
定义多个 CTEWITH a AS (...), b AS (...) SELECT * FROM a JOIN b...
递归 CTEWITH RECURSIVE ...
提高代码可读性将复杂查询拆分为多个逻辑块
支持重用同一查询中可多次引用 CTE 名

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

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

相关文章

要在 Linux 不联网服务器 上部署并运行 Gitee 上的 vue-vben-admin 项目,并且该项目使用的是 pnpm 管理依赖

目录 ✅ 目标:在不联网服务器中成功运行 vue-vben-admin 👉 你需要的最终环境: ✅ 场景:完全离线部署并运行开发/构建环境 🧱 步骤总览: 🛠 详细操作流程 ✅ 第 1 步:联网机器准…

中国风国潮通用PPT模版

中国风答辩总结汇报类通用PPT模版,古风PPT通用模版,国学精品PPT模版,中国风韵PPT模版 中国风国潮通用PPT模版:https://pan.quark.cn/s/59cea717fe8d

【nvidia-H100-ib排障实战2】:服务器 InfiniBand 网络性能问题深度分析

目录 InfiniBand 网络性能日志: 实际生产服务器 InfiniBand 网络性能问题深度分析 一、核心问题定位:mlx5_1 设备性能异常 二、问题详细分析 1. mlx5_1 设备异常原因推测 (1)硬件连接故障 (2)驱动或固件问题 (3)资源争用或配置错误 2. CPU 频率不一致问题 三…

Postgresql中不同数据类型的长度限制

目录 一、字符类型(Character Types) 二、二进制类型(Binary Types) 三、数值类型(Numeric Types) 四、其他类型 五、全局限制:单行数据总大小 示例对比表 注意事项 验证命令 在 Postgr…

Unity Hub 新建项目,启动 Unity 闪退的解决办法

问题: Win11: Unity 闪退,提示 Could not connect project 原因 这是 Firewall & network protection 在作怪,真的我感觉 Windows Defender 就从来没干过好事,那个遍地是病毒的年代微软你不搞个杀毒软件,现在…

学习打卡---回溯

回溯,所有回溯都可以转换成树形结构进行解决 我们将树形结构分为纵向和横向两个方面 递归是纵向循环,也就是纵向方面,到了叶子节点就收网回溯 循环是横向循环,也就是横向方面,到了数组末尾就结束 回溯属于是将二叉树的…

阿里云获取DASHSCOPE_API_KEY教程,以及配置DASHSCOPE_API_KEY环境变量

要获取阿里云的 DASHSCOPE_API_KEY(通义千问API密钥),需要在阿里云平台上完成开通服务和创建密钥的流程。以下是具体步骤: 1. 开通通义千问API服务 登录阿里云账号 访问 阿里云官网,使用账号密码或RAM用户登录。 进入…

《去哪儿网Redis高并发实战:从问题定位到架构升级》

去哪儿网Redis高并发实战:从问题定位到架构升级 在互联网行业竞争日益激烈的当下,高并发场景下的系统性能优化一直是技术团队面临的重要挑战。对于去哪儿网这类在线旅游平台来说,节假日期间的流量高峰更是对系统架构的严峻考验。本文将深入剖…

Zynq + FreeRTOS + YAFFS2 + SQLite3 集成指南

Zynq FreeRTOS YAFFS2 SQLite3 集成指南 一、系统架构设计 #mermaid-svg-qvuP6slyza89wsiT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qvuP6slyza89wsiT .error-icon{fill:#552222;}#mermaid-svg-qvuP6slyz…

设计模式精讲 Day 6:适配器模式(Adapter Pattern)

【设计模式精讲 Day 6】适配器模式(Adapter Pattern) 文章内容 在“设计模式精讲”系列的第6天,我们将深入讲解适配器模式(Adapter Pattern)。作为结构型设计模式之一,适配器模式的核心思想是将一个类的接…

系统稳定性治理

一、微服务内部异常 描述 微服务Pod自动重启表现:服务波动(响应时间不稳定)、监控指标异常(Pod重启次数增加,CPU/内存波动)、Kubernetes事件记录容器重启原因影响:服务中断、性能波动、资源消耗…

多智能体协同的力量:赋能AI安全报告系统的智能设计之道

“设想一个由‘数据采集者’、‘风险分析师’、‘报告撰写员’甚至‘合规监督员’组成的虚拟团队,它们如何携手打造一份深度洞察、精准预警的危化安全报告?这正是多智能体协作在AI安全领域的魅力所在。” 一、挑战升级:单一AI难以应对的复杂性…

ceph pg 卡在 active+clean+remapped 状态

场景 ceph 环境中有个 osd.0 做了 raid0 ,后来想剔除掉,执行了 ceph osd out 0 然后等了很长时间等 pg 数据迁移到别的 osd,但是最后有一个 pg 状态卡在了 active+clean+remapped 状态。如下: ceph pg ls-by-osd 0 PG OBJECTS DEGRADED MISPLACED UNFOUND BYTES …

systemd[1]: Failed to start LSB: Bring up/down networking

使用ssh连接虚拟机服务时,连接异常,虚拟机系统centos 7,于是登录虚拟机,查看服务ip,发现配置的静态ip未生效。因此重启网卡systemctl restart network,出现报错,使用systemctl status network查…

Go 语言使用 excelize 库操作 Excel 的方法

在笔者开发的项目中,有操作excel的需要,由于go操作excel比较方便且功能强大,于是选择使用go来操作excel。github.com/360EntSecGroup-Skylar/excelize库是一个功能强大且易于使用的库,它支持创建、读取和修改 Excel 文件&#xff…

Java基础(三):逻辑运算符详解

Java基础系列文章 Java基础(一):发展史、技术体系与JDK环境配置详解 Java基础(二):八种基本数据类型详解 Java基础(三):逻辑运算符详解 目录 一、什么是逻辑运算符?二、基础逻辑运算符(3种)1、&&…

Bugku-CTF-web

最近刷了一下 Bugku-CTF-web 的61-70题(平台目前只有67),好难好难,全都是知识的盲区。各种代码审计,各种反序列化,各种反弹shell,各种模版注入,各种字符串绕过,可以说是W…

GitLab 工具如何提升我的工作效率

在当今快节奏的软件开发和技术创作领域,作为一名博主,高效的工作流程和强大的协作工具至关重要。GitLab 作为一款集成了版本控制、项目管理、持续集成与持续部署(CI/CD)等功能于一体的平台,为我的工作带来了巨大的便利…

Unity Addressable使用之服务器远程加载

本地模拟服务器加载 1、创建一个Profiles,将Remote设为Editor Hosted 2、在Addressables Group窗口将Profile设为Local Test 3、将某个Asset Groups设为Remote加载 4、Build资源 5、打开本地模拟服务器 Addressables Hosting 窗口是 Addressable 提供的一个内置本…

Java基础八股文 - 面试者心理历程与标准答案

Java基础八股文 - 面试者心理历程与标准答案 前言:如何应对Java基础面试问题 面试Java基础时,很多候选人会因为紧张而忘记平时熟悉的知识点。本文将从面试者的心理历程出发,教你如何在面试中用自己的思路组织答案,然后给出标准回…