Linux下学【MySQL】中如何实现:多表查询(配sql+实操图+案例巩固 通俗易懂版~)

news2025/3/6 23:01:15

在这里插入图片描述
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry”

绪论:
本章是MySQL篇中,非常实用性的篇章,相信在实际工作中对于表的查询,很多时候会涉及多表的查询,在多表查询的时候光是前面的篇章可能无法完成,所以本章来了,本章将主要结合:子查询 + 笛卡尔积 的方式来解决多表查询问题,下一章将更新MySQL索引敬请期待~
————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。


复合查询

前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够,所以复合查询就是同时查询多个表中的内容。

1. 回顾查询基本操作

下面将通过几个具体情况来进行回顾

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

分析查询目标:

  1. 工资高于500 / 岗位为MANAGER的雇员(查询)select * from emp where sal > 500 or job = 'MANAGER'

  2. 姓名首字母为大写的... and ename lik 'J%'; / and substring(ename,1,1) = 'J'
    以下表数据来操作:
    在这里插入图片描述

    select * from emp where sal > 500 or job = ‘MANAGER’ and ename lik ‘J%’; / and substring(ename,1,1) = ‘J’

在这里插入图片描述

按照部门号升序而雇员的工资降序排序(order by asc/desc)

比较简单就不分析了,其中要注意的就是对于要进行排序的字段来说:那个在前面那个排序 优先级就较高

select * from emp order by deptno asc,sal desc;

在这里插入图片描述

使用年薪进行降序排序(select 自定义添加新列、ifnull、order by)

年薪 = 月薪sal * 12 + 奖金comm
获取某个人并创建新列(在select后面直接创建要求并可以创建别名)
在这里插入图片描述
其中任何值和NULL运算都会变成NULL(此处该人的comm为NULL)
在这里插入图片描述
此时就要将这种情况避免(使用ifnull)

select sal*12+ifnull(comm,0) 年薪 from emp;

在这里插入图片描述
在加上名称和月薪,奖金,年薪,这样跟好看
在这里插入图片描述
在进行排序得到年薪的降序(order by desc)
在这里插入图片描述

显示工资最高的员工的名字和工作岗位(select 内部允许使用 嵌套select、max函数)
  1. 显示工资最高 select max(sal) from emp; 该情况是在表中不存在的所以需要提前筛选出来!

  2. 员工的名字和工作岗位 select ename job where sal=..

    select ename,job where sal=(select max(sal) from emp);`

在这里插入图片描述

显示工资高于平均工资的员工信息(select嵌套 + avg函数)
  1. 平均工资select avg(sal) 平均工资 from emp ;
    方法类似同上:

    select * from emp where sal > (select avg(sal) from emp);`

在这里插入图片描述

显示每个部门的平均工资和最高工资(group by、format)
  1. 平均工资、最高工资select max(sal) ,avg(sal) from emp;
    在这里插入图片描述

  2. 每个部门(对应着需要分组)goup by deptno

    select deptno, max(sal) ,avg(sal) from emp group by deptno;

在这里插入图片描述
在使用format设置一下小数点:
在这里插入图片描述

显示平均工资低于2000的部门号和它的平均工资(having)
  1. 平均工资(同上)
  2. 平均工资低于2000的部门号(分组)
    就需要对分组之后的数据再做筛选(having)出小于2000的部门号:
    在这里插入图片描述
显示每种岗位的雇员总数,平均工资
  1. 每种岗位(group分组)
  2. 雇员总数,平均工资(筛选内容)
    在这里插入图片描述

2 多表查询(多表笛卡尔积)

结合实例,边练习边了解边快速上手学习

1. 显示部门号为10的部门名,员工名和工资

因为上面的数据(雇员名、雇员工资以及所在部门和部门号为10的)需要来自EMP和DEPT两张表,因此要联合查询
EMP(需要ename、sal)
在这里插入图片描述
DEPT(需要dname):
在这里插入图片描述
将他们直接使用select结合:
在这里插入图片描述

对两张表直接进行整合,他的情况是:将两表中的数据进行穷举组合(笛卡尔积)、任何一种组合都包括了,那么此时得到的就是一张新的表了对该表进行操作,就是单表=操作了
在这里插入图片描述
再对该表进行筛选,选出正确的数据(因为直接穷举的话,他们的数据是不正确的,我们需要将对应部门的数据进行整合,这个部门编号就相当于一个外键的连接作用)
在这里插入图片描述
然后就得到了正确的两表结合的数据(如上图)

