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

news2024/11/19 15:13:56

  前面我们学习了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并不常用,我们只是了解一下即可。

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

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

相关文章

【Vulnhub 靶场】【Funbox: GaoKao】【简单】【20210606】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/funbox-gaokao,707/ 靶场下载:https://download.vulnhub.com/funbox/FunboxGaoKao.ova 靶场难度:简单 发布日期:2021年06月06日 文件大小:1.3 GB 靶场作者&#…

虚拟化之指令的Trap和仿真

有时,虚拟机监控程序需要在虚拟机(VM)中模拟操作。例如,VM内的软件可能尝试配置与功耗管理或缓存一致性相关的低级处理器控件。通常,您不希望将VM直接访问这些控件,因为它们可能被用于突破隔离,或影响系统中的其他VM。 trap在执行给定操作(例如读取寄存器)时引发异常…

Python零基础入门之详解sort排序使用

文章目录 1.前言2.环境准备3.程序实现4.sort拓展关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 1.前言 昨天一…

IBL环境贴图原理及着色器实现【基于图像的照明】

IBL - Image Based Lighting - 也就是基于图像的照明,是一组照亮物体的技术,不是像上一章那样通过直接分析光,而是将周围环境视为一个大光源。 这通常是通过操作立方体贴图环境贴图(取自现实世界或从 3D 场景生成)来完…

vuepress-----13、分割config

13、分割config config.js const headConfig require(./config/headConfig); const pluginsConfig require(./config/pluginsConfig); const themeConfig require(./config/themeConfig)module.exports {title: "小邵子",description: 小邵子的个人笔记,head: he…

openEuler JDK21 部署 Zookeeper 集群

zookeeper-jdk21 操作系统:openEuler JDK:21 主机名IP地址spark01192.168.171.101spark02192.168.171.102spark03192.168.171.103 安装 1. 升级内核和软件 yum -y update2. 安装常用软件 yum -y install gcc gcc-c autoconf automake cmake make \zl…

tomcat篇---第一篇

系列文章目录 文章目录 系列文章目录前言一、Tomcat的缺省端口是多少,怎么修改?二、tomcat 有哪几种Connector 运行模式(优化)?三、Tomcat有几种部署方式?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文…

04数据平台Flume

Flume 功能 Flume主要作用,就是实时读取服务器本地磁盘数据,将数据写入到 HDFS。 Flume是 Cloudera提供的高可用,高可靠性,分布式的海量日志采集、聚合和传输的系统工具。 Flume 架构 Flume组成架构如下图所示: A…

重要功能:妙手ERP正式接入北俄海外仓,助力跨境卖家出海俄罗斯市场!

近日,妙手ERP正式接入北俄海外仓,并支持Ozon、速卖通AliExpress、Joom平台卖家同步推送商品、查看库存清单、高效处理订单,助力卖家掘金俄罗斯市场。 关于北俄海外仓 北俄海外仓为北俄国际旗下项目,北俄国际成立于2008年&#xf…

【Java用法】Lombok中@SneakyThrows注解的使用方法和作用

Lombok中SneakyThrows注解的使用方法和作用 一、SneakyThrows的作用二、SneakyThrows注解原理 一、SneakyThrows的作用 普通Exception类,也就是我们常说的受检异常或者Checked Exception会强制要求抛出它的方法声明throws,调用者必须显示的去处理这个异常。设计的目…

企业集团采购系统(供应商、询价、招投标)-源码

一、业务需求 企业招标询价供应商管理系统是一种专业的采购管理系统,旨在帮助企业实现供应商关系的管理和采购成本的控制。该系统涵盖了企业采购管理的各个方面,包括采购预算、供应商管理、产品管理、采购计划、询价、竞价、招标、采购订单、采购合同执…

Docker构建自定义镜像

创建一个docker-demo的文件夹,放入需要构建的文件 主要是配置Dockerfile文件 第一种配置方法 # 指定基础镜像 FROM ubuntu:16.04 # 配置环境变量,JDK的安装目录 ENV JAVA_DIR/usr/local# 拷贝jdk和java项目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo…

前端vue3实现本地及在线文件预览(含pdf/txt/mp3/mp4/docx/xlsx/pptx)

一、仅需实现在线预览,且文件地址公网可访问 (一)微软office免费预览(推荐) 支持doc/docx/xls/xlsx/ppt/pptx等多种office文件格式的免费预览 //示例代码//​在https://view.officeapps.live.com/op/view.aspx?src…

使用autodl服务器,两个3090显卡上运行, Yi-34B-Chat-int4模型,并使用vllm优化加速,显存占用42G,速度23 words/s

1,演示视频地址 https://www.bilibili.com/video/BV1Hu4y1L7BH/ 使用autodl服务器,两个3090显卡上运行, Yi-34B-Chat-int4模型,用vllm优化,增加 --num-gpu 2,速度23 words/s 2,使用3090显卡 和…

JavaScript中的构造函数是什么,如何使用ES6中的类来进行构造函数的封装和继承?

目录 学习目标: 学习内容: 学习时间: 学习讲解: 深入对象 创建对象三种方式 构造函数 练习 实例化执行过程 说明:1. 创建新对象2. 构造函数this指向新对象3. 执行构造函数代码,修改this&#xff…

微信小程序调用相机拍摄或手机相册

wx.chooseMedia(Object object) 功能描述 拍摄或从手机相册中选择图片或视频。

Docker网络原理

Docker网络概述 1.桥接模式介绍 bridge模式是docker的默认网络模式。 桥接模式是一种用于连接两个不同网络段的设备,使它们能够共享通信的一种方式。 桥接设备工作在OSI模型的第二层,即数据链路层,通常基于MAC地址进行帧转发。 物理层连接…

VUE+THREE.JS 点击模型相机缓入查看模型相关信息

点击模型相机缓入查看模型相关信息 1.引入2.初始化CSS3DRenderer3.animate 加入一直执行渲染4.点击事件4.1 初始化renderer时加入监听事件4.2 触发点击事件 5. 关键代码分析5.1 移除模型5.2 创建模型上方的弹框5.3 相机缓入动画5.4 动画执行 1.引入 引入模型所要呈现的3DSprite…

Python 案例实训教学,课程展示及结课存档优化|ModelWhale 版本更新

大雪时节,仲冬如约而至,我们也迎来了 ModelWhale 新一轮的版本更新。 本次更新中,ModelWhale 主要进行了以下功能迭代: 优化 课程大纲展示(团队版✓)优化 作业批量导出存档(团队版✓&#xff…

Windows本地如何添加域名映射?(修改hosts文件)

1. DNS(域名系统) Domain Name System(域名系统):为了加快定位IP地址的速度, 将域名映射进行层层缓存的系统. 目的:互联网通过IP(10.223.146.45)定位浏览器建立连接,但是我们不易区别IP,为了方便用户辨识I…