[MySQL] MySQL复合查询(多表查询、子查询)

  前面我们学习了MySQL简单的单表查询。但是我们发现,在很多情况下单表查询并不能很好的满足我们的查询需求。本篇文章会重点讲解MySQL中的多表查询子查询一些复杂查询。希望本篇文章会对你有所帮助。

文章目录

一、基本查询回顾

二、多表查询

2、1 笛卡尔积

2、2 多表查询练习

三、自连接

四、子查询

4、1 单行子查询

4、2 多行子查询

4、3 多列子查询

4、4 在from子句中使用子查询

五、合并查询


🙋‍♂️ 作者:@Ggggggtm 🙋‍♂️

👀 专栏:MySQL 👀

💥 标题:MySQL复合查询💥

 ❣️ 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 ❣️

  在对本篇文章学习之前,首先说明一下本篇文章所用到表的结构和内容。具体如下:

  • 员工表emp:
  • 部门表dept:
  • 薪水表salgrade:

一、基本查询回顾

查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J 

  首先确定,上述所需筛选的信息都在一行表中。其次,分析出 工资 > 500 or job = MANAGER。我们先来查询出满足 工资 > 500 or job = MANAGER 的员工。具体如下:

  同时,我们还需要满足所查询到的员工的姓名首字母为大写的J,很明显是模糊查询。具体如下图:

按照部门号升序而雇员的工资降序排序

  这个需求就是简单的排序即可。注意所需排序的先后顺序。具体如下图:

使用年薪进行降序排序

  首先我们需要计算出来年薪。年薪 = 月薪(sal)*12 + 年终奖(comm)。那么我们直接就对其进行排序即可。但是需要注意的是:NULL并不能参与计算,这时候需要内置函数ifnull来进行判断其是否为NULL,如果为NULL直接加0即可。 具体如下:

显示工资最高的员工的名字和工作岗位 

  我们可以很容易的查找到最高工资是多少,然后再根据最高工资去找对应的员工的名字和工作岗位。具体如下图:

  上述用了两条SQL语句确实能够查询出我们想要的结果。但是好像不太优雅。能不能用一条语句将所需结果查询出来呢?答案是可以的。我们可以用子查询。什么是子查询呢?在 MySQL 中,子查询是指在一个查询语句中嵌套另一个查询语句。子查询可以用于过滤结果集、作为计算字段的数据源、与外部查询进行比较等多种情况。下面我们用子查询来解决这个需求。具体如下:

显示工资高于平均工资的员工信息 

  这个题目的需求与上一个题目的需求很相似。我们可以先获取平均工资,在查询比平均工资高的员工,一样是用子查询。具体如下:

显示每个部门的平均工资和最高工资

  我们看到需求是每个部门,那么首先肯定要按部门号进行分组。其次我们再查询每个部门的平均工资和最高工资。具体如下图:

显示平均工资低于2000的部门号和它的平均工资

  首先我们很容易可以找到各个部门的平均工资,然后只需要再增加一个条件判断即可。具体如下:

显示每种岗位的雇员总数,平均工资  

  注意是每种岗位,所以需要根据job进行分组查询。具体如下图:

二、多表查询

2、1 笛卡尔积

  在MySQL中,多表查询的笛卡尔积(Cartesian Product)是指在没有使用任何条件或连接的情况下,将两个或多个表中的所有行进行组合的结果集。这种情况通常是在没有明确指定连接条件或者WHERE子句的情况下进行的查询,但在实际应用中,很少需要或者希望获得笛卡尔积结果。

  以下是一个简单的说明以及一个示例来解释笛卡尔积:

  1. 笛卡尔积的性质: 笛卡尔积将参与查询的每个表的所有可能组合都返回,即第一个表的每一行都会与第二个表的每一行进行组合,生成的结果集的行数为各个表行数的乘积。

  2. 示例:我们现在将员工表和部门表进行笛卡尔积。具体如下:其实我们也不难看出,规律就是如下图:

  但是往往我们用笛卡尔积所获取的表有很多的数据冗余。因为它会产生大量的冗余数据并且效率低下。为了避免得到笛卡尔积,我们需要正确地使用连接条件(例如使用where条件来筛选掉无用信息)来明确指定表之间的关联关系。例如,在对上述的员工表和部门表进行笛卡尔积时,一个员工不可能会有多个部门号,所以只有部门号相同的才算是有效的信息。最终有效结果如下图:

2、2 多表查询练习

