子查询在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的理解,而且提供了一种思维方式,帮助我们在面对复杂数据挑战时找到高效解决方案。
相关文章:

子查询在SQL中的应用和实践
作者:CSDN-川川菜鸟 在SQL中,子查询是一种强大的工具,用于解决复杂的数据查询问题。本文将深入探讨子查询的概念、类型、规则,并通过具体案例展示其在实际应用中的用途。 文章目录 子查询概念子查询的类型子查询的规则实际案例分析…...

C# Socket通信从入门到精通(14)——多个异步UDP客户端C#代码实现
前言: 在之前的文章C# Socket通信从入门到精通(13)——单个异步UDP客户端C#代码实现我介绍了单个异步Udp客户端的c#代码实现,但是有的时候,我们需要连接多个服务器,并且对于每个服务器,我们都有一些比如异步发送、异步接收的操作,那么这时候我们使用之前单个异步Udp客…...

【教3妹学编程-算法题】需要添加的硬币的最小数量
3妹:2哥2哥,你有没有看到新闻, 有人中了2.2亿彩票大奖! 2哥 : 看到了,2.2亿啊, 一生一世也花不完。 3妹:为啥我就中不了呢,不开心呀不开心。 2哥 : 得了吧,你又不买彩票&…...

【异常解决】SpringBoot + Maven 在 idea 下启动报错 Unable to start embedded Tomcat(已解决)
Unable to start embedded Tomcat(已解决) 一、背景介绍二、原因分析2.1 网络上整理2.2 其他原因 三、解决方案 一、背景介绍 spring boot(v2.5.14) maven idea 启动项目 之前项目一直启动的好好的,都能正常运行。重启的时候突然就不能启…...

做题总结 707. 设计链表
做题总结 707. 设计链表 leetcode中单链表节点的默认定义我的尝试正确运行的代码(java) leetcode中单链表节点的默认定义 class ListNode {int val;ListNode next;//无参public ListNode() {}//有参:1public ListNode(int val) {this.val val;}//有参:…...
django实现--视图的使用
在 Django 中,视图是处理 Web 请求并返回 Web 响应的组件。Django 提供了两种主要类型的视图:基于函数的视图和基于类的视图。下面详细解释基于类的视图的实现方法、使用以及与基于函数的视图的异同。 基于类的视图的实现方法 继承 Django 的类视图基类…...

【dirty cred】fileManager [XXX]
前言 这应该不是个题,应该是佬为了测试 dirty cred 利用写的。但是环境有问题,测试最多只能向文件中写入 1024MB 的数据。所以竞争窗口太短了,但是似乎替换 credential obj 又是成功的了。感觉是环境的问题。 漏洞分析与利用 一次任意释放…...
线程按顺序循环执行
不瞒大家说,这是之前参加阿里一面的手写编程题,平时不刷题,这个当时花的时间比较多,虽然最后用了很喽比方法写出来了,自己还是很不满意。下面实话也是看了其他大佬的思路,今天重新练了下。 假设有3个线程,依次打印A、B、C,按顺序循环打印100次。 这个其实是线程通信,…...

C# 使用异步委托获取线程返回值
写在前面 异步委托主要用于解决 ThreadPool.QueueUserWorkItem 没有提供获取线程执行完成后的返回值问题。异步委托只能在.Net Framework 框架下使用,.Net Core中会报平台错误,而且使用Task.Result来获取返回值,可以达成同样的目的ÿ…...

生鲜蔬果展示预约小程序作用是什么
线下生鲜蔬果店非常多,对商家来说主要以同城生意为主,而在互联网电商的发展下,更多的商家会选择搭建私域商城进行多渠道的销售卖货和拓展,当然除了直接卖货外,还有产品纯展示或预约订购等需求。 但无论哪种模式&#…...

【C++】类与对象(下)
本文目录 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字 2. static成员2.1 概念2.2 特性 3. 友元3.1 友元函数3.2 友元类 4. 内部类5. 匿名对象6. 拷贝对象时的一些编译器优化7. 再次理解类和对象 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&am…...
一文了解 Go 方法
前言 在前面的 一文熟悉 Go 函数 文章中,介绍了 Go 函数的声明,函数的几种形式如匿名函数、闭包、基于函数的自定义类型和函数参数详解等,而本文将对方法进行介绍,方法的本质就是函数,介绍方法的同时也会顺带对比其与函…...

【Docker】vxlan的原理与实验
VXLAN(Virtual eXtensible Local Area Network,虚拟可扩展局域网),是一种虚拟化隧道通信技术。它是一种Overlay(覆盖网络)技术,通过三层的网络来搭建虚拟的二层网络。 VXLAN介绍 VXLAN是在底层…...

广度(宽度)优先搜素——层层递进
分析算法及题目 完整代码实现 广度优先搜索(Breadth-First Search,BFS)是一种图和树的遍历算法,与深度优先搜索相对应。BFS从起始节点开始,首先访问起始节点,然后逐层地访问其邻居节点,直到达到…...

设计模式——建造者模式(创建型)
引言 生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。 问题 假设有这样一个复杂对象, 在对其进行构造时需要对诸多成员变量和嵌套对象进行繁复的初始化工作。 这些初始化代码…...
getopt --- C 风格的命令行选项解析器
源代码: Lib/getopt.py 备注 getopt 模块是一个命令行选项解析器,其 API 设计会让 C getopt() 函数的用户感到熟悉。 不熟悉 C getopt() 函数或者希望写更少代码并获得更完善帮助和错误消息的用户应当考虑改用 argparse 模块。 此模块可协助脚本解析 sys.argv 中的…...
Mysql大数据量删除
Mysql大数据量删除 在一些操作中,可能需要清理一下积压的数据,如果数据量小的话自然没有问题,但是如果是个大数据量的问题,那么就该考虑一个合适的办法了。 在清理大数据量的时候需要考虑是清理部分数据还是清理所有数据…...
【python中类的介绍】
python中类的介绍 在Python中,定义类需要使用关键字 class类名通常使用大写字母开头,举例: class MyClass:pass解释:定义了一个MyClass的空类。 1、python中类定义 “”" 类中可以定义属性和方法。 1、属性是类的数据成…...

PO模式在selenium自动化测试框架有什么好处
PO模式是在UI自动化测试过程当中使用非常频繁的一种设计模式,使用这种模式后,可以有效的提升代码的复用能力,并且让自动化测试代码维护起来更加方便。 PO模式的全称叫page object model(POM),有时候叫做 p…...

智能优化算法应用:基于斑马算法无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于斑马算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于斑马算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.斑马算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...

云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
2025.6.9总结(利与弊)
凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...