回到题目:

  1. 显示雇员名、雇员工资

  2. 所在部门的名字和部门号为10(在表结合后面再添加部门筛选条件)

    select ename, sal,dname from EMP, DEPT where EMP.deptno=DEPT.deptno and DEPT.deptno = 10;

其中需要注意的是deptno的有两个,所以需要筛选一下
在这里插入图片描述

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

需要的新表salgrade:
在这里插入图片描述
结合emp得到新表:
在这里插入图片描述
需要员工的姓名,工资,及工资级别

其中因为是穷举的,所以说表是用问题的,而我们找的是正确的工资等级所以结合sal 、losal、hisal 通过between and来进行分级:
在这里插入图片描述

总结:

在进行多表查询的时候,将两张表合并的方式是笛卡尔积式的穷举结合,这样可能会导致数据出现问题,所以我们需要进行再次的筛选,得到符合目的的新表,再对这个表进行正常的单表处理即可

自连接

自连接是指在同一张表连接查询

同一张表进行笛卡尔积:
在这里插入图片描述
发现:
同一张表并不能直接的进行笛卡尔积合并,但将这张表重命名为两个名字,就能进行合并了,也就是自连接

那什么情况下会使用自连接呢?

显示员工FORD的上级领导的编号和姓名

mgr是员工领导的编号–empno
此处为什么要使用自连接呢?
因为:员工的领导本质也是员工,本题每个员工的领导只是通过编号来指定的,所以说无法直接找到领导的信息
若想找到某个员工的领导姓名的话,就需要员工信息中的领导的编号和表中的员工编号进行比对筛选才能找到领导的信息
在这里插入图片描述

  1. 找到FORD的领导编号----empselect mgr from emp where ename='FORD';

  2. 在从emp表中使用领导编号找领导信息—empselect ename,emobo from emp where ename(...);
    子查询:

    select empno,ename from emp where emp.empno=(select mgr from emp where ename=‘FORD’);

在这里插入图片描述

第二种方式(多表查询,自查询):

  1. 将相同的表重命名为两张表,再进行笛卡尔积合并
  2. 从两表结合的新表中找到FORD
  3. 在从这两张表中获取 判断 表1中的领导编号 = 表二中的员工编号的 信息

在这里插入图片描述

子查询:

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

单行子查询
  • 显示SMITH同一部门的员工

    select * from EMP WHERE deptno = (select deptno from EMP where ename=‘smith’);

在这里插入图片描述

多行子查询
  • 查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
    分析题目:
    在这里插入图片描述
    10号部门岗位(distinct去重): 在这里插入图片描述
in 查看是否包含:

筛选出job岗位包含10号部门岗位的相同的雇员的名字,岗位,工资,部门号:
在这里插入图片描述
其中还不要10号部门的(那么再次筛选 deptno<> 10 、<>就是不等与)
在这里插入图片描述

  • 进一步拓展(结合前面的理解下):本质就是将上面的结果在重命名为一个张表在和其他表进行合并得到领导名称
    其中select子查询还能当成一张表出现在from后面
    在这里插入图片描述
all:获取所有信息
  • 显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
  1. 工资比部门30的所有员工(找到30部门的最高工资进行比较)
  2. 的员工的姓名、工资和部门号(通过前面的最高工资再在表中进行遍历所有比较)

在这里插入图片描述
这种本质也可以,但若想更加的具体且通俗易懂
使用all函数,比较所有情况,不需要提前获取最大的,而是直接比较所有
在这里插入图片描述

any关键字;
  • 显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
    很好理解就不过诉了:
    在这里插入图片描述
多列子查询

单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句
可能有点不太好理解,具体见下面实例:
在这里插入图片描述

  • 查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
    在这里插入图片描述

注意:
任何时刻,查询出来的临时结构,本质在逻辑上也是表结构

子查询与from

子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。

  • 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
    在这里插入图片描述
  1. 找到每个部门的平均工资:在这里插入图片描述

  2. 将原本的表和该表进行笛卡尔积,生成新表(就得到了每个员工和平均工资)在这里插入图片描述

  3. 那么就变成了单标查询
    在这里插入图片描述

  4. 若还需要办公地址,就再需要表:
    在这里插入图片描述

  5. 再次结合,并且去掉没用的值
    在这里插入图片描述

  6. 再筛选出需要的字段:
    在这里插入图片描述

    select ename, deptno, sal, format(asal,2) from EMP, (select avg(sal) asal, deptno dt from EMP group by deptno) tmp where EMP.sal > tmp.asal and EMP.deptno=tmp.dt;

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

