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

在这里插入图片描述
每日激励:“不设限和自我肯定的心态: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 分组

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设置一下小数点:
在这里插入图片描述

having

HAVING 子句用于对分组后的结果进行条件过滤,类似于 WHERE,但专门用于分组后的筛选。

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

  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.mzph.cn/web/71411.shtml

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

相关文章

【基础4】插入排序

核心思想 插入排序是一种基于元素比较的原地排序算法&#xff0c;其核心思想是将数组分为“已排序”和“未排序”两部分&#xff0c;逐个将未排序元素插入到已排序部分的正确位置。 例如扑克牌在理牌的时候&#xff0c;一般会将大小王、2、A、花牌等按大小顺序插入到左边&…

【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计

【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计 1. **欺诈场景分类与案例说明**1.1 **大额交易欺诈**1.2 **异地交易欺诈**1.3 **高频交易欺诈**1.4 **异常时间交易欺诈**1.5 **账户行为异常**1.6 **设备指纹异常**1.7 **交易金额突变** 2. **普适性软…

迷你世界脚本生物接口:Creature

生物接口&#xff1a;Creature 彼得兔 更新时间: 2024-05-22 17:51:22 继承自 Actor 具体函数名及描述如下: 序号 函数名 函数描述 1 getAttr(...) 生物属性获取 2 setAttr(...) 生物属性设置 3 isAdult(...) 判断该生物是否成年 4 setOxygenNeed(…

深入理解三色标记、CMS、G1垃圾回收器

三色标记算法 简介 三色标记算法是一种常见的垃圾收集的标记算法&#xff0c;属于根可达算法的一个分支&#xff0c;垃圾收集器CMS&#xff0c;G1在标记垃圾过程中就使用该算法 三色标记法&#xff08;Tri-color Marking&#xff09;是垃圾回收中用于并发标记存活对象的核心算…

自动驾驶---不依赖地图的大模型轨迹预测

1 前言 早期传统自动驾驶方案通常依赖高精地图&#xff08;HD Map&#xff09;提供道路结构、车道线、交通规则等信息&#xff0c;可参考博客《自动驾驶---方案从有图迈进无图》&#xff0c;本质上还是存在问题&#xff1a; 数据依赖性高&#xff1a;地图构建成本昂贵&#xf…

Xshell及Xftp v8.0安装与使用-生信工具050

官网 https://www.xshell.com/zh/free-for-home-school/ XShell & Xftp 详解 1. XShell 介绍 1.1 XShell 是什么&#xff1f; XShell 是一款强大的 Windows 终端模拟器&#xff0c;主要用于远程管理 Linux、Unix 服务器。它支持 SSH、Telnet、Rlogin 及 SFTP 协议&…

跨域-告别CORS烦恼

跨域-告别CORS烦恼 文章目录 跨域-告别CORS烦恼[toc]1-参考网址2-思路整理1-核心问题2-个人思考3-脑洞打开4-个人思考-修正版1-个人思考2-脑洞打开 3-知识整理1-什么是跨域一、同源策略简介什么是源什么是同源是否是同源的判断哪些操作不受同源策略限制跨域如何跨域 二、CORS 简…

PE文件结构详解(DOS头/NT头/节表/导入表)使用010 Editor手动解析notepad++.exe的PE结构

一&#xff1a;DOS部分 DOS部分分为DOS MZ文件头和DOS块&#xff0c;其中DOS MZ头实际是一个64位的IMAGE_DOS——HEADER结构体。 DOS MZ头部结构体的内容如下&#xff0c;我们所需要关注的是前面两个字节&#xff08;e_magic&#xff09;和后面四个字节&#xff08;e_lfanew&a…

Node JS 调用模型Xenova_all-MiniLM-L6-v2实战

本篇通过将句子数组转换为句子的向量表示&#xff0c;并通过平均池化和归一化处理&#xff0c;生成适合机器学习或深度学习任务使用的特征向量为例&#xff0c;演示通过NodeJS 的方式调用Xenova/all-MiniLM-L6-v2 的过程。 关于 all-MiniLM-L6-v2 的介绍&#xff0c;可以参照上…

