MySQL复合查询解析

在这里插入图片描述

🎈行百里者半九十🎈

🎈目录🎈

  • 概念
  • 多表查询
  • 自连接
  • 子查询
    • 单行子查询
    • 多行子查询
      • in关键字
      • all关键字
      • any关键字
    • 多列子查询
    • 在from中使用子查询
    • 合并查询
      • union
      • union all
  • 总结


概念

之前我们很多的查询都只是对于单表进行查询,而在实际开发中往往数据来自不同的表,所以需要多表查询。多表查询也称复合查询,MySQL复合查询是指在一个查询语句中结合使用多个子查询或联结(JOIN)操作,以完成更复杂的数据检索或分析任务。这种查询可以包括多个 SELECT 语句、联结、子查询等,从而允许你在一个查询中获取来自不同表的数据或根据不同条件组合结果。复合查询的主要目的是实现对数据库中数据的灵活检索,以便满足复杂的业务需求。

多表查询

基本的多表查询通常涉及使用 JOIN 操作,以联结两个或多个表的数据。以下是一个简单的多表查询的例子,有如下两张stucla表。

在这里插入图片描述
在这里插入图片描述
当我们不设任何条件单纯进行复合查询,执行语句会出现如下结果:

select * from stu, cla; ---select * from stu join cla;

在这里插入图片描述
可以看到在结果中,每个表的每一行都与另一个表的每一行组合,形成了笛卡尔积。在实际应用中,应当避免无条件的笛卡尔积,因为它可能导致结果集非常庞大,对性能产生负面影响。通常,应该通过使用合适的连接条件来执行表的连接,以获得更有意义的结果。

例如,获取每个人的姓名、性别和国家。

select stu.name '姓名', sex '性别', cla.name '国家' 
from stu, cla 
where stu.class=cla.id;

在这里插入图片描述

类似这样的多表查询可帮助你从关联的表中检索出合并的信息,使得查询结果更具有实际业务意义。

自连接

自连接是指在同一张表内进行连接操作,即连接表中的不同行与自身的其他行。这种连接通常涉及使用表的别名(alias)来区分表的不同实例。

如下示例,假设有一个表 employees 包含员工的信息,其中包括员工的ID和其直接上级的ID:
在这里插入图片描述

在这个表中,manager_id 列表示员工的直接上级的ID。要查询每个员工及其对应的直接上级,可以执行自连接,使用表的别名来引用相同的表:

select e1.name name, e2.name manager 
from employees e1, employees e2
where e1.manager_id=e2.employee_id;

在这里插入图片描述

在这个例子中,employees 表通过自连接找到每个员工及其对应的直接上级。通过使用表别名,我们可以清晰地区分表的两个实例,并指定连接条件。自连接通常用于处理层次结构数据,其中一个记录与同一表中的另一个记录有关联。

子查询

子查询是嵌套在主查询中的查询,可以作为主查询的一部分来获取需要的数据。子查询可以出现在不同的位置,例如在 SELECT、FROM、WHERE 子句中,根据需求选择合适的位置。

单行子查询

单行子查询是指返回单一值而不是结果集的子查询。这种类型的子查询通常用于在主查询中计算或比较单一值。例如假设有两个表 studentsgrades,其中 students 表包含学生信息,grades 表包含学生成绩信息。

students

在这里插入图片描述

grades

在这里插入图片描述

现在,假设我们想找到成绩最高的学生。我们可以使用单行子查询来获取最高分数:

select student_id, student_name
from students
where student_id = (select student_id from grades order by grade desc limit 1);

在这个查询中,子查询 (select student_id from grades order by grade desc limit 1) 返回最高分数对应的学生ID,然后主查询使用这个学生ID来获取相关的学生信息。结果如下:

在这里插入图片描述

多行子查询

多行子查询是指返回多个结果的子查询,通常用于与主查询中的某个条件进行比较或筛选。假设有两个表 employeessalaries,其中 employees 表包含员工信息,salaries 表包含员工薪资信息。

