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

news2024/9/29 3:33:41

【重学 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_salary
    FROM employees
    GROUP BY department_id
) AS max_salaries
WHERE max_salary > 50000;

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

在WHERE子句中引入子查询

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

SELECT *
FROM employees
WHERE salary > (
    SELECT AVG(salary)
    FROM employees
    WHERE 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_quantity
    FROM orders
    GROUP 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.coloradmin.cn/o/2175684.html

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

相关文章

Vue 学习

vue 核心语法 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Vue 核心语法测试</title> </head><body&…

GGHead:基于3D高斯的快速可泛化3D数字人生成技术

随着虚拟现实(VR)、增强现实(AR)和数字人技术的发展,对高质量、实时生成的3D头部模型的需求日益增长。传统的3D生成方法往往依赖于复杂的2D超分辨率网络或大量的3D数据,这不仅增加了计算成本,还限制了生成速度和灵活性。为了解决这些问题,研究人员开发了一种名为GGHead…

14.安卓逆向-frida基础-编写hook脚本2

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。 工…

图技术与大语言模型 LLM 结合,打造下一代知识图谱应用

随着 AI 人工智能技术的迅猛发展和自然语言处理领域的研究日益深入&#xff0c;如何构建强大的大语言模型对于企业来说愈发重要&#xff0c;而图数据库作为处理复杂数据结构的有力工具&#xff0c;为企业构建行业大语言模型提供了强大的支持。 近日&#xff0c;国产企业级分布…

UE学习篇ContentExample解读------Blueprints Advanced-下

文章目录 总览描述批次阅览2.1 Timeline animation2.2 Actor tracking2.3 Button Trigger using a blueprint interface2.4 Opening door with trigger2.5 Child Blueprints 概念总结致谢&#xff1a; 总览描述 打开关卡后&#xff0c;引入眼帘的就是针对关卡的总体性文字描述&…

netdata(Linux 性能实时监测工具)一键安装 for armbian

下载地址netdata/netdata: Architected for speed. Automated for easy. Monitoring and troubleshooting, transformed! (github.com) sh netdata-armv7l-latest.gz.run^|.-. .-. .-. .-. . netdata| - - - - real-time performance monitoring, done righ…

指定PDF或图片多个识别区域,识别区域文字,并批量对PDF或图片文件改名

常见场景 用户有大量图片/PDF文件&#xff0c;期望能按照图片/PDF中的某些文字对图片/PDF文件重命名。期望工具可以批量处理、离线识别&#xff08;保证数据安全性&#xff09;。手工操作麻烦。具体场景&#xff1a;用户有工程现场照片&#xff0c;订单&#xff0c;简历等PDF或…

动手学深度学习-GPU常见报错-CUDA11.4-AssertionError: Torch not compiled with CUDA enabled

目录 本文还能解决&#xff1a; 0. 问题原因 1. 查看机器的cuda版本 2. 从官网下载对应的torch和torchvision 3. 具体安装方法 本文还能解决&#xff1a; torch.cuda.is_available() 输出为 False&#xff1b; torch.cuda.device_count() 输出为 0 0. 问题原因 这两个问题…

召回09 双塔模型+自监督学习

引入&#xff1a; 自监督学习改进双塔模型&#xff0c;可以提升业务指标。自监督学习是把物品塔学习得更习的更好。 长尾物品的曝光和点击数量太少&#xff0c;训练的样本次数不够。自监督可以更好地学习长尾数据的物品表征。 双塔模型的训练&#xff1a; 线上召回的时候不用纠…

SSM+Vue社区物业管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作…

SpringCloud简介 Ribbon Eureka 远程调用RestTemplate类 openfeign

〇、SpringCloud 0.区别于单体项目和soa架构&#xff0c;微服务架构每个服务独立&#xff0c;灵活。 1. spring cloud是一个完整的微服务框架&#xff0c;springCloud包括三个体系&#xff1a; spring cloud Netflix spring cloud Alibaba spring 其他 2.spring cloud 版本命名…

【每日刷题】Day133

【每日刷题】Day133 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 085. 括号生成 - 力扣&#xff08;LeetCode&#xff09; 2. LCR 102. 目标和 - 力扣&#xff…

Spring的热部署工具和数据库密码加盐操作

1.布置热部署 引言&#xff1a;在程序运行起来后&#xff0c;如果我们对代码进行了修改&#xff0c;需要重新测试修改后的程序&#xff0c;就得重新启动程序&#xff0c;这样很麻烦。于是引入热部署之后&#xff0c;我们就不需要重新启动程序&#xff0c;会自动更正。 1.配置po…

多线程;顺序容器;智能指针

多线程的创建创建线程比较简单&#xff0c;C提供头文件thread&#xff0c;使用std的thread实例化一个线程对象创建。 std::thread 在 #include 头文件中声明&#xff0c;因此使用 std::thread 时需要包含 #include 头文件。 #include <iostream> #include <thread&g…

【C++】C++的Vector使用和实现

目录 vector的介绍 vector的使用 construct iterator capacity Element access mondifiers vector的原理介绍以及简单实现 vector的介绍 我们平时在写代码中可能会使用各种类型的array&#xff0c;也就是数组&#xff0c;但是这些数组都是静态的&#xff0c;意味着我们只能…

A股突破3000,连续大涨,公司国庆假放10天

关注▲洋洋科创星球▲一起成长&#xff01; 庆祝A股突破3000&#xff0c;连续大涨&#xff0c;也不知道老板抽了什么风&#xff0c;公司今天开始放国庆假了&#xff0c;连休10天&#xff0c;哈哈哈哈哈哈。 27号开始放国庆假&#xff0c;连休10&#xff0c;刺激。 中秋国庆这一…

在线代码编辑器

在线代码编辑器 文章说明前台核心代码后台核心代码效果展示源码下载 文章说明 采用Java结合vue3设计实现的在线代码编辑功能&#xff0c;支持在线编辑代码、运行代码&#xff0c;同时支持导入文件&#xff0c;支持图片识别&#xff0c;支持复制代码&#xff0c;可将代码导出为图…

网络安全带你练爬虫----添加异常处理代码

&#xff08;当代码越来越长的时候&#xff0c;异常处理代码有时候能起到很好的作用&#xff09; (注&#xff1a;其中的cookie需要填自己的) 一、异常处理代码&#xff1a; &#xff08;1&#xff09;try-except搭配&#xff1a;try关键字后面的代码是要监视异常的代码块&am…

DarkLabel 2.4 目标追标注工具介绍

DarkLabel介绍 https://github.com/darkpgmr/DarkLabel 官方地址 视频/图像标注工具&#xff0c;很适合用于目标追踪任务 DarkLabel可以在视频和图像中标注物体的边界框&#xff0c;并附上 ID 和name。还可以用于裁剪视频、从视频中采样训练图像以及对图像区域进行马赛克处理…

第十三周:机器学习

目录 摘要 Abstract 一、生成式对抗网络&#xff08;上&#xff09; 1、引入——generator 2、discriminator 3、GAN算法 4、GAN的理论 5、GAN的训练技巧 二、word2vec——gensim实践 1、引入 2、 word2vec模型 3、fasttext模型 总结 摘要 本周学习了对GAN进行了…