显示部门号为 10 的部门名,员工名和工资
  我们发现员工表中并没有我们想要的部门名,所以我们需要进行多表查询。需要将员工表和部门表进行合并查询。然后在查询部门号为10的部门名、员工名和工资。具体如下:
  这里再说明一下:上述 SQL语句中 from 后 的 t1 和 t2 是对 emp 和 dept 表进行了重命名,后续都可以 用我们重命名的名字去代替表名字。其次是当我们将两张表拼接到一块后,表中会有 两个deptno,所以我们在使用deptno时,需要指定是那个表的

显示各个员工的姓名,工资,及工资级别

   我们发现工资等级只有在薪资表中有,所以我们需要进行多表查询。当我们将员工表与薪水表进行笛卡尔积后,发现很多数据是冗余的。只有薪资符合它所在的等级区间才是有效的。所以我们的查寻结果如下:

三、自连接

  我们上述讲解的是两张不同的表进行连接。那么可以自己与自己的表进行连接吗?答案是可以的!MySQL中的自连接是指在同一张表中进行连接操作。这种连接通常用于将表中的数据与自身进行比较或者组合。自连接可以通过将表与自身进行别名来实现,从而使得查询可以使用表中的不同行进行比较和操作。 我们看如下例子:

  通过上图我们发现,当进行自连接时,如果不对表进行取别名,那么将不能够进行自连接。必须对表进行取别名。自连接的使用场景是什么呢?我们看如下例子。

 显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno

  员工是在emp表中,上级领导也是员工,也在emp表中。我们可能首先会想到用子查询来解决,相对简单。具体如下:

  但是我们也不难发现,要查询的两个条件都是在emp表中,那么我们就可以对emp表进行自连接。我们现在把两张表想象成一张表是员工表,另一张表是领导表。我们现在需要的有效信息是:员工表中的mgr = 领导表中的empno即可。筛选出有效信息后在选择员工表中的员工为FORD。具体如下:

四、子查询

  子查询的概念在上文中已经解释过,这里就不再解释。在子查询的子句中,子句查询出的结果可能不止是一行记录,也有可能是多行记录,还有就是多列的情况。下面我们一一来分析一下。

4、1 单行子查询

显示 SMITH 同一部门的员工

  首先将SMITH的部门号查出,然后再将该部门的所有员工筛选出即可。具体如下:

4、2 多行子查询

查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的

  我们可以先查询出10号部门的工作岗位,具体如下:

  然后我们再进行筛选与上图中岗位相同的雇员的信息。当我们想用子查询时,发现上图的岗位并不是一个,那该怎么办呢?这时候可以用到 in关键字in关键字用于检查某个值是否在一组值中。刚好符合我们的需求。具体如下:

显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

  题目的要求:找出比30号部门所有员工工资都好的员工信息。也就是比30号部门最高工资还要高的部门。我们首先找出30号部门的员工最高工资,再筛选出薪资比它大的即可。具体如下:

  我们也可以使用all关键字。all关键字用于比较外部查询和子查询返回的所有值当使用 all关键字时,外部查询的值必须满足子查询返回的所有值的条件才会被选中。具体如下:

显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
  注意:题目中的任意员工,是指的只要有比部门30中的员工工资高的即满足条件。通俗理解:找出比 部门号30的员工中最低工资 高的员工。这时可以用any关键字。 any关键字用于比较外部查询和子查询返回的任意一个值当使用 any  时,外部查询的值只需要满足子查询返回的任意一个值的条件即可被选中。具体如下:

4、3 多列子查询

  单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句。下面我们来看一个例子。

查询和 SMITH 的部门和岗位完全相同的所有雇员,不含 SMITH 本人

  我们可以先查询出来SMITH的部门和岗位。如下图:

  我们发现,要和SMITH的部门和岗位完全相同,是多列的情况。这该怎么办呢?我们看如下:

  但是题目中还要求了不能包含SMITH本人。所以再把SMITH本人去掉即可。结果如下:

4、4 from子句中使用子查询

  我们之前学到的from后都是跟的表的名字。from子句中使用子查询怎么理解呢?使用子查询无非就是一个查询语句中嵌套了一个语句。我们就称之为子句。那么子句查询出来的结果我们也可看成一张表,可与其他物理上实力存在的表进行连接。这就是在from子句中使用子查询的意思下面我们结合实际例子来理解一下。

