深入理解 SQL 中的子查询

文章目录

  • 一、什么是子查询
  • 二、子查询的基本语法
  • 三、数据准备
  • 四、子查询的分类
    • 4.1 标量子查询
    • 4.2 单行子查询
    • 4.3 多行子查询
    • 4.4 关联子查询
  • 五、子查询的应用场景
    • 5.1 子查询与 WHERE 子句
    • 5.2 子查询与 SELECT 子句
    • 5.3 子查询与 FROM 子句
  • 六、性能优化与注意事项

本文将深入探讨 SQL 中子查询的基本用法、不同类型的子查询及其应用场景。

一、什么是子查询

子查询,也称为嵌套查询,是指将一个查询语句嵌套在另一个查询语句中,作为外部查询的一部分。子查询通常用来返回一个值、一个结果集,或者多个值供外部查询使用。

例如,下面的查询会在内层查询中获取 employee 表中最高薪水的员工,然后外层查询会根据这个薪水过滤出薪水高于该值的员工:

SELECT name, salary 
FROM employee
WHERE salary > (SELECT MAX(salary) FROM employee);

二、子查询的基本语法

SELECT column1, column2
FROM table1
WHERE column3 IN (SELECT column3 FROM table2 WHERE condition);

在上面的示例中:
外部查询从 table1 中选择数据。
内部查询从 table2 中选择数据,返回的结果供外部查询的 WHERE 子句使用。

三、数据准备

  • employee 表(员工信息表)
    在这里插入图片描述
  • department 表(部门信息表)
    在这里插入图片描述

四、子查询的分类

4.1 标量子查询

标量子查询是指返回单个值的子查询。它通常出现在 SELECT、WHERE 或 HAVING 子句中。标量子查询只返回一个列、一个值。

示例:
查询所有员工的名字和他们部门的名称(部门名称是通过标量子查询得到的):

SELECT name, (SELECT department_name FROM department WHERE department_id = e.department_id) AS department_name
FROM employee e;

结果:
在这里插入图片描述

在此查询中,内层查询返回了每个员工所在部门的名称,外层查询通过使用该值来显示员工及其部门名称。

4.2 单行子查询

单行子查询是指返回一行数据的子查询。通常用于在 WHERE 或 HAVING 子句中进行比较操作。

示例:
查询 employee 表中薪水最高的员工信息:

SELECT name, salary
FROM employee
WHERE salary = (SELECT MAX(salary) FROM employee);

结果:
在这里插入图片描述

这里的子查询返回了薪水的最大值,并用于外部查询进行比较。

4.3 多行子查询

多行子查询是指返回多行数据的子查询。通常用于与 IN、ANY 或 ALL 操作符一起使用。

示例:
查询所有工资高于某一部门中最低工资的员工:

SELECT name, salary
FROM employee
WHERE salary > (SELECT MIN(salary) FROM employee WHERE department_id = 1);

结果:
在这里插入图片描述

在这个例子中,子查询返回了 department_id = 3 部门的最低工资,而外部查询返回了所有工资高于该值的员工。

4.4 关联子查询

关联子查询是指内层查询使用了外层查询中的字段,通常出现在 FROM 或 WHERE 子句中。这种子查询通常能根据外层查询的数据进行动态筛选。

示例:
查询部门中薪水高于该部门平均薪水的员工:

SELECT e.name, e.salary
FROM employee e
WHERE e.salary > (SELECT AVG(salary) FROM employee WHERE department_id = e.department_id);

结果:
在这里插入图片描述

在这个查询中,内层查询是根据外层查询中每个员工的 department_id 来计算该部门的平均薪水,从而筛选出薪水高于该平均值的员工。

五、子查询的应用场景

5.1 子查询与 WHERE 子句

子查询常常用来在 WHERE 子句中限制结果。例如,查询 employee 表中工资高于某一部门中最低工资的所有员工:

SELECT name, salary
FROM employee
WHERE salary > (SELECT MIN(salary) FROM employeeWHERE department_id = 3);

5.2 子查询与 SELECT 子句

子查询也可以出现在 SELECT 子句中,用于选择计算或聚合的结果。例如,查询每个员工的名字以及所在部门的平均薪水:

SELECT name, (SELECT AVG(salary) FROM employee WHERE department_id = e.department_id) AS department_avg_salary
FROM employee e;

5.3 子查询与 FROM 子句

