使用 WITH 语句和临时表

文章目录

    • WITH 语句和临时表
    • 员工部门案例(单个 WITH 查询)
      • 建表:
      • 写入数据:
      • 使用WITH查询
    • 扩展案例:员工、部门、薪水和级别(多个 WITH 查询)
      • 建表和插入数据:
      • 使用多个WITH查询
    • 结语

WITH 语句和临时表

在 SQL 中,WITH 语句用于创建临时结果集,该结果集在整个 SQL 查询过程中都可使用。这种结构被称为公用表表达式(Common Table Expression,简称 CTE),特别适用于处理复杂的查询。通过 CTE,可以将复杂查询拆分为更小、更易管理的部分。

员工部门案例(单个 WITH 查询)

考虑这样一个场景:我们有两个表——员工表 (employees) 和部门表 (departments)。员工表记录了员工的 ID、姓名及其所属的部门 ID,而部门表则包含部门的 ID 和名称。

建表:

CREATE TABLE test.departments (department_id INT PRIMARY KEY,department_name VARCHAR(50)
);CREATE TABLE test.employees (employee_id INT PRIMARY KEY,employee_name VARCHAR(50),department_id INT,FOREIGN KEY (department_id) REFERENCES departments(department_id)
);

写入数据:

-- 向部门表中添加数据
INSERT INTO test.departments (department_id, department_name) VALUES
(1, 'IT'),
(2, 'HR'),
(3, 'Finance');-- 向员工表中添加数据
INSERT INTO test.employees (employee_id, employee_name, department_id) VALUES
(101, 'Alice', 1),
(102, 'Bob', 1),
(103, 'Charlie', 2),
(104, 'David', 3);

使用WITH查询

现在,假设我们想要一个报告,列出每个部门及其员工数。我们可以使用WITH语句来帮助我们组织查询:


WITH DepartmentSummary AS (SELECT department_id, COUNT(*) AS employee_countFROM test.employeesGROUP BY department_id
)
SELECT d.department_name, ds.employee_count
FROM DepartmentSummary ds
JOIN tets.departments d ON ds.department_id = d.department_id;
;