employees

在这里插入图片描述

salaries

在这里插入图片描述

现在,假设我们想找到薪资高于公司平均薪资的员工。我们可以使用多行子查询计算平均薪资并与每个员工的薪资进行比较:

select e.employee_id, employee_name, salary 
from employees e, salaries s 
where e.employee_id=s.employee_id and salary > (select avg(salary) from salaries);

在这个查询中,子查询 (select avg(salary) from salaries) 返回每个员工的平均薪资,然后主查询使用这些值来筛选薪资高于平均薪资的员工。结果如下:

在这里插入图片描述

in关键字

当使用 IN 关键字时,你可以通过指定一个值列表来检查某个列是否包含在这个值列表中。可以使用 IN 关键字检查 employee_id 是否在满足条件(薪资高于公司平均薪资)的员工列表中。

select e.employee_id, employee_name, salary 
from employees e, salaries s 
where e.employee_id = s.employee_id and e.employee_id in ( 
select employee_id from salaries where salary > ( 
select avg(salary) from salaries));

在这里插入图片描述

在这个查询中,IN 子句检查 employee_id 是否在子查询中返回的员工列表中。这个子查询会选择那些薪资高于公司平均薪资的员工的 employee_id。这样,你就可以得到所有薪资高于公司平均薪资的员工的记录。

all关键字

在 SQL 中,ALL 关键字用于与比较运算符一起使用,用于比较某个值与子查询中所有值的关系。通常,ALL 与比较运算符一起使用,例如 > ALL< ALL。假设有两个表,分别为学生信息和多个成绩的表格。

在这里插入图片描述

现在,我们想查询所有成绩都高于Bob的成绩的记录:

select s.student_id, s.student_name, g.subject, g.grade
from students s, grades g
where s.student_id = g.student_id and s.student_name <> 'bob'
and g.grade > all (select grade from grades where student_id = 3);

在这里插入图片描述

请注意,使用 ALL 关键字时,要确保子查询返回的结果不包含 NULL 值,否则可能导致不确定的结果。

any关键字

在 SQL 中,ANY 关键字用于与比较运算符一起使用,用于比较某个值与子查询中的任何值的关系。通常,ANY 与比较运算符一起使用,例如 > ANY< ANY。如上有两个表,分别为学生信息和多个成绩的表格。

在这里插入图片描述

接下来要查询返回至少有一门课程成绩高于某个特定学生(例如Bob)的成绩的学生记录:

select s.student_id, s.student_name, g.course, g.grade 
from students s, grades g
where s.student_id = g.student_id 
and s.student_name <> 'bob' and g.grade > any (
select grade from grades where student_id = 3);

在这里插入图片描述

注意,与 all 不同,any 表示与子查询中的任何值进行比较,all是满足所有才为真,any是满足其中之一就为真(类似C语言中的&&和||)。同样,要确保子查询返回的结果不包含 NULL 值,以避免不确定的结果。

多列子查询

多列子查询通常用于在子查询中检索多列数据,并与主查询中的多列数据进行比较。假设有两个表格:orders 表格和 order_items 表格,用于跟踪订单和订单项的信息。

在这里插入图片描述

接下来想要查找所有订单的客户以及他们的订单总金额,但只包括那些订单总金额高于平均订单总金额的客户。

select o.customer_id, sum(oi.quantity * oi.price) as total_amount
from orders o, order_items oi
where o.order_id = oi.order_id
group by o.customer_id
having sum(oi.quantity * oi.price) > (select avg(order_total)from (select o.customer_id, sum(oi.quantity * oi.price) as order_totalfrom orders o, order_items oiwhere o.order_id = oi.order_idgroup by o.customer_id) as subquery
);

在这里插入图片描述