子查询还可以作为表使用,即放在 FROM 子句中。此时,子查询的结果集充当外层查询的表。

示例:
查询每个部门的员工数量:

SELECT department_id, COUNT(*)
FROM (SELECT DISTINCT department_id FROM employee) AS department_list
GROUP BY department_id;

结果:
在这里插入图片描述

在此示例中,内层子查询首先返回了所有不同的 department_id,外层查询则对其进行分组并计算每个部门的员工数量。

六、性能优化与注意事项

  • 避免不必要的嵌套查询: 子查询可能会影响性能,特别是当子查询返回大量数据时。尽量避免不必要的多层嵌套查询,考虑使用 JOIN 操作来替代。
  • 使用 EXISTS 替代 IN: 如果子查询返回大量数据,使用 EXISTS 可能比 IN 更有效。EXISTS 通常在判断是否存在某个条件时效率更高。
  • 索引: 子查询在查询过程中可能会多次执行,建议对相关字段创建索引,以提高查询性能。
  • 避免大量数据的返回: 如果子查询的数据量非常大,考虑分页或限制返回的行数,避免造成性能问题。

子查询的使用不仅使得查询更简洁,同时也增强了 SQL 查询的表达能力,是进行数据处理时不可或缺的工具。
在这里插入图片描述

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

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

相关文章

Zookeeper入门部署(单点与集群)

本篇文章基于docker方式部署zookeeper集群,请先安装docker 目录 1. docker初期准备 2.启动zookeeper 2.1 单点部署 2.2 集群部署 3. Linux脚本实现快速切换启动关闭 1. docker初期准备 拉取zookeeper镜像 docker pull zookeeper:3.5.6 如果拉取时间过长&#xf…

【SpringBoot教程】Spring Boot + MySQL + HikariCP 连接池整合教程

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 在前面一篇文章中毛毛张介绍了SpringBoot中数据源与数据库连接池相关概念,今天毛毛张要分享的是关于SpringBoot整合HicariCP连接池相关知识点以及底层源码…

SCRM在企业私域流量与客户管理中的变革之路探索

内容概要 在当今数字化高速发展的时代,SCRM(社交客户关系管理)作为一种新的管理工具,正逐渐成为企业私域流量管理和客户关系维护的重要基石。它不仅仅是一种软件工具,更是一种整合客户数据和关系管理的全新思维方式。…

实战 | 域环境下通过anydesk进入生产网

视频教程在我主页简介或专栏里 目录: 前言 外网突破 资产扫描与常规漏洞 经典的MS17010漏洞利用: 网络通信设备弱口令: 安全防护设备集群: 域环境渗透 核心生产网渗透 总结 教程下载链接:zkanzz 话不多说&#x…

卡特兰数学习

