子查询在SQL中的应用和实践

作者:CSDN-川川菜鸟

在SQL中,子查询是一种强大的工具,用于解决复杂的数据查询问题。本文将深入探讨子查询的概念、类型、规则,并通过具体案例展示其在实际应用中的用途。

文章目录

    • 子查询概念
    • 子查询的类型
    • 子查询的规则
    • 实际案例分析
      • 员工部门数据查询
      • 子查询初阶
      • 子查询进阶应用
    • 结语

子查询概念

子查询,即嵌套查询,是在另一个查询内部执行的查询。它可以用于SELECT、INSERT、UPDATE和DELETE语句中,以及在WHERE和HAVING子句中。子查询通常用于执行比较操作和返回特定的值集。

子查询的类型

子查询可分为几种类型,根据返回的数据量和与外部查询的关系来区分:

  • 单行子查询:返回单个行的值。
  • 多行子查询:返回多行结果,适用于IN或ANY等操作符。
  • 关联子查询:引用外部查询的列,与外部查询有直接联系。

子查询的规则

  • 子查询必须用括号括起来。
  • 子查询可以有自己的 WHERE 子句。
  • 在 SELECT 子句中的子查询应该只返回一个字段。

实际案例分析

员工部门数据查询

假设我们有两个表:Employees和Departments,分别存储员工信息和部门信息。以下是创建这两个表的SQL命令及插入数据的示例:

Departments 表 - 存储部门信息。