在上面的查询中使用了多列子查询。子查询计算了每个客户的订单总金额,并将其与平均订单总金额进行比较。主查询选择了那些订单总金额高于平均订单总金额的客户。

在from中使用子查询

FROM 子句中使用子查询是一种高级 SQL 技巧,通常用于创建临时表或派生表格,以便在查询中进一步使用。这种方法常常用于解决复杂的数据处理和报表生成问题。例如在如上的两个表格中,表格 orders 记录了订单信息,以及一个表格 order_items 记录了订单项的信息。当我们想计算每个订单的总金额,并在查询结果中包括订单的其他信息。

在这里插入图片描述

接下来,我们在 FROM 子句中使用子查询来计算每个订单的总金额并包括其他订单信息:

select o.order_id, o.customer_id, o.order_date, total_amount
from orders o, (select oi.order_id, sum(oi.quantity * oi.price) as total_amountfrom order_items oigroup by oi.order_id
) as order_totals
where o.order_id = order_totals.order_id;

在这里插入图片描述

在这个查询中,我们在 FROM 子句中使用了一个子查询,该子查询计算了每个订单的总金额(通过对 order_items 表进行汇总)。然后,我们将主查询中的 orders 表格与子查询的结果进行连接,以获取每个订单的总金额以及其他订单信息。我们在一个查询中创建一个临时表格(order_totals),并将其用于进一步的数据处理。

合并查询

合并查询通常指的是使用 UNIONUNION ALL 操作符将多个查询的结果合并为一个结果集,这在需要合并多个查询结果时非常有用。

union

UNION 是用于合并两个或多个 SELECT 查询结果集的 SQL 操作符。它将多个查询的结果合并为一个结果集,并自动去除重复的行(不会保留重复的行)。UNION 的语法如下:

SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;

假设有两个表格 students_astudents_b,它们包含了两个班级的学生信息。我们可以使用 UNION 合并这两个班级的学生名单:

在这里插入图片描述

select student_name from students_a
union
select student_name from students_b;

在这个示例中,UNION 操作符合并了 students_astudents_b 表的学生名单,并返回不重复的学生名单。如果有学生出现在两个表中,只会在结果中出现一次。

在这里插入图片描述

union all

UNION ALL 是用于合并两个或多个 SELECT 查询结果集的 SQL 操作符,与 UNION 不同的是,它不会去除重复的行,而会保留所有行。UNION ALL 的语法如下:

SELECT column1, column2, ...
FROM table1
UNION ALL
SELECT column1, column2, ...
FROM table2;

与上面一样有两个表格 students_astudents_b,它们包含了两个班级的学生信息。我们使用 UNION ALL 合并这两个班级的学生名单:

select student_name from students_a
union all
select student_name from students_b;

在这里插入图片描述

示例中,UNION ALL 操作符合并了 students_astudents_b 表的学生名单,并返回包括重复学生名单的结果。如果有学生出现在两个表中,它们都会在结果中保留。

UNION 不同,UNION ALL 不执行去重操作,因此在某些情况下,它可能比 UNION 更快,特别是当你知道结果中不会有重复行时。但要注意,如果你需要去除重复的行并且只保留唯一的行,应该使用 UNION

总结

文章主要介绍了MySQL中的多表查询相关的知识点,掌握这些功能和技巧可用于执行复杂的数据操作和查询,以满足各种数据库需求。码文不易,如果文章对你有帮助的话就劳烦点一个👍,感谢支持!

在这里插入图片描述

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

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

相关文章

Sqoop故障排除指南:处理错误和问题

故障排除是每位数据工程师和分析师在使用Sqoop进行数据传输时都可能遇到的关键任务。Sqoop是一个功能强大的工具&#xff0c;但在实际使用中可能会出现各种错误和问题。本文将提供一个详尽的Sqoop故障排除指南&#xff0c;涵盖常见错误、问题和解决方法&#xff0c;并提供丰富的…

