【重学 MySQL】四十一、子查询举例与分类

【重学 MySQL】四十一、子查询举例与分类

  • 引入子查询
    • 在SELECT子句中引入子查询
    • 在FROM子句中引入子查询
    • 在WHERE子句中引入子查询
    • 注意事项
  • 子查询分类
    • 标量子查询
    • 列子查询
    • 行子查询
    • 表子查询
  • 子查询注意事项
    • 子查询的位置
    • 子查询的返回类型
    • 别名的使用
    • 性能考虑
    • 相关性
    • 错误处理
    • 逻辑清晰
  • 总结

在这里插入图片描述

在MySQL中,子查询是一种嵌套在其他查询中的查询,它可以出现在SELECT、FROM、WHERE等子句中,为外部查询提供数据或条件。

引入子查询

在MySQL中,引入子查询通常是为了解决一些复杂的查询需求,这些需求可能无法直接通过简单的SELECT、FROM、WHERE等语句组合来实现。子查询允许你在一个查询内部嵌套另一个查询,从而可以基于内部查询的结果来过滤或计算外部查询的数据。

子查询可以在SQL语句的多个部分中引入,但最常见的位置是SELECT子句、FROM子句和WHERE子句。

在SELECT子句中引入子查询

子查询可以用在SELECT子句中作为列的一部分,返回单个值或多个值(但通常作为单个值使用,并可能需要聚合函数)。

SELECT employee_id, name, (SELECT AVG(salary) FROM employees) AS avg_salary
FROM employees;

这个例子中,子查询计算了所有员工的平均工资,并将其作为avg_salary列返回给每个员工。

在FROM子句中引入子查询

子查询也可以作为FROM子句的一部分,将子查询的结果视为一个临时表(或内联视图),然后可以在外部查询中对其进行进一步的操作。

SELECT *
FROM (SELECT employee_id, MAX(salary) AS max_salaryFROM employeesGROUP BY department_id
) AS max_salaries
WHERE max_salary > 50000;

这个例子中,子查询首先按部门分组并找出每个部门的最高工资,然后外部查询从这个临时表中选择工资高于50000的记录。

在WHERE子句中引入子查询

子查询在WHERE子句中非常常见,用于提供过滤条件。

SELECT *
FROM employees
WHERE salary > (SELECT AVG(salary)FROM employeesWHERE department_id = 1
);

这个例子中,子查询计算了部门ID为1的员工的平均工资,然后外部查询选择了工资高于这个平均值的所有员工。

注意事项

  • 性能:子查询可能会影响查询的性能,特别是当子查询返回大量数据时。在可能的情况下,考虑使用JOIN操作或其他优化技术。
  • 可读性:复杂的子查询可能会降低SQL语句的可读性。在编写复杂的查询时,考虑使用CTE(公共表表达式)或临时表来分解查询逻辑。
  • 逻辑清晰:确保子查询的逻辑清晰、明确,并且与外部查询的逻辑一致。
  • 错误处理:注意处理子查询中可能出现的错误,如除零错误、空值(NULL)处理等。

通过合理引入子查询,你可以解决许多复杂的查询问题,但也要注意避免过度使用,以免降低查询性能或增加维护难度。

子查询分类

子查询按照返回结果集的不同,可以分为四种类型:标量子查询、列子查询、行子查询和表子查询。

标量子查询

定义:标量子查询返回的结果集是一个标量值,即一行一列。

举例:查询工资高于公司平均工资的员工信息。

SELECT * FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

在这个例子中,子查询(SELECT AVG(salary) FROM employees)计算了公司所有员工的平均工资,并作为一个标量值返回给外部查询,用于比较员工的工资是否高于这个平均值。

列子查询

定义:列子查询返回的结果集是一列多行。

举例:查询没有参与过某个项目的员工信息。

假设有两个表:employees(员工表)和projects(项目参与表),其中projects表记录了员工参与的项目ID。

SELECT * FROM employees
WHERE employee_id NOT IN (SELECT DISTINCT employee_id FROM projects WHERE project_id = 'P001');

在这个例子中,子查询(SELECT DISTINCT employee_id FROM projects WHERE project_id = 'P001')返回了参与项目’P001’的所有员工ID,外部查询则选择那些没有在这个列表中的员工。

行子查询

定义:行子查询返回的结果集是一行多列,通常与比较操作符(如=、<>、IN等)结合使用,但MySQL中直接使用行子查询的情况较少,更多是通过JOIN或其他方式实现类似功能。

说明:虽然MySQL支持行子查询的概念,但在实际使用中,可能更倾向于使用JOIN操作来实现相同的功能,因为JOIN在性能上通常更优,且语法更清晰。

表子查询

定义:表子查询返回的结果集是多行多列,可以看作是一个临时的表,在外部查询中作为FROM子句的一部分。

举例:查询库存量少于订单所需量的产品。

假设有两个表:products(产品表)和orders(订单表)。