显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

  我们可以很容易得到每个部门的平均工资,具体如下:

  我们可以把上述所查询出来的结果当作一个表,再与emp表进行连接即可。具体如下:

  对我们来说,有用的信息就是emp.deptno = tmp.deptno。那么查询出来的结果如下:

  现在我们只需要emp.sal > tmp.平均工资( avg(sal)) 即可,就是题目所要求的答案,具体如下:

显示每个部门的信息(部门名,编号,地址)和人员数量

  我们发现,部门名和地址都在部门表中,而我们想要统计每个部门的人员数量还需要在emp表中统计。我们先来统计每个部门的人员数量,具体如下:

  我们再将上述查询的结果与部门dept表进行连接,得到有用信息如下图:

  此时,我们在获取题目中的所需要的信息就相当容易了。具体如下图:

查找每个部门工资最高的人的姓名、工资、部门、最高工资

  首先,我们可以很容易的得到每个部门的最高工资,如下图:

  但是怎么获取工资最高的人的信息呢?这时候可以将我们查询的结果与emp表连接,再获取该人的信息就可以了。具体如下:

五、合并查询

  在MySQL中,合并查询指的是将多个查询结果合并成一个结果集的操作。这可以通过使用union、union all等操作符来实现。以下是对每种操作符的详细解释:

  1. union:union操作符用于将两个或多个select语句的结果合并为一个结果集,并自动去重。

  2. union all:与union类似,但不会自动去重。

  下面我们来看几个实际例子来理解一下。

将工资大于 2500 或职位是 MANAGER 的人找出来

  这个例子我们前面已经做过类似的,不再过多解释,直接看下图:

  我们也可以先将工资大于2500的人找出来,如下:

  再找出来职位是MANAGER的。如下图:

  最后用union将他们两个合并即可。具体如下:

  我们再来用union all 将他们合并试试。具体如下图:

  从上述的对比中,我们也能看出来union是合并并且去重,union all就只是合并。注意:两个select合并的前提是必须所查询出来的列数是相同的。实际中,union并不常用,我们只是了解一下即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM 命令行监控及诊断工具

面试题 你使用过Java虚拟机性能监控和故障处理工具吗?(美图) 怎么打出线程栈信息。(字节跳动) JVM诊断调优工具用过哪些? (京东) 怎么获取 Java 程序使用的内存?堆使用…

Linux学习教程(第十四章 Linux系统服务管理)一

第十四章 Linux系统服务管理(一) 什么是系统服务?服务是在后台运行的应用程序,并且可以提供一些本地系统或网络的功能。 那么,Linux 中常见的服务有那些,这些服务怎么分类,服务如何启动&#x…

diffusers pipeline拆解:理解pipelines、models和schedulers

diffusers pipeline拆解:理解pipelines、models和schedulers 翻译自:https://huggingface.co/docs/diffusers/using-diffusers/write_own_pipeline v0.24.0 diffusers 设计初衷就是作为一个简单且易用的工具包,来帮助你在自己的使用场景中构建…

四十、Saga模式

目录 一、定义 二、流程 三、优点 四、缺点 五、四种模式的对比 一、定义 Saga模式是一种用于处理复杂异步操作流的模式,通常用于React/Redux的应用程序中。在这种模式中,业务逻辑被分成多个离散步骤,每个步骤都是一个Generator函数&…

AUTOSAR CP Port Driver简介

Port Driver 1 背景2 基于 EB 及 TC39X 配置3 Port API 使用1 背景 Port driver 在 AUTOSAR 中是一个比较冷门的模块,基本上在 MCAL 层级,关注的人也少,他由不像其他模块那样通用型比较强,Port 在每种内核的 MCU 的配置都有区别,甚至有些芯片直接没有 Port 模块,使用其他方…

企业级高级美颜美妆SDK解决方案

人们对于美的追求已经不仅仅局限于现实世界,更延伸到了虚拟世界。为了满足这一需求,美摄科技全新开发了一款高级美颜美妆SDK,为企业提供了一站式的美颜美妆解决方案。 这款全新的美颜美妆SDK,是我们对美颜技术的一次全面升级。它…

Java实现布隆过滤器

一、概述 布隆过滤器本质上是一个很长的二进制数组,主要用来判断一个数据存不存在数组里,如果存在就用1表示,不存在用0表示,它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。 …

教你pycharm运行Django第一个项目

文章目录 前言搭建Django:1.新建Django项目:2.为Django项目指定远程中创建的虚拟环境下的python解释器:3.配置ubuntu的端口转发(添加端口号为1234的端口):关于Python技术储备一、Python所有方向的学习路线二、Python基…