扩展案例:员工、部门、薪水和级别(多个 WITH 查询)

  • 员工表 (employees): 包含员工ID、姓名、部门ID。
  • 部门表 (departments): 包含部门ID和部门名。
  • 薪水表 (salaries): 包含员工ID和薪水。
  • 级别表 (levels): 包含员工ID和级别(例如:经理、高级员工等

建表和插入数据:

CREATE TABLE test.salaries (employee_id INT,salary INT,FOREIGN KEY (employee_id) REFERENCES employees(employee_id)
);CREATE TABLE test.levels (employee_id INT,level VARCHAR(50),FOREIGN KEY (employee_id) REFERENCES employees(employee_id)
);-- 向薪水表和级别表中添加数据
INSERT INTO test.salaries (employee_id, salary) VALUES
(101, 70000),
(102, 80000),
(103, 50000),
(104, 60000);INSERT INTO test.levels (employee_id, level) VALUES
(101, 'Senior'),
(102, 'Junior'),
(103, 'Senior'),
(104, 'Manager');

使用多个WITH查询

现在,我们要生成一个报告,显示每个部门的平均薪水和每个级别的员工数量。我们将使用两个临时表来实现这一点:

WITH DepartmentSalary AS (SELECT d.department_id, AVG(s.salary) AS average_salaryFROM test.employees eJOIN test.salaries s ON e.employee_id = s.employee_idJOIN test.departments d ON e.department_id = d.department_idGROUP BY d.department_id
),
LevelCount AS (SELECT l.level, COUNT(*) AS countFROM test.employees eJOIN test.levels l ON e.employee_id = l.employee_idGROUP BY l.level
)
SELECT d.department_name, ds.average_salary, lc.level, lc.count
FROM DepartmentSalary ds
JOIN test.departments d ON ds.department_id = d.department_id
CROSS JOIN LevelCount lc;

在这个查询中:

  • DepartmentSalary 临时表计算每个部门的平均薪水。
  • LevelCount 临时表计算每个级别的员工数。
  • 最后的查询将这两个临时表与部门表进行连接,并使用CROSS JOIN来展示所有可能的部门和级别组合,以及对应的平均薪水和员工数。

结语

在总结以上内容时,我们可以看到 WITH 语句在 SQL 中的强大作用,特别是在处理复杂的数据查询和报告生成时。通过使用公用表表达式 (CTE),我们不仅可以提高查询的可读性和维护性,还可以有效地组织和简化复杂的查询逻辑。无论是在处理基础的员工部门数据,还是在进行更复杂的多表查询,如员工、部门、薪水和级别的案例中,WITH 语句都展现了其灵活性和效能。正如这些示例所展示的,掌握这些高级 SQL 技巧将大大增强数据处理和分析的能力,对任何数据库专业人士或数据分析师都是宝贵的资产。

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

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

相关文章

python入门级简易教程

Python是一种高级编程语言,由Guido van Rossum于1991年创建。它是一种通用的、解释型的、高级的、动态的、面向对象的编程语言。 Python的编程哲学是简洁明了,强调代码的可读性和简洁性,使开发人员能够快速开发出正确的代码。Python被广泛用…

Chart 5 性能优化概述

文章目录 前言5.1 可移植性5.2 优化梗概5.3 OpenCL 移植的初始评估5.4 将CPU代码移植到OpenCL GPU5.5 并行化GPU和CPU工作负载5.6 瓶颈分析5.6.1 识别瓶颈5.6.2 解决瓶颈 5.7 API层面性能优化5.7.1 API函数调用的正确安排5.7.2 使用基于事件驱动的pipeline5.7.3 内核编译和构建…

2023-12-04 AIGC-Stable Diffusion和SadTalker-搭建及使用

摘要: 2023-12-04 AIGC-SadTalker-搭建及使用 代码仓库: https://github.com/Stability-AI/stablediffusion https://github.com/camenduru/stable-diffusion-webui-colab https://github.com/OpenTalker/SadTalker https://github.com/adofsauron/SadTalker-Video-Lip-Sync 文…

0基础学习云计算难吗?

很多人经常会问云计算是什么?云计算能干什么?学习云计算能做什么工作?其实我们有很多人并不知道云计算是什么,小知今天来给大家讲讲学习云计算能做什么。 中国的云计算行业目前正处于快速发展阶段,随着互联网和数字化…

人脸识别安卓主板_MTK方案智能闸机门禁工业安卓主板定制开发

人脸识别主板广泛应用于各个领域,包括人脸支付系统、人脸识别监控系统、写字楼办公楼门禁闸机、校园、地铁、住宅门禁、考勤机、智能门锁、广告机、售卖机等。 主板基于联发科MTK方案,并由行业PCBA和MTK的核心板组成。根据产品需求,可以选择…

7、类型转换构造、析构、深拷贝、类的静态成员

1、类型转换构造 |自定义转换 利用一个已定义的对象,来定义另一个不同类型的对象 实现从源类型到目标类型的隐式类型转换的目的 总结下已知构造,包括类型转换构造 如下,如果Person给Human赋值时,Person有私有变量,则需要在Pers…

浅聊JAVA开发下环境部署与使用工具的安装与部署

Java开发环境的部署涉及到安装Java Development Kit(JDK)、配置系统环境变量、选择一个集成开发环境(IDE)等步骤。以下是一般情况下的Java开发环境部署步骤: 安装Java Development Kit (JDK): 访问 Oracle JDK下载页面…

qt creator配置opencv库 (MSVC版本)

目录 1. MSVC版本 1.1 使用cmake编译opencv 1.2 再使用visual studio 2019生成opencv的lib,dll 1.3 配置opencv的系统环境变量 1.4 新建qt项目 1. MSVC版本 1.1 使用cmake编译opencv 1.2 再使用visual studio 2019生成opencv的lib,dll 1.3 配置opencv的系统环境变量 D:…

Educational Codeforces Round 159 (Div. 2) A~E

A.Binary lmbalance(思维) 题意: 给出一个01字符串,你可以对字符串进行无限次下列操作: 选择一个位置 i ( 1 ≤ i ≤ ∣ s ∣ − 1 , |s|为字符串s的长度 ) i(1 \le i \le |s| - 1,\text{|s|为字符串s的长度}) i(1≤…

深度学习实战66-基于计算机视觉的自动驾驶技术,利用YOLOP模型实现车辆区域检测框、可行驶区域和车道线分割图

大家好,我是微学AI,今天给大家介绍一下深度学习实战66-基于计算机视觉的自动驾驶技术,利用YOLOP模型实现车辆区域检测框、可行驶区域和车道线分割图。本文我将介绍自动驾驶技术及其应用场景,并重点阐述了基于计算机视觉技术下的自动驾驶。自动驾驶技术是一种利用人工智能和…

Linux报too many open files的解决方案及 lsof、sysctl 命令介绍

Too many open files in system 问题处理 服务器异常: 一串的etc下的shell文件报 /etc/profile.d/bash_completion.sh: Too many open files in system 查看当前操作系统允许打开的文件数 # 用户级查看: ulimit -n # 系统级查看: cat /pro…

Java实现屏幕截图程序(二)

本文是继Java实现屏幕截图程序(一)之后进行加工的,主要逻辑是依靠javafx界面进行屏幕范围选择和截图图片显示,在日常工作中较为适用,下面把代码分享给大家。 以下是JavaFX实现的简单选择界面截图程序代码: 屏幕拖动监听器,截图后的界面可拖动就靠它: import javafx.e…

LeetCode刷题--- 计算布尔二叉树的值

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏:http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的 我讲述…

cache教程1.LRU 缓存淘汰策略

这一节实现LRU算法,要理解明白其使用的数据结构。 FIFO/LFU/LRU 算法简介 Cache的缓存全部存储在内存中,内存是有限的,因此不可能无限制地添加数据。当占用内存超过了给定的内存大小时候,就需要从缓存中移除一条或多条数据了。我…

计算机网络(二)| 物理层上 | 数据通信基础知识 调制 频率范围 信噪比

文章目录 1 物理层基本概念2.数据通信基础知识2.1 数据通信基本概念2.2 信道基本概念2.2.1 基带调制(编码)方式2.2.2 带通调制方式 2.3 信道的极限速率影响因素2.3.1 **频率范围**2.3.2 **信噪比** 内容笔记来源于谢希任老师《计算机网络》 物理层重点 …

Xilinx FPGA平台DDR3设计详解(三):DDR3 介绍

本文介绍一下常用的存储芯片DDR3,包括DDR3的芯片型号识别、DDR3芯片命名、DDR3的基本结构等知识,为后续掌握FPGA DDR3的读写控制打下坚实基础。 一、DDR3芯片型​号 电路板上的镁光DDR3芯片上没有具体的型号名。 ​如果想知道具体的DDR3芯片型号&#…

rename--一些例子与问题

指令 A 和指令 B之间存在先写后读(RAW)的相关性 指令 B 的源寄存器 r0 来自于指令 A 产生的结果因此在进行寄存器重命名的时候,指令 B 的 r0 对应的物理寄存器应该直接来自于指令A所对应的P30,而不应该来自于从RAT读取的值。指令A,B,D之间存在先写后写(WAW)的相关性…

阿里云效部署前后端

静态站点到OSS 阿里云-云效,阿里云企业级一站式 DevOps,可以免费使用(会限制人数、流水线数量等,个人项目够用了)。相关文章 CI 持续集成 - 阿里云云效 OSS 是对象存储的意思,一般一个项目对应一个 Bucke…

20231202年江西省“振兴杯”网络信息行业(信息安全测试员)职业技能竞赛

C1-xor chall.py from flag import flagdef encrypt(x, y):keyzxbresultfor i in range(len(x)):resultchr(ord(x[i])^ord(y[i])^ord(key[i%3]))return result x flag y flag[1:] flag[0]enc open(flag.enc, wb) enc.write(encrypt(x, y)) enc.close()简单的异或&#xf…

一个小问题

用paddle的paddleOCR的时候,需要修改部分代码,但是直接Python xx.py不能运行,需要用paddle自己的命令行方式运行,感觉很麻烦啊。 另外工作上遇到像这样的小问题,应不应该去问同事呢,感觉这个问题比较简单但…