CREATE TABLE `Departments` (
CREATE TABLE test.Department (DepartmentID INT PRIMARY KEY,DepartmentName VARCHAR(50)
);

Employee 表 - 存储员工信息,包括他们所属的部门。

CREATE TABLE test.Employee (EmployeeID INT PRIMARY KEY,Name VARCHAR(50),Salary DECIMAL(10, 2),DepartmentID INT,FOREIGN KEY (DepartmentID) REFERENCES Department(DepartmentID)
);

插入数据到部门表:

INSERT INTO test.Department (DepartmentID, DepartmentName) VALUES (1, 'Finance');
INSERT INTO test.Department (DepartmentID, DepartmentName) VALUES (2, 'HR');
INSERT INTO test.Department (DepartmentID, DepartmentName) VALUES (3, 'IT');

如下所示:
在这里插入图片描述

员工数据:

INSERT INTO test.Employee (EmployeeID, Name, Salary, DepartmentID) VALUES (1, 'Alice', 70000, 1);
INSERT INTO test.Employee (EmployeeID, Name, Salary, DepartmentID) VALUES (2, 'Bob', 48000, 2);
INSERT INTO test.Employee (EmployeeID, Name, Salary, DepartmentID) VALUES (3, 'Charlie', 50000, 1);
INSERT INTO test.Employee (EmployeeID, Name, Salary, DepartmentID) VALUES (4, 'David', 55000, 3);
INSERT INTO test.Employee (EmployeeID, Name, Salary, DepartmentID) VALUES (5, 'Eve', 75000, 1);

如下所示:
在这里插入图片描述

子查询初阶

我们希望找到薪水高于财务部门平均薪水的员工。

SELECT Name, Salary
FROM test.Employee
WHERE Salary > (SELECT AVG(Salary)FROM test.EmployeeWHERE DepartmentID = (SELECT DepartmentIDFROM test.DepartmentWHERE DepartmentName = 'Finance')
);
  • 外部查询:最外层查询找出所有薪水高于财务部门平均薪水的员工
  • 中间子查询:SELECT AVG(Salary) FROM Employees WHERE DepartmentID = (…) 使用内部子查询的结果来计算财务部门的平均薪水。
  • 内部子查询:SELECT DepartmentID FROM Departments WHERE DepartmentName = ‘Finance’ 查找财务部门的 ID。

分步骤实现解析如下:
1.首先查询财务部门的ID:

SELECT DepartmentID FROM Departments WHERE DepartmentName = 'Finance';

2.计算财务部门的平均薪水:

SELECT AVG(Salary) FROM Employee WHERE DepartmentID = [上一步的结果];

3.最终查询薪水高于财务部门平均薪水的员工:

SELECT Name, Salary FROM Employee WHERE Salary > [第二步的平均薪水];

这三个步骤可以合并为一个子查询:

SELECT Name, Salary
FROM Employee
WHERE Salary > (SELECT AVG(Salary)FROM EmployeeWHERE DepartmentID = (SELECT DepartmentIDFROM DepartmentsWHERE DepartmentName = 'Finance')
);

子查询进阶应用

假设我们现在想要找出在其部门中薪水高于该部门平均薪水的员工,同时这些员工的薪水还要高于公司整体的平均薪水。

1.计算公司整体的平均薪水:

SELECT AVG(Salary) FROM test.Employee;

2.为每个部门计算平均薪水

SELECT DepartmentID, AVG(Salary) AS AvgDepartmentSalary
FROM test.Employee
GROUP BY DepartmentID

3.结合上述两个查询,找出满足条件的员工:

SELECT e.Name, e.Salary, e.DepartmentID
FROM test.Employee e
WHERE e.Salary > (SELECT AVG(Salary) FROM test.Employee # 大于公司平均工资
) AND e.Salary > (SELECT AvgDepartmentSalaryFROM (# 计算每个部门平均工资SELECT DepartmentID, AVG(Salary) AS AvgDepartmentSalaryFROM test.EmployeeGROUP BY DepartmentID) AS DepartmentAvgWHERE e.DepartmentID = DepartmentAvg.DepartmentID
);

通过这些案例,我们可以看到子查询在处理复杂SQL查询中的强大功能和灵活性。掌握子查询的使用可以大大提高数据库查询的效率和效果。

结语

子查询是SQL中一项强大而灵活的功能,能够解决各种复杂的数据查询需求。通过对子查询的深入理解和应用,我们可以在数据库操作中实现更加精细和高效的数据处理。无论是简单的单行子查询还是复杂的关联子查询,它们都是数据库查询语言的重要组成部分,有助于提高我们在数据分析和管理方面的能力。

实际案例的探讨展示了子查询在实际应用中的强大作用,从基础的单表查询到更高级的多表联合查询。这不仅增强了我们对SQL的理解,而且提供了一种思维方式,帮助我们在面对复杂数据挑战时找到高效解决方案。

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

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

相关文章

Photoshop Elements 2023 v21.0(ps简化版)

Photoshop Elements 2023是一款ps简化版图像处理软件,它加入了一些新的功能和工具,以帮助用户更高效地处理图片。 新功能:软件加入了黑科技,采用Adobe Sensei AI技术,主打人工智能,一键P图,新增…

【C语言实现windows环境下Socket编程TCP/IP协议】

C语言实现windows环境下Socket编程TCP/IP协议 主要是记录解决一些在我本地编译运行时出现的问题connect :No error关于头文件关于stray /xxx和socket:No error问题千万记得是服务器先启动哦,客户端后启动下面附上我改好的代码 主要是记录解决…

Demystifying DeFi MEV Activities in Flashbots Bundle

目录 笔记后续的研究方向摘要引言贡献 Demystifying DeFi MEV Activities in Flashbots Bundle CCS 2023 笔记 本文介绍了对 Flashbots 捆绑包中的去中心化金融 (DeFi) 矿工可提取价值 (MEV) 活动的研究。作者开发了ActLifter&am…

文献速递:多模态影像组学文献分享(一种诊断方法结合了多模态放射组学和基于腰椎CT及X光的机器学习模型,用于骨质疏松症)

文献速递:多模态影像组学文献分享:(一种诊断方法结合了多模态放射组学和基于腰椎CT及X光的机器学习模型,用于骨质疏松症)** Title 题目 A diagnostic approach integrated multimodal radiomics with machine learning models based on lumbar spine CT…

Codeforces Round 913 (Div. 3) A~E

目录 A. Rook 问题分析: B. YetnotherrokenKeoard 问题分析: C. Removal of Unattractive Pairs 问题分析: D. Jumping Through Segments 问题分析: E. Good Triples 问题分析: A. Rook 问题分析: 给一个棋子将其同行同列的位置输出 #include<bits/s…

❀My学习Linux命令小记录(14)❀

目录 ❀My学习Linux命令小记录&#xff08;14&#xff09;❀ 56.man指令 57.whatis指令 58.info指令 59.--help指令 60.uname指令 ❀My学习Linux命令小记录&#xff08;14&#xff09;❀ 56.man指令 功能说明&#xff1a;查看Linux中的指令帮助。 &#xff08;ps.man命…

上门预约洗鞋店小程序

互联网洗鞋店小程序开发&#xff0c;结合洗鞋行业线下实际运营情况和经验&#xff0c;专为洗鞋人、洗鞋店打造的高效、实用、有价值的洗鞋私域流量管理软件系统。 帮助洗鞋人建立自己的私域流量&#xff0c;实现会员用户管理&#xff0c;用户与商家点对点互联互通&#xff0c;提…

工业级路由器在智能交通系统(ITS)中的创新应用

智能交通系统&#xff08;ITS&#xff09;作为一种先进的交通管理与控制系统&#xff0c;旨在提高交通运输系统的效率、安全性和便捷性。随着科技的不断发展&#xff0c;智能交通系统已经成为城市交通管理的重要组成部分。而工业级路由器作为一种可靠的网络通信设备&#xff0c…

微信小程序开发步骤及简单开发案例

开发步骤: 注册开发者账号:前往微信公众平台注册一个小程序开发者账号。创建小程序:登录小程序开发者工具,创建一个新的小程序项目,并填写小程序基本信息。配置开发环境:在小程序开发者工具中配置开发环境,包括开发者工具的设置、调试工具的设置等。设计小程序界面:根据…

SCAU:18051 勾股数

18051 勾股数 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC Description 若三个正整数a、b、c&#xff0c;其中a<b<c&#xff0c;满足a^2b^2c^2&#xff0c;其中^表示上标&#xff0c;称这三个数为“勾股数”&#xff0c;例…

python执行命令的方式

常见方法 Python中常用的执行操作系统命令有os.system()、os.popen()、commands、subprocess.popen()、subprocess.call()、subprocess.run()、subprocess.getstatusoutput()等方法。 os.system方法 这个方法是直接调用标准C的system() 函数&#xff0c;仅仅在一个子终端运行…

使用Python内置库实现数据的加密与校验

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 数据的安全性是现代应用程序中不可忽视的一个重要方面。在Python中&#xff0c;我们可以利用内置的加密和校验库来保护敏感信息。本文将深入讨论如何使用Python内置库实现数据的加密和校验&#xff0c;为开发者提…

favicon

所谓favicon&#xff0c;即Favorites Icon的缩写&#xff0c;顾名思义&#xff0c;便是其可以让浏览器的收藏夹中除显示相应的标题外&#xff0c;还以图标的方式区别不同的网站。当然&#xff0c;这不是Favicon的全部&#xff0c;根据浏览器的不同&#xff0c;Favicon显示也有所…

SQL Server 数据库,创建数据库并使用索引查询学员考试成绩

5.1索引 索引提供指针以指向存储在表中指定列的数据值&#xff0c;然后根据指定的次序排列这些指针&#xff0c;再跟随 指针到达包含该值的行。 5.1.1什么是索引 数据库中的索引与书籍中的目录类似。在一本书中&#xff0c;无须阅读整本书&#xff0c;利用目录就可以快速查 找…

『App自动化测试之Appium基础篇』| 从定义、原理、环境搭建、安装问题排查等深入了解Appium

『App自动化测试之Appium基础篇』| 从定义、原理、环境搭建、安装问题排查等深入了解Appium 1 关于Android UI自动化测试2 Appium简介3 Appium原理3.1 Android端过程3.2 iOS端过程 4 补充内容5 JDK下载6 JDK配置7 SDK下载8 SDK配置9 配置Android环境10 安装NodeJs11 解决node安…

今天刷basic

一 在kali里边链接这个服务器 ssh -p 25199 rootnode4.buuoj.cn 然后回车 yes 输入密码123456 ls查看发现什么都没有&#xff0c;cd ..返回上一级目录 ls 发现有flag.txt 查看文件得到flag flag{477f20d3-acd3-46e1-b50a-633e58b769c7}

Python中读写(解析)JSON文件的深入探究

目录 一、引言 二、如何读取JSON文件 三、如何写入JSON文件 四、如何解析JSON字符串 五、错误处理和异常处理 六、使用第三方库提高效率 七、总结 一、引言 在Python中&#xff0c;我们经常使用JSON&#xff08;JavaScript Object Notation&#xff09;格式来存储和传输…

计算机速成课Crash Course - 08. 指令和程序

今天开始计算机速成课Crash Course的系列讲解。 更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 08. 指令和程序 08. 指令和程序 上集我们把 ALU, 控制单元, RAM, 时钟…

基于Java SSM框架实现超市进销存购物商城管理系统项目【项目源码+论文说明】

基于java的SSM框架实现超市进销存购物商城管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;社区生活超市管理系统当然也不能排除在外。社区生活超市管理系统…

【QT】容器类的迭代

迭代器(iterator)为访问容器类里的数据项提供了统一的方法&#xff0c;Qt有两种迭代器类&#xff1a;Java类型的迭代器和STL类型的迭代器。 Java类型的迭代器更易于使用&#xff0c;且提供一些高级功能&#xff0c;而STL类型的迭代器效率更高。 Qt还提供一个关键字foreach&…