Nacos源码解读07——集群数据同步

Distro协议背景 Distro 协议是 Nacos 社区自研的⼀种 AP 分布式协议,是面向临时实例设计的⼀种分布式协议, 其保证了在某些 Nacos 节点宕机后,整个临时实例处理系统依旧可以正常工作。作为⼀种有状态 的中间件应用的内嵌协议,Dis…

【软件推荐】文本转语音,语音转wav,导入ue5

文字转语音 在线免费文字转语音 - TTSMaker官网 | 马克配音https://ttsmaker.cn/ 文件转换器 语音转wav Convertio — 文件转换器https://convertio.co/zh/

[英语学习][10][Word Power Made Easy]的精读与翻译优化

[序言] 下面这段话, 译者翻译没有太大问题, 就是某些单词上, 跟他理解得不一样. 另外还有一个关键的定语从句, 我认为译者理解不到位, 导致翻译不够通顺. [英文学习的目标] 提升自身的英语水平, 对日后编程技能的提升有很大帮助. 希望大家这次能学到东西, 同时加入我的社区讨…

静态HTTP和动态HTTP的混合使用:最佳实践

在当今的互联网环境中,静态HTTP和动态HTTP各有其优势和局限。静态HTTP具有速度快、安全性高和易于维护的特点,而动态HTTP则能够实现动态交互和处理大量动态数据。为了充分利用两者的优势,越来越多的网站开始采用静态HTTP和动态HTTP混合使用的…

两个分数相加。

输入两个分数&#xff0c;例如3/41/2&#xff0c;输出3/41/25/4。 运行程序时&#xff0c;如下图所示&#xff1a; 输入样例1: 1/61/2输出样例2: 1/61/22/3 #include<stdio.h> int gcd(int a,int b) //求最大公约数&#xff08;Greatest Common Divisor&…

代码随想录第二十七天(一刷C语言)|分发饼干摆动序列最大子数组和

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、分发饼干 思路&#xff1a;参考carl文档 局部最优就是大饼干喂给胃口大的&#xff0c;充分利用饼干尺寸喂饱一个&#xff0c;全局最优就是喂饱尽可能多的小孩。尝试使用贪心策略&#x…

FastAPI之声明请求参数示例数据

在Pydantic模型中添加额外的JSON模式数据 您可以声明Pydantic模型的示例&#xff0c;这些示例将被添加到生成的JSON模式中。 示例代码 from fastapi import FastAPI from pydantic import BaseModelapp FastAPI()class Item(BaseModel):name: strdescription: str | None …

设计模式——单例模式(Singleton Pattern)

概述 单例模式确保一个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供整个实例&#xff0c;这个类称为单例类&#xff0c;它提供全局访问的方法。单例模式是一种对象创建型模式。单例模式有三个要点&#xff1a;一是某个类只能有一个实例&#xff1b;二是它必须自行…

WebStorm:Mac/Win上强大的JavaScript开发工具

WebStorm是JetBrains公司开发的针对Mac和Windows系统的JavaScript开发工具。它为开发者提供了一站式的代码编辑、调试、测试和版本控制等功能&#xff0c;帮助你更高效地进行Web开发。新版本的WebStorm 2023在性能和用户体验方面都做出了重大改进&#xff0c;让你的JavaScript开…

冰箱镜头除雾解决方案

冰箱镜头除雾解决方案 1.0 雾气产生原因 由于温度和湿度的变化,导致空气中的水汽凝结在镜头上,形成一层细小的水滴,从而影响了镜头的透光性和清晰度。 这种情况跟汽车玻璃、眼镜等物体表面起雾的原理是一样的, 雾的形成条件 (1)湿度–充足的水汽:①水汽输送(向岸风…

【RHCE】openlab搭建web网站

网站需求&#xff1a; 1、基于域名 www.openlab.com 可以访问网站内容为 welcome to openlab!!! 增加映射 [rootlocalhost ~]# vim /etc/hosts 创建网页 [rootlocalhost ~]# mkdir -p /www/openlab [rootlocalhost ~]# echo welcome to openlab > /www/openlab/index.h…

[足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-2 特征值与特征向量

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-数学基础Ch0-2 特征值与特征向量 1. 定义1.1 线性变换1.2 求解特征值&#xff0c;特征向量1.3 应用&#xff1a;对角化矩阵——解耦Decouple 2. Summary 1. 定义 A v ⃗ λ v ⃗ A\vec{v}\lambd…