SELECT * FROM (SELECT product_id, SUM(quantity) AS required_quantityFROM ordersGROUP BY product_id
) AS order_details
JOIN products ON order_details.product_id = products.product_id
WHERE products.stock_quantity < order_details.required_quantity;

在这个例子中,子查询首先计算了每个产品的订单总需求量,然后将这个结果作为一个临时表order_details与外部的产品表products进行JOIN操作,以找出库存量少于订单所需量的产品。

子查询注意事项

在使用MySQL的子查询时,需要注意以下几个方面以确保查询的正确性和效率:

子查询的位置

  • 子查询可以嵌套在SQL语句中的多个位置,包括SELECT子句、FROM子句、WHERE子句、GROUP BY子句、HAVING子句等。了解子查询可以放置的位置有助于编写更灵活的查询语句。

子查询的返回类型

  • 标量子查询:返回单个值(单行单列),常用于比较操作。
  • 列子查询:返回一列多行,常用于IN、ANY、ALL等操作符中。
  • 行子查询:返回一行多列,但在MySQL中直接使用行子查询的情况较少,通常通过JOIN或其他方式实现。
  • 表子查询:返回多行多列,可以看作是一个临时的表,在外部查询中作为FROM子句的一部分。

别名的使用

  • 当在FROM子句中使用子查询时,必须为子查询结果集指定别名,以便在外部查询中引用。
  • 在SELECT子句中使用子查询时,如果子查询返回单行单列,通常不需要指定列别名,但为了提高可读性,建议总是指定别名。

性能考虑

  • 子查询可能会降低查询效率,特别是当子查询返回大量数据时。在可能的情况下,考虑使用JOIN操作代替子查询,因为JOIN操作通常更高效。
  • 对于复杂的子查询,特别是多层嵌套的子查询,要注意优化查询逻辑,减少不必要的计算和数据检索。

相关性

  • 相关子查询:子查询的结果依赖于外部查询的结果。这种子查询在每次外部查询处理一行时都会重新执行。
  • 不相关子查询:子查询的结果不依赖于外部查询的结果。这种子查询在整个外部查询执行前只执行一次。

在编写相关子查询时要特别注意性能问题,因为它们可能会显著增加查询的复杂度和执行时间。

错误处理

  • 确保子查询的语法正确,并且返回的数据类型与外部查询中的数据类型兼容。
  • 注意处理可能出现的空值(NULL)情况,因为子查询可能返回空值,这会影响外部查询的结果。

逻辑清晰

  • 编写子查询时,要确保逻辑清晰、易于理解。复杂的子查询可能会让其他开发者难以理解和维护。
  • 在可能的情况下,将复杂的子查询分解为更简单的部分,并使用临时表或CTE(公共表表达式)来存储中间结果。

综上所述,使用MySQL子查询时需要注意位置、返回类型、别名使用、性能考虑、相关性、错误处理和逻辑清晰性等方面。通过遵循这些注意事项,可以编写出既高效又易于维护的查询语句。

总结

子查询是MySQL中非常强大的功能,它允许在查询中嵌套其他查询,从而实现复杂的查询逻辑。通过合理使用不同类型的子查询,可以高效地解决各种数据库查询问题。

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

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

相关文章

Flet介绍:平替PyQt的好用跨平台Python UI框架

随着Python在各个领域的广泛应用&#xff0c;特别是在数据科学和Web开发领域&#xff0c;对于一个简单易用且功能强大的用户界面&#xff08;UI&#xff09;开发工具的需求日益增长。传统的Python GUI库如Tkinter、PyQt虽然功能强大&#xff0c;但在易用性和现代感方面略显不足…

数据结构--二叉树的顺序实现(堆实现)

引言 在计算机科学中&#xff0c;二叉树是一种重要的数据结构&#xff0c;广泛应用于各种算法和程序设计中。本文将探讨二叉树的顺序实现&#xff0c;特别是堆的实现方式。 一、树 1.1树的概念与结构 树是⼀种⾮线性的数据结构&#xff0c;它是由 n(n>0) 个有限结点组成…

【HTML5】html5开篇基础(5)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

vue-live2d看板娘集成方案设计使用教程

文章目录 前言v1.1.x版本&#xff1a;vue集成看板娘&#xff08;暂不使用&#xff0c;在v1.2.x已替换&#xff09;集成看板娘实现看板娘拖拽效果方案资源备份存储 当前最新调研&#xff1a;2024.10.2开源方案1&#xff1a;OhMyLive2D&#xff08;推荐&#xff09;开源方案2&…

【设计模式】软件设计原则——接口隔离迪米特

接口隔离原则引出 接口隔离原则 定义&#xff1a;用多个专门的接口,不使用单一的总接口,客户端不应该依赖它不需要的接口; 一个类对另一个类的依赖,应该建立在最小接口上;如果有一个大接口,里面有很多方法,如果使用一个类实现该接口,所有的类都要实现&#xff0c;导致代码冗余;…

android 全面屏最底部栏沉浸式