select DEPT.deptno, dname, mycnt, loc from DEPT, (select count(*) mycnt, deptno from EMP group by deptno) tmp where DEPT.deptno=tmp.deptno;

在这里插入图片描述
mysql一切皆表
解决多表问题的本质:想办法将多表转化为单表,所以mysql中,所有select的问题全部都可以转成单标问题!

合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all

union

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行
在这里插入图片描述

  • 将工资大于2500或职位是MANAGER的人找出来
    在这里插入图片描述
union all

该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。
在这里插入图片描述

其中注意的话使用union进行拼接的前提是列相同:
在这里插入图片描述


本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量MySQL细致内容,早关注不迷路。

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

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

相关文章

非平稳时间序列分析(三)——季节模型(SARIMA、STL、Holt-Winters)

此前篇章&#xff08;平稳序列&#xff09;&#xff1a; 时间序列分析&#xff08;一&#xff09;——基础概念篇 时间序列分析&#xff08;二&#xff09;——平稳性检验 时间序列分析&#xff08;三&#xff09;——白噪声检验 时间序列分析&#xff08;四&#xff09;—…

【web前端开发】CSS--CSS简介及其编写位置(上)

1、CSS简介 &#xff08;1&#xff09;CSS的全称为&#xff1a;层叠式样式表&#xff08;Cascading Style Sheets&#xff09; &#xff08;2&#xff09;CSS也是一种标记语言&#xff0c;用于给HTML结构设置样式&#xff0c;例如&#xff1a;文字大小、颜色、元素宽度等等…

云原生时代的技术桥梁

在数字化转型的大潮中&#xff0c;企业面临着数据孤岛、应用间集成复杂、高成本与低效率等问题。这些问题不仅阻碍了企业内部信息的流通和资源的共享&#xff0c;也影响了企业对外部市场变化的响应速度。当前&#xff0c;这一转型过程从IT角度来看&#xff0c;已然迈入云原生时…

【数据结构】什么是栈||栈的经典应用||分治递归||斐波那契问题和归并算法||递归实现||顺序栈和链栈的区分

文章目录 &#x1f967;栈的初步理解&#xff1a;&#x1f967;易错&#xff1a;如何判断栈满&#x1f967;栈满理解&#x1f967;栈的基本运算&#x1f4da;栈操作的伪代码逻辑&#xff08;顺序和链栈&#xff09;&#x1f4d5;顺序栈运算实现&#xff1a;顺序栈的表示&#x…

雷池WAF的为什么选择基于Docker

Docker 是一种开源的容器化平台&#xff0c;可以帮助开发人员将应用程序及其所有依赖项打包到一个称为容器的独立、可移植的环境中。Docker 的核心概念包括以下几点&#xff1a; 容器&#xff1a;Docker 使用容器来封装应用程序及其依赖项&#xff0c;使其能够在任何环境中都能…

Ubuntu20.04双系统安装及软件安装(七):Anaconda3

Ubuntu20.04双系统安装及软件安装&#xff08;七&#xff09;&#xff1a;Anaconda3 打开Anaconda官网&#xff0c;在右侧处填写邮箱&#xff08;要真实有效&#xff01;&#xff09;&#xff0c;然后Submit。会出现如图示的Success界面。 进入填写的邮箱&#xff0c;有一封Ana…

文件上传漏洞:upload-labs靶场11-20

目录 pass-11 pass-12 pass-13 pass-14 pass-15 pass-16 pass-17 pass-18 pass-19 pass-20 pass-11 分析源代码 &#xff0c;发现上传文件的存放路径可控 if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],st…

HTTP协议(20250305)

1. 万维网 WWW(World Wide Web)世界范围内的&#xff0c;联机式的信息储藏所&#xff0c;万维网解决了获取互联网上的数据时需要解决的以下问题&#xff1a; 怎样标识分布在整个互联网上的文档 URL用什么样的协议实现万维网上的各种链接 HTTP怎么使用户能够方便的查看文档数…

Qt中txt文件输出为PDF格式

main.cpp PdfReportGenerator pdfReportGenerator;// 加载中文字体if (QFontDatabase::addApplicationFont(":/new/prefix1/simsun.ttf") -1) {QMessageBox::warning(nullptr, "警告", "无法加载中文字体");}// 解析日志文件QVector<LogEntr…