1,概念 卡特兰数(英语:Catalan number),又称卡塔兰数,明安图数。是组合数学中一种常出现于各种计数问题中的数列。它在不同的计数问题中频繁出现。 2,公式 卡特兰数的递推公式为:f(…

算法刷题Day28:BM66 最长公共子串

题目链接,点击跳转 题目描述: 解题思路: 方法一:暴力枚举 遍历str1的每个字符x,并在str2中寻找以相同元素x为起始的最长字符串。记录最长的公共子串及其长度。 代码实现: def LCS(self, str1: str, st…

Open FPV VTX开源之ardupilot双OSD配置摄像头

Open FPV VTX开源之ardupilot双OSD配置 1 源由2. 分析3. 配置4. 解决办法5. 参考资料 1 源由 鉴于笔者这台Mark4 Copter已经具备一定的历史,目前机载了两个FPV摄像头: 模拟摄像头数字摄像头(OpenIPC) 测试场景: 从稳定性的角度&#xff1…

【Super Tilemap Editor使用详解】(十六):高级主题:深入理解 Super Tilemap Editor

在本节中,我们将深入探讨 Super Tilemap Editor 的工作原理,特别是图块地图(Tilemap)的渲染机制以及如何优化性能。这些知识将帮助你更好地理解工具的内部机制,并在开发中做出更明智的决策。 一、图块地图与图块渲染 图块地图是 Super Tilemap Editor 的核心组件之一。它由…

01学习预热篇(D6_正式踏入JVM深入学习前的铺垫)

目录 学习前言 一、虚拟机的结构 1. Java虚拟机参数设置 2. java 堆 3. 出入栈 4. 局部变量表 1> 局部变量的剖析 2> 局部变量的回收 5. 操作数栈 1> 常量入栈指令 2> 局部变量值转载到栈中指令 3> 将栈顶值保存到局部变量中指令 6. 帧数据区 7. 栈…

Node.js下载安装及环境配置教程 (详细版)

Node.js:是一个基于 Chrome V8 引擎的 JavaScript 运行时,用于构建可扩展的网络应用程序。Node.js 使用事件驱动、非阻塞 I/O 模型,使其非常适合构建实时应用程序。 Node.js 提供了一种轻量、高效、可扩展的方式来构建网络应用程序&#xff0…

SimpleFOC STM32教程10|基于STM32F103+CubeMX,速度闭环控制(有电流环)

导言 SimpleFOC STM32教程09|基于STM32F103CubeMX,ADC采样相电流 如上图所示, 增加了电流环. 效果如下: 20250123-200906 RTT 如上图所示,三相占空比依然是马鞍波。当我用手去给电机施加阻力时,PID要维持目标转速&am…

【超详细】ELK实现日志采集(日志文件、springboot服务项目)进行实时日志采集上报

本文章介绍,Logstash进行自动采集服务器日志文件,并手把手教你如何在springboot项目中配置logstash进行日志自动上报与日志自定义格式输出给logstash。kibana如何进行配置索引模式,可以在kibana中看到采集到的日志 日志流程 logfile-> l…

DeepSeek-R1:强化学习驱动的推理模型

1月20日晚,DeepSeek正式发布了全新的推理模型DeepSeek-R1,引起了人工智能领域的广泛关注。该模型在数学、代码生成等高复杂度任务上表现出色,性能对标OpenAI的o1正式版。同时,DeepSeek宣布将DeepSeek-R1以及相关技术报告全面开源。…

李沐vscode配置+github管理+FFmpeg视频搬运+百度API添加翻译字幕

终端输入nvidia-smi查看cuda版本 我的是12.5,在网上没有找到12.5的torch,就安装12.1的。torch,torchvision,torchaudio版本以及python版本要对应 参考:https://blog.csdn.net/FengHanI/article/details/135116114 创…

炫酷JavaScript文本时钟

今天分享一段简单的 JS 代码,创意来自aem1k.com/qlock ,可以将整段 JS 代码字符本身变成时钟,每秒以 HH:MM:SS 的格式显示当前的时间。 JS逻辑实现代码本身也是时钟展示的载体,通过给字符设置不同的高亮颜色来显示当前的时间&…

前端jquery 实现文本框输入出现自动补全提示功能

git仓库:web_study/some-demos/inputAutoFit at main Cong0925/web_study (github.com) 压缩包:已绑定到指定资源 示例图: 实现说明: 1.首先,html部分设置好相关的定位标签如图: 2.主要函数 3.默认数据

Python3 OS模块中的文件/目录方法说明十二

一. 简介 前面文章简单学习了 Python3 中 OS模块中的文件/目录的部分函数。 本文继续来学习 OS 模块中文件、目录的操作方法:rename() 方法与 renames()方法。 二. Python3 OS模块中的文件/目录方法 1. rename() 方法 rename() 方法用于重命名文件或目录。它还可…

【Uniapp-Vue3】StorageSync数据缓存API

一、存储本地数据 uni.setStorageSync("键名", 键值); 二、获取本地数据 uni.getStorageSync("键名"); 也可以同时获取所有存储的数据的键名: uin.getStorageInfoSync(); 三、删除本地数据 uni.removeStorageSync("键名"); 如果想要…

2. Java-MarkDown文件解析-工具类

2. Java-MarkDown文件解析-工具类 1. 思路 读取markdown文件的内容&#xff0c;根据markdown的语法进行各个类型语法的解析。引入工具类 commonmark 和 commonmark-ext-gfm-tables进行markdown语法解析。 2. 工具类 pom.xml <!-- commonmark 解析markdown --> <d…

【Pytest】生成html报告中,中文乱码问题解决方案

import pytestif __name__ "__main__":# 只运行 tests 目录下的测试用例&#xff0c;并生成 HTML 报告pytest.main([-v, -s, --htmlreport.html, tests])可以以上方式生成&#xff0c;也可以在pytest.ini中设置 [pytest] addopts --htmlreport.html --self-contai…