Activity的onCreate方法中添加 this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); Android 系统 Bar 沉浸式完美兼容方案自 Android 5.0 版本&#xff0c;Android 带来了沉浸式系统 ba - 掘金 (juejin.cn)https://juejin.cn/post/7075578…

【HTTP(3)】(状态码,https)

【认识状态码】 状态码最重要的目的&#xff0c;就是反馈给浏览器:这次请求是否成功&#xff0c;若失败&#xff0c;则出现失败原因 常见状态码: 200:OK&#xff0c;表示成功 404:Not Found&#xff0c;浏览器访问的资源在服务器上没有找到 403:Forbidden&#xff0c;访问被…

【每天学个新注解】Day 15 Lombok注解简解(十四)—@UtilityClass、@Helper

UtilityClass 生成工具类的注解 将一个类通过注解变成一个工具类&#xff0c;并没有什么用&#xff0c;本来代码中的工具类数量就极为有限&#xff0c;并不能达到减少重复代码的目的 1、如何使用 加在需要委托将其变为工具类的普通类上。 2、代码示例 例&#xff1a; Uti…

基于Java,SpringBoot,Vue智慧校园健康驿站体检论坛请假管理系统

摘要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#xf…

景区+商业,如何实现1+1>2?

景区商业&#xff0c;如何实现11&#xff1e;2&#xff1f; 近两年&#xff0c;随着旅游业的蓬勃发展&#xff0c;旅游热潮持续升温&#xff0c;游客的消费观念也在逐步升级。为了适应这一趋势&#xff0c;各大景区纷纷着手打造具有鲜明特色的文旅项目&#xff0c;希望能够吸引…

C++ | Leetcode C++题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; class Solution { public:bool circularArrayLoop(vector<int>& nums) {int n nums.size();auto next [&](int cur) {return ((cur nums[cur]) % n n) % n; // 保证返回值在 [0,n) 中};for (int i 0; i < n; i) {if …

cherry-markdown开源markdown组件详细使用教程

文章目录 前言开发定位目标调研技术方案前提工作量安排数据库表设计实现步骤1、引入依赖2、实现cherry-markdown的vue组件&#xff08;修改上传接口路径&#xff09;3、支持draw.io组件4、支持展示悬浮目录toc前端使用&#xff1a;编辑状态使用cherry-markdown的vue组件前端使用…

解决npm安装不了element库(目前未解决。。。)

根据您提供的错误信息&#xff0c;安装 element-plus 时出现了一些问题。这些错误主要可以分为两类&#xff1a;权限问题和网络问题。以下是一些解决这些问题的建议&#xff1a; 1. 解决权限问题 您遇到的 EPERM: operation not permitted 错误通常与文件系统权限有关。尝试以…

Stable Diffusion绘画 | 插件-Deforum:动态视频生成(中篇)

本篇文章重点讲解参数最多的 关键帧 模块。 「动画模式」选择「3D」&#xff1a; 下方「运动」Tab 会有一系列参数&#xff1a; 以下4个参数&#xff0c;只有「动画模式」选择「2D」才会生效&#xff0c;可忽略&#xff1a; 运动 平移 X 让镜头左右移动&#xff1a; 大于0&a…

卷积神经网络(CNN)的计算量和参数怎么准确估计?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 1. 卷积层&#xff08;Convolutional Layer&#xff09; a) 计算量估计&#xff1a; 卷积层的 FLOPs 2 * H_out * W_out * C_in * C_out * K_h * K_w 详细解释&#xff1a; H_out, W_out&#xff…

YOLO11改进|注意力机制篇|引入HAT超分辨率重建模块

目录 一、HAttention注意力机制1.1HAttention注意力介绍1.2HAT核心代码 二、添加HAT注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、HAttention注意力机制 1.1HAttention注意力介绍 HAT模型 通过结合卷积特征提取与多尺度注意…

推荐 uniapp 相对好用的海报生成插件

插件地址&#xff1a;自定义canvas样式海报 - DCloud 插件市场 兼容性也是不错的&#xff1a;

MySQL基础篇 - 事务

01 事务的简介 【1】什么是事务&#xff1a;事务是一组操作集合&#xff0c;要么同时操作成功&#xff0c;要么同时操作失败。 【2】对于MySQL数据库来说默认一条SQL语句就是一个事务&#xff0c;且事务是默认自动提交的。 我们可以把多条SQL语句设置成一个事务&#xff0c;使…

java:pdfbox 删除扫描版PDF中文本水印

官网下载 https://pdfbox.apache.org/download.html下载 pdfbox-app-3.0.3.jar cd D:\pdfbox 运行 java -jar pdfbox-app-3.0.3.jar java -jar pdfbox-app-3.0.3.jar Usage: pdfbox [COMMAND] [OPTIONS] Commands:debug Analyzes and inspects the internal structu…

Spring Boot技术栈:打造高效在线商城

2 相关技术 2.1 Springboot框架介绍 Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Spring…