揭秘SQL中的公用表表达式:数据查询的新宠儿

news2024/11/15 10:32:32

欢迎来到我的博客,代码的世界里,每一行都是一个故事


在这里插入图片描述

揭秘SQL中的公用表表达式:数据查询的新宠儿

    • 前言
    • 公用表表述的概述
    • 非递归CTE的作用
    • 递归CTE的作用
    • CTE性能优化

前言

你是否曾经为SQL查询的复杂性而困扰不已?尤其是那些读写层子查询、难以理解和的代码。公用表维护表达式(CTE)的出现,为解决这些问题提供了优雅的解决方案。无论是简化查询逻辑,还是实现分布式查询,CTE都可以让你的SQL查询变得更加简洁和高效。让我们一起探索CTE的神奇世界,发现它如何让数据查询变得如此简单而强大!

公用表表述的概述

公用表表达式(Common Table Expression,CTE)是一种临时命名的结果集,它可以在一个查询中定义,并且在该查询的后续部分中被引用。CTE提供了一种更清晰、更模块化的查询结构,比传统的子查询更易于阅读和维护。

与子查询相比,CTE的优势在于:

  1. 可读性更强: CTE可以在查询中以类似于表的方式命名,并且可以在查询的后续部分中多次引用,使得查询结构更加清晰易读。

  2. 代码重用性: 由于CTE可以在查询中多次引用,因此可以在复杂查询中重用相同的逻辑,减少重复编写代码的工作量。

  3. 性能优化: 数据库优化器可以更好地优化CTE,以提高查询性能,尤其是在涉及到递归查询时。

CTE的基本语法结构如下:

WITH cte_name (column1, column2, ...) AS (
    -- CTE查询定义
    SELECT column1, column2, ...
    FROM table_name
    WHERE condition
)
-- 主查询
SELECT *
FROM cte_name;

其中,cte_name是CTE的名称,可以在主查询中引用;(column1, column2, ...)是可选的列名列表,用于为CTE中的列指定别名;SELECT语句是CTE的查询定义,用于生成结果集。

在主查询中,可以使用SELECT语句引用定义的CTE,并将其视为一个临时的虚拟表。

非递归CTE的作用

非递归的公用表表达式(CTE)可以用于简化复杂查询,特别是在涉及多个表和复杂逻辑的情况下。下面是一个示例,演示如何使用CTE简化查询部门员工信息的操作:

假设我们有两个表:departments(部门信息)和employees(员工信息),它们之间通过部门ID进行关联。

首先,我们可以使用CTE定义一个简单的查询,以获取每个部门的员工数量:

WITH department_employee_count AS (
    SELECT d.department_name, COUNT(e.employee_id) AS employee_count
    FROM departments d
    LEFT JOIN employees e ON d.department_id = e.department_id
    GROUP BY d.department_name
)
SELECT * FROM department_employee_count;

在这个CTE中,我们通过LEFT JOIN连接departmentsemployees表,并对每个部门进行分组计数,得到每个部门的员工数量。

接下来,我们可以使用另一个CTE来获取每个部门的平均工资:

WITH department_average_salary AS (
    SELECT d.department_name, AVG(e.salary) AS average_salary
    FROM departments d
    LEFT JOIN employees e ON d.department_id = e.department_id
    GROUP BY d.department_name
)
SELECT * FROM department_average_salary;

在这个CTE中,我们再次使用LEFT JOIN连接departmentsemployees表,并对每个部门计算平均工资。

最后,我们可以使用这些CTE来执行更复杂的查询,例如获取每个部门的员工数量和平均工资:

WITH 
department_employee_count AS (
    SELECT d.department_name, COUNT(e.employee_id) AS employee_count
    FROM departments d
    LEFT JOIN employees e ON d.department_id = e.department_id
    GROUP BY d.department_name
),
department_average_salary AS (
    SELECT d.department_name, AVG(e.salary) AS average_salary
    FROM departments d
    LEFT JOIN employees e ON d.department_id = e.department_id
    GROUP BY d.department_name
)
SELECT dec.department_name, dec.employee_count, das.average_salary
FROM department_employee_count dec
JOIN department_average_salary das ON dec.department_name = das.department_name;

在这个复杂的查询中,我们将两个CTE联合起来,并使用JOIN操作来获取每个部门的员工数量和平均工资。这样,我们就能够在不重复编写代码的情况下,获取所需的部门员工信息,并且可以更轻松地理解和维护查询逻辑。

递归CTE的作用

递归公用表表达式(CTE)是一种特殊类型的CTE,它允许在查询内部递归引用自己,从而解决一些复杂的层次结构查询问题,比如组织结构中的下属员工。

下面是一个示例,演示如何使用递归CTE计算组织结构中的所有下属员工:

假设我们有一个employees表,其中包含员工的ID、姓名和直接上级的ID。我们想要查找每个员工的所有下属。

首先,我们定义一个递归CTE来获取每个员工及其直接下属的信息:

WITH RECURSIVE subordinates AS (
    SELECT employee_id, employee_name, manager_id
    FROM employees
    WHERE manager_id IS NULL -- 查找顶级员工(没有上级)
    UNION ALL
    SELECT e.employee_id, e.employee_name, e.manager_id
    FROM employees e
    INNER JOIN subordinates s ON e.manager_id = s.employee_id
)
SELECT * FROM subordinates;

在这个递归CTE中,我们首先选择所有顶级员工(没有上级的员工),并将它们作为初始结果集。然后,我们使用UNION ALL连接当前结果集和它们的直接下属,直到没有更多的下属为止。

通过这个递归CTE,我们可以获取每个员工的所有下属信息,包括直接下属、间接下属、间接下属的下属,以此类推。这样,我们就能够构建出完整的组织结构,帮助我们更好地理解员工之间的关系。

CTE性能优化

在处理大数据集时,使用递归公用表表达式(CTE)可能会导致性能问题,特别是在递归深度较大或数据量较大的情况下。以下是一些优化CTE查询的技巧和建议:

  1. 限制递归深度: 在定义递归CTE时,尽量限制递归的深度,避免无限递归。可以通过设置递归终止条件或使用MAXRECURSION选项来限制递归次数。

  2. 索引支持: 确保表中的相关列(如递归关系的连接列)上存在适当的索引,以提高查询性能。索引可以加速递归过程中的连接操作。

  3. 避免重复计算: 尽量避免在递归过程中重复计算相同的数据。可以使用临时表或缓存机制存储中间结果,以减少重复计算的开销。

  4. 分页处理: 如果可能的话,考虑将递归查询分成多个较小的批次进行处理,而不是一次性处理整个数据集。这样可以减少内存和资源的消耗。

  5. 使用合适的数据类型: 在定义CTE时,尽量使用合适的数据类型来减少内存消耗和计算开销。避免使用过大或过小的数据类型。

  6. 定期优化: 对于频繁使用的递归CTE查询,定期进行性能优化和调整是很重要的。通过监控查询性能并根据需要进行调整,可以有效提高查询效率。

综上所述,优化CTE查询的性能需要综合考虑递归深度、索引支持、重复计算、分页处理、数据类型和定期优化等因素。通过合理设计查询和持续优化,可以有效提高CTE查询在大数据集上的性能表现。

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

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

相关文章

数据结构(一)顺序表

目录 一、概念(一)数据结构的三元素1. 逻辑结构(1)线性结构(2)非线性结构 2. 存储结构(1)顺序存储(2)链式存储(3)索引存储 3. 运算 &a…

douyin-vue:使用Vue3、Pinia和Vite5打造高度还原的抖音仿制项目

一:引言 在前端技术日新月异的今天,Vue.js作为一款流行的前端框架,不断吸引着开发者的目光。最近,GitHub上出现了一个备受瞩目的项目——douyin-vue,这是一个基于Vue3、Pinia和Vite5的移动端短视频项目,旨…

CCF20220301——未初始化警告

CCF20220301——未初始化警告 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; #define Max 100000 int x[Max]{0},y[Max]{0}; int main() {int n,k;int cnt1,flag0;cin>>n>>k;for(int i1;i<k;i)cin>>x[i]>>y[i];for(in…

Linux命令 jps(Java Process Status)解释

文章目录 1、第一种解释2、第二种解释3、第三种解释 1、第一种解释 jps 命令本身并不是一个标准的 Unix/Linux 命令&#xff0c;但您可能是想提到 jps 的一个变种或误写了 jps 为 jps&#xff0c;而实际上可能是想提及 jps&#xff08;Java Virtual Machine Process Status To…

虚拟化概述

虚拟存储器(Virtual Memory) 它的基本思想是对于一个程序来说,它的程序(code)、数据(data)和堆栈(stack)的总大小可以超过实际物理内存的大小&#xff1b;操作系统把当前使用的部分内容放到物理内存中&#xff0c;而把其他未使用的内容放到更下一级存储器&#xff0c;如硬盘&a…

通过 coze 快速构建自己的智能体机器人

通过 coze 快速构建自己的智能体机器人 coze 的使用 一&#xff09;coze 是什么 「Coze 扣子」AI Bot 开发平台。任何用户都可以快速、低门槛地搭建自己的 Chatbot&#xff0c;且平台支持用户将其一键发布到飞书、微信公众号、豆包等渠道。 二&#xff09;coze 怎么注册 1. …

安卓ADB通过WIFI无线连接手机[通过无线安装APK]

安卓ADB通过无线连接手机 本文摘录于&#xff1a;https://www.cnblogs.com/zhuxibo/p/14261117.html只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 别人给的操作确实可行,我这里实操记录如下: AdministratorpiaoranPC MINGW64 /e/Wor…

AI RAG的知识满天飞,为什么你还做不出一个像样的AI助手应用