RabbitMQ的基本使用,进行实例案例的消息队列

目录 一、介绍 1. 概述 2. 作用 3. 工作原理 二、RabbitMQ安装部署 1. 安装 2. 部署 3. 增加用户 三、实现案例 1. 项目创建 2. 项目配置 3. 生产者代码 4. 消费者代码 四、测试 每篇一获 一、介绍 1. 概述 RabbitMQ 是一种开源的消息代理和队列服务器&#x…

Logistic回归实战

一、题目 假设你是一所大学的行政管理人员&#xff0c;你想根据两门考试的结果&#xff0c;来决定每个申请人是否被录取。你有以前申请人的历史数据&#xff0c;可以将其用作逻辑回归训练集。对于每一个训练样本&#xff0c;你有申请人两次测评的分数以及录取的结果。为了完成这…

测试基础-软件测试必备知识总结

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 什么是软件测试&#xff1f; 软件测试是在软件产品发布之前检查其质量、功能和性能的过程。为了…

【论文阅读】GPT4Graph: Can Large Language Models Understand Graph Structured Data?

文章目录 0、基本介绍1、研究动机2、准备2.1、图挖掘任务2.2、图描述语言&#xff08;GDL&#xff09; 3、使用LLM进行图理解流程3.1、手动提示3.2、自提示 4、图理解基准4.1、结构理解任务4.1、语义理解任务 5、数据搜集5.1、结构理解任务5.2、语义理解任务 6、实验6.1、实验设…

基于SpringBoot Vue自习室管理系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

解决Qt的release构建下无法进入断点调试的问题

在工作的时候遇到了第三方库只提供release版本的库的情况&#xff0c;我需要在这基础上封装一层自家库&#xff0c;在调试的时候遇到如下问题&#xff0c;但是在Qt环境下&#xff0c;release的库只能在进行release构建和调试。 卡在了一直进不了断点的情况。提示内容如下&#…

2024-01-17(SpringCloud)

1.使用openFeign的itemClient接口去做远程调用其他微服务中的接口。但我们直接使用了itemClient接口&#xff0c;而不是该接口的实现类&#xff0c;说明我们是使用该接口的代理对象帮我们做远程调用的。这个代理对象是invocationHandler来生成的。 2.openFeign底层发起远程调用…

解决js计算精度问题

问题 浮点数&#xff0c;常用的办法是四舍五入保留2位小数来解决。但是在向上、向下保留小数的时候&#xff0c;比如&#xff1a;0.10.20.30000000000000004&#xff0c;向上保留2位小数就变成了0.31。 大整数&#xff0c;在超出Number的最大安全整数时&#xff0c;计算也会存…

Tide Quencher 8WS-Amine,TQ8WS-胺,可用于特定荧光信号的检测

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Tide Quencher 8WS Amine&#xff0c;TQ8WS amine&#xff0c;Tide Quencher 8WS NH2 &#xff0c;TQ8WS NH2&#xff0c;Tide Quencher 8WS 胺&#xff0c;TQ8WS 胺 一、基本信息 产品简介&#xff1a;The fluores…

MySQL的基本查询(附案例)

目录 前言 Create&#xff08;创建&#xff09; 单行数据全列插入&#xff1a; 多行数据指定列插入&#xff1a; 插入否则更新&#xff1a; 替换&#xff1a; Retrieve&#xff08;读取&#xff09; SELECT 列&#xff1a; 全列查询&#xff1a; 指定列查询&#xff1a…

DMA技术在STM32中优化UART、SPI和I2C通信性能的研究与实现

DMA&#xff08;Direct Memory Access&#xff0c;直接存储器访问&#xff09;技术可以在STM32微控制器上优化UART、SPI和I2C等通信性能。DMA可以实现数据的高速传输&#xff0c;减轻CPU的负担&#xff0c;提高系统性能。在本篇文章中&#xff0c;我将探讨DMA技术在STM32中优化…