【C++学习篇】智能指针

目录 1. 智能指针的使用场景分析 2. RAII和智能指针的设计思路 3. C标准库智能指针的使用 4.shared_ptr和weak_ptr 4.1shared_ptr的循环引用问题 4.2 weak_ptr 1. 智能指针的使用场景分析 下⾯程序中我们可以看到&#xff0c;new了以后&#xff0c;我们也delete了&#xff0c…

IntelliJ IDEA集成MarsCode AI

IntelliJ IDEA集成MarsCode AI IDEA中安装插件 安装完毕之后登录自己的账号 点击链接&#xff0c;注册账号 https://www.marscode.cn/events/s/i5DRGqqo/ 可以选择不同的模型

日期格式与字符串不匹配bug

异常特征&#xff1a;java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.String ### Error updating database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.Str…

C++中的无锁编程

引言 在当今多核处理器普及的时代&#xff0c;并发编程已成为高性能应用程序开发的关键技术。传统的基于锁的同步机制虽然使用简单&#xff0c;但往往会带来性能瓶颈和死锁风险。无锁编程&#xff08;Lock-Free Programming&#xff09;作为一种先进的并发编程范式&#xff0c…

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

文章目录 FastGPT 引申&#xff1a;借鉴 FastGPT 基于MySQL ES 实现知识库&#xff08;含表结构以及核心代码&#xff09;一、整体思路二、存储结构2.1 MySQL 表结构(1) knowledge_base_dataset(2) knowledge_base_data(3) knowledge_base_index(4) ai_kb_relation 2.2 Elasti…

Python学习(十四)pandas库入门手册

目录 一、安装与导入二、核心数据结构2.1 Series 类型&#xff08;一维数组&#xff09;2.2 DataFrame 类型&#xff08;二维数组&#xff09; 三、数据读取与写入3.1 读取 CSV 和 Excel 文件3.2 写入数据 四、数据清洗与处理4.1 处理缺失值4.2 数据筛选4.3 数据排序 五、数据分…

【Python 数据结构 4.单向链表】

目录 一、单向链表的基本概念 1.单向链表的概念 2.单向链表的元素插入 元素插入的步骤 3.单向链表的元素删除 元素删除的步骤 4.单向链表的元素查找 元素查找的步骤 5.单向链表的元素索引 元素索引的步骤 6.单向链表的元素修改 元素修改的步骤 二、Python中的单向链表 ​编辑 三…

第1章:项目概述与环境搭建

第1章&#xff1a;项目概述与环境搭建 学习目标 了解YunChangAction灵感记录应用的整体架构和功能掌握SwiftUI开发环境的配置方法创建项目基础结构并理解文件组织方式实现应用的启动屏幕和基本主题设置 理论知识讲解 灵感记录应用概述 灵感记录应用是一种专门设计用来帮助…

2025.3.3总结

周一这天&#xff0c;我约了绩效教练&#xff0c;主要想了解专业类绩效的考核方式以及想知道如何拿到一个更好的绩效。其他的岗位并不是很清楚&#xff0c;但是专业类的岗位&#xff0c;目前采取绝对考核&#xff0c;管理层和专家岗采取相对考核&#xff0c;有末尾淘汰。 通过…

FastGPT 源码:基于 LLM 实现 Rerank (含Prompt)

文章目录 基于 LLM 实现 Rerank函数定义预期输出实现说明使用建议完整 Prompt 基于 LLM 实现 Rerank 下边通过设计 Prompt 让 LLM 实现重排序的功能。 函数定义 class LLMReranker:def __init__(self, llm_client):self.llm llm_clientdef rerank(self, query: str, docume…

LeetCode 1745.分割回文串 IV:动态规划(用III或II能直接秒)

【LetMeFly】1745.分割回文串 IV&#xff1a;动态规划&#xff08;用III或II能直接秒&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/palindrome-partitioning-iv/ 给你一个字符串 s &#xff0c;如果可以将它分割成三个 非空 回文子字符串&#xff0c;…