引言 在过去的一年半里&#xff0c;随着大型语言模型&#xff08;LLM&#xff09;的崛起&#xff0c;检索增强生成&#xff08;RAG&#xff09;的概念也逐渐进入公众视野。 从微信公众号到各大自媒体&#xff0c;关于RAG的讨论几乎无处不在。然而&#xff0c;尽管这些高科技名…

小苯的排列构造,小苯的01背包(easy),小苯的01背包(hard)

小苯的排列构造 题目描述 运行代码 #include<bits/stdc.h> using namespace std; typedef long long ll; #define N 1000050 int i,j,k,n,m,t,a[N],b[N],f[N],l[N]; bool v[N]; int main(){cin>>n;for(i1;i<n;i)cin>>a[i];v[0]1;for(i1;i<n;i){if(a[…

apexcharts数据可视化之极坐标区域图

apexcharts数据可视化之极坐标区域图 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式&#xff1a; 基础极坐标区域图单色极坐标区域图 基础极坐标区域图 import ApexChart from react-apexcharts;export function BasicPolar() {// 数据序列const series…

Ubuntu/Linux 安装Paraview

文章目录 0. 卸载已有ParaView1. 安装ParaView1.1 下载后安装 2.进入opt文件夹改名3. 更改启动项4. 创建硬链接5. 添加桌面启动方式6. 即可使用 0. 卸载已有ParaView YUT 1. 安装ParaView https://www.paraview.org/ 1.1 下载后安装 找到下载的文件夹&#xff0c;文件夹内…

[JAVASE] String类 StringBuffer类 StringBuilder类

目录 一.String类 1.1 String字符串不可变的原因 1.2 字符串中的比较方法 1.2.1 equals 1.2.2 compareTo 与 compareToIgnoreCase 1.3 字符串中的查找方法 1.3.1 charAt 1.3.2 indexOf 与 lastIndexOf 1.4 字符串中的转换方法 1.4.1 valueOf 1.4.2 toUpperCase 与 to…

【PMP必考点】2024年PMP敏捷知识必考点-工件篇

PMP自2023年8月起启动了PMBOK第七版教材&#xff0c;考试内容的侧重点也发生了改变&#xff1a;大幅增加了敏捷相关的内容。以往考纲只有不到10%的敏捷管理的内容&#xff0c;新考纲的敏捷管理题目增加至50%。所以如果复习只用之前的题目是远远不够的&#xff0c;必须要多刷新考…

el-tabs中的下拉框被覆盖解决方法

解决方法&#xff1a; ::v-deep .el-tabs__content{// overflow:hidden 会导致 分页下拉框超出部分会被.el-tabs__content隐藏overflow: visible; }

JEPaaS 低代码平台 accessToTeanantInfo SQL注入漏洞复现

0x01 产品简介 JEPaaS低代码开发平台开源版 旨在帮助企业快速实现信息化和数字化转型。该平台基于可视化开发环境,让软件开发人员和业务用户通过直观的可视化界面来构建应用程序 ,而不是传统的编写代码方式。 用户可以在开发平台灵活各个图形化控件,以构建业务流程、逻辑和…

Linux基础学习笔记

目录 1、Linux安装 1.1 安装教程 1.2 Linux目录结构 2、Linux常用命令 2.1 ls 2.2 命令分类 2.3 目录处理命令 2.4 操作文件命令 2.5 查找文件命令 2.6 ln链接命令 2.7 进程相关命令 ​编辑3、配置网络 3.1 关闭windows防火墙 3.2 配置好虚拟机的局域网 3.3 配置…

[数据集][目标检测]红外兔子检测数据集VOC+YOLO格式96张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;96 标注数量(xml文件个数)&#xff1a;96 标注数量(txt文件个数)&#xff1a;96 标注类别数…

【Linux】常见命令:fping的介绍和用法举例

一、fping命令的安装 在终端中输入如下命令&#xff08;Ubuntu系统使用apt install&#xff0c;CentOS系统使用yum install&#xff09; sudo apt install fping安装效果&#xff08;截图&#xff09;&#xff1a; 二、fping命令的用法和选项 fping命令用于检测主机是否存在…

01 Nginx安装部署(系列篇)

一、安装部署 1、Nginx的发行版本 常用版本分为四大阵营&#xff1a; Nginx 开源版 | https://nginx.org/&#xff1a;赤裸裸的Web服务器、反向代理、负载均衡&#xff08;功能少&#xff0c;开发难度大&#xff09; Nginx Plus 商业版 | https://www.nginx.com/&#xff1a;…

当今世界三个最厉害的人物颜廷利:全球最受欢迎的点赞第一人

我们生活在一个历史的拐点&#xff0c;一个要求我们重新构思自我、解读世界以及预见未来的时代。在这个时代&#xff0c;那些能够洞悉社会发展的深层逻辑&#xff0c;并据此提出全新定义的人&#xff0c;将成为引领人类思维、塑造普遍价值观和主导全球发展议程的先锋。因此&…