FPGA 高速接口Aurora8B/10B 协议详解与仿真

FPGA 高速接口Aurora8B/10B 协议详解与IP仿真 1 摘要 Aurora 8B/10B 是一种用于高速串行通信的协议&#xff0c;通常用于 FPGA 设计和其他数字通信应用。即一种编码方案&#xff0c;旨在在传输数据时提供可靠性、时钟恢复和错误检测。主要用于在点对点串行链路间移动数据的可…

【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘

摘要 支持向量机&#xff08;SVM&#xff09;是机器学习中的经典算法&#xff01;本文将深入解析最大间隔分类原理&#xff0c;手撕对偶问题推导过程&#xff0c;并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南&#xff0c;助力你掌握这一核心算法…

AORO P9000 PRO三防平板携手RTK高精度定位,电力巡检效率倍增

电网系统覆盖幅员辽阔&#xff0c;每年因设备故障导致的巡检耗时超过百万工日。传统巡检模式受限于定位误差、设备防护不足和作业效率低下三大核心痛点&#xff0c;亟需智能化工具的突破性革新。为了满足这一需求&#xff0c;遨游通讯推出AORO P9000 PRO三防平板&#xff0c;以…

游戏引擎学习第135天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中&#xff0c;不使用任何现成的游戏引擎或第三方库&#xff0c;而是直接基于 Windows 进行开发&#xff0c;因为 Windows 目前仍然是游戏的标准平台&#xff0c;因此首先在这个环境中进行…

关联封号率降70%!2025最新IP隔离方案实操手册

高效运营安全防护&#xff0c;跨境卖家必看的风险规避指南 跨境账号管理的核心挑战&#xff1a;关联封号风险激增 2024年&#xff0c;随着全球电商平台对账号合规的审查日益严苛&#xff0c;“关联封号”已成为跨境卖家最头疼的问题之一。无论是同一IP登录多账号、员工操作失误…

【深度学习CV】【图像分类】从CNN(卷积神经网络)、ResNet迁移学习到GPU高效训练优化【案例代码】详解

摘要 本文分类使用的是resNet34,什么不用yolo v8&#xff0c;yolo v10系列,虽然他们也可以分类&#xff0c;因为yolo系列模型不纯粹&#xff0c;里面包含了目标检测的架构&#xff0c;所以分类使用的是resNet 本文详细介绍了三种不同的方法来训练卷积神经网络进行 CIFAR-10 图…

如何排查服务器内存泄漏问题

服务器内存泄漏是一种常见的问题&#xff0c;可能导致系统性能下降甚至系统崩溃。以下是一般情况下用于排查服务器内存泄漏问题的步骤&#xff1a; 排查服务器内存泄漏问题的步骤&#xff1a; 监控系统资源&#xff1a; 使用系统监控工具&#xff08;如top、htop、free&#x…

Ubuntu20.04双系统安装及软件安装(九):谷歌浏览器

Ubuntu20.04双系统安装及软件安装&#xff08;九&#xff09;&#xff1a;谷歌浏览器 打开终端&#xff0c;下载谷歌浏览器软件包&#xff1a; wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb下载完成后直接在原终端执行&#xff1a; sudo…

有关Java中的集合(1):List<T>和Set<T>

学习目标 核心掌握List集合了解Set集合 1.List<T> ● java.util.List。有序列表。 ● List集合元素的特点&#xff1a;有序表示存取有序&#xff08;因为有索引&#xff09;而且可以重复 ● List常用实现类&#xff1a; ArrayList、LinkedList、Vector等 1.1 常用方法…

【C++STL之vector】vector容器浅析

文章目录 &#x1f31f; 深入探索C vector&#xff1a;从青铜到王者的动态数组进阶指南 &#x1f31f;&#x1f680; 开篇&#xff1a;为什么vector是C程序员的瑞士军刀&#xff1f;&#x1f50d; 一、vector的本质解密&#xff1a;不只是智能数组那么简单1.1 动态数组的华丽蜕…

Redis的持久化-RDBAOF

文章目录 一、 RDB1. 触发机制2. 流程说明3. RDB 文件的处理4. RDB 的优缺点 二、AOF1. 使用 AOF2. 命令写⼊3. 文件同步4. 重写机制5 启动时数据恢复 一、 RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程&#xff0c;触发 RDB 持久化过程分为手动触发和自动触发。 …