Linux下学【MySQL】中如何实现:多表查询(配sql+实操图+案例巩固 通俗易懂版~)
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry”
绪论:
本章是MySQL篇中,非常实用性的篇章,相信在实际工作中对于表的查询,很多时候会涉及多表的查询,在多表查询的时候光是前面的篇章可能无法完成,所以本章来了,本章将主要结合:子查询 + 笛卡尔积 的方式来解决多表查询问题,下一章将更新MySQL索引敬请期待~
————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。
复合查询
前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够,所以复合查询就是同时查询多个表中的内容。
1. 回顾查询基本操作
下面将通过几个具体情况来进行回顾
查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J(where、or/and 、like)
分析查询目标:
- 工资高于500 / 岗位为MANAGER的雇员(查询)
select * from emp where sal > 500 or job = 'MANAGER'
- 姓名首字母为大写的
... 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函数)
- 显示工资最高
select max(sal) from emp;
该情况是在表中不存在的所以需要提前筛选出来! - 员工的名字和工作岗位
select ename job where sal=..
select ename,job where sal=(select max(sal) from emp);`
显示工资高于平均工资的员工信息(select嵌套 + avg函数)
- 平均工资
select avg(sal) 平均工资 from emp ;
方法类似同上:
select * from emp where sal > (select avg(sal) from emp);`
group by 分组
GROUP BY: 子句用于将查询结果按照指定的列进行分组,通常与聚合函数一起使用。
显示每个部门的平均工资和最高工资(format)
- 平均工资、最高工资
select max(sal) ,avg(sal) from emp;
- 每个部门(对应着需要分组)
goup by deptno
select deptno, max(sal) ,avg(sal) from emp group by deptno;
在使用format设置一下小数点:
having
HAVING 子句:用于对分组后的结果进行条件过滤,类似于 WHERE,但专门用于分组后的筛选。
显示平均工资低于2000的部门号和它的平均工资
- 平均工资(同上)
- 平均工资低于2000的部门号(分组)
就需要对分组之后的数据再做筛选(having)出小于2000的部门号:
显示每种岗位的雇员总数,平均工资
- 每种岗位(group分组)
- 雇员总数,平均工资(筛选内容)
2 多表查询(多表笛卡尔积)
结合实例,边练习边了解边快速上手学习
1. 显示部门号为10的部门名,员工名和工资
因为上面的数据(雇员名、雇员工资以及所在部门和部门号为10的)需要来自EMP和DEPT两张表,因此要联合查询
EMP(需要ename、sal)
DEPT(需要dname):
将他们直接使用select结合:
对两张表直接进行整合,他的情况是:将两表中的数据进行穷举组合(笛卡尔积)、任何一种组合都包括了,那么此时得到的就是一张新的表了对该表进行操作,就是单表=操作了
再对该表进行筛选,选出正确的数据(因为直接穷举的话,他们的数据是不正确的,我们需要将对应部门的数据进行整合,这个部门编号就相当于一个外键的连接作用)
然后就得到了正确的两表结合的数据(如上图)
回到题目:
- 显示雇员名、雇员工资
- 所在部门的名字和部门号为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
此处为什么要使用自连接呢?
因为:员工的领导本质也是员工,本题每个员工的领导只是通过编号来指定的,所以说无法直接找到领导的信息
若想找到某个员工的领导姓名的话,就需要员工信息中的领导的编号和表中的员工编号进行比对筛选才能找到领导的信息
- 找到FORD的领导编号----emp
select mgr from emp where ename='FORD';
- 在从emp表中使用领导编号找领导信息—emp
select ename,emobo from emp where ename(...);
子查询:
select empno,ename from emp where emp.empno=(select mgr from emp where ename='FORD');
第二种方式(多表查询,自查询):
- 将相同的表重命名为两张表,再进行笛卡尔积合并
- 从两表结合的新表中找到FORD
- 在从这两张表中获取 判断 表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的所有员工的工资高的员工的姓名、工资和部门号
- 工资比部门30的所有员工(找到30部门的最高工资进行比较)
- 的员工的姓名、工资和部门号(通过前面的最高工资再在表中进行遍历所有比较)
这种本质也可以,但若想更加的具体且通俗易懂
使用all函数,比较所有情况,不需要提前获取最大的,而是直接比较所有
any关键字;
- 显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
很好理解就不过诉了:
多列子查询
单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句
可能有点不太好理解,具体见下面实例:
- 查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人
注意:
任何时刻,查询出来的临时结构,本质在逻辑上也是表结构
子查询与from
子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。
- 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
- 找到每个部门的平均工资:
- 将原本的表和该表进行笛卡尔积,生成新表(就得到了每个员工和平均工资)
- 那么就变成了单标查询
- 若还需要办公地址,就再需要表:
- 再次结合,并且去掉没用的值
- 再筛选出需要的字段:
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细致内容,早关注不迷路。
相关文章:

Linux下学【MySQL】中如何实现:多表查询(配sql+实操图+案例巩固 通俗易懂版~)
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本章是MySQL篇中,非常实用性的篇章,相信在实际工作中对于表的查询,很多时候会涉及多表的查询,在多表查询…...

ubuntu局域网部署stable-diffusion-webui记录
需要局域网访问,如下设置: 过程记录查看源码: 查看源码,原来修改参数:--server-name 故启动: ./webui.sh --server-name0.0.0.0 安装下载记录: 快速下载可设置: export HF_ENDPOI…...

最基于底层的运算符——位运算符
位运算符是直接对二进制位(bit)进行操作的运算符,它们在底层开发、算法优化和特定场景(如位掩码、数据压缩)中非常高效。以下是常见位运算符的详解、使用技巧及注意事项: 一、六大核心位运算符 1. 按位与&…...

代码随想录算法训练营第三十二天 | 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
509. 斐波那契数 力扣题目链接(opens new window) 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n -…...

3-9 WPS JS宏单元格复制、重定位应用(拆分单表到多表)
************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...

C++ 中前置 `++` 与后置 `++` 运算符重载
C 中前置 与后置 运算符重载的设计原理与使用规范 1. 为什么后置 返回对象而不是引用? 原因: 后置 需要返回自增前的旧值,但旧值在运算后已被修改。为了保存旧值,必须在函数内部创建一个临时对象(拷贝原对象的状态…...

Scala:case class(通俗易懂版)
1. case class 是什么? 想象你要做一个表格,比如学生信息表,每一行需要填:姓名、年龄、成绩。 在代码里,这种“表格的一行”就是一个数据对象,case class 就是帮你快速创建这种“表格行”的工具。 普通方…...

Vue、React、原生小程序的写法对比差异
以下是从 变量、方法、路由、状态管理、父子传值 等多个维度对 Vue、React、原生小程序 的对比表格: 技术对比表格 功能/技术Vue (Options/Composition API)React (Hooks)原生微信小程序变量定义data() { return { count: 0 } }(Options API)const count = ref(0)(Composition…...

【AIGC系列】6:HunyuanVideo视频生成模型部署和代码分析
AIGC系列博文: 【AIGC系列】1:自编码器(AutoEncoder, AE) 【AIGC系列】2:DALLE 2模型介绍(内含扩散模型介绍) 【AIGC系列】3:Stable Diffusion模型原理介绍 【AIGC系列】4࿱…...

java 初学知识点总结
自己总结着玩 1.基本框架 public class HelloWorld{ public static void main(String[] args){ }//类名用大写字母开头 } 2.输入: (1)Scanner:可读取各种类型,字符串相当于cin>>; Scanner anew Scanner(System.in); Scan…...

Android MVC、MVP、MVVM三种架构的介绍和使用。
写在前面:现在随便出去面试Android APP相关的工作,面试官基本上都会提问APP架构相关的问题,用Java、kotlin写APP的话,其实就三种架构MVC、MVP、MVVM,MVC和MVP高度相似,区别不大,MVVM则不同&…...

AI视频领域的DeepSeek—阿里万相2.1图生视频
让我们一同深入探索万相 2.1 ,本文不仅介绍其文生图和文生视频的使用秘籍,还将手把手教你如何利用它实现图生视频。 如下为生成的视频效果(我录制的GIF动图) 如下为输入的图片 目录 1.阿里巴巴全面开源旗下视频生成模型万相2.1模…...

IDEA 2024.1.7 Java EE 无框架配置servlet
1、创建一个目录(文件夹)lib来放置我们的库 2、将tomcat目录下的lib文件夹中的servlet-api.jar文件复制到刚创建的lib文件夹下。 3、把刚才复制到lib下的servlet-api.jar添加为库 4、在src下新建一个package:com.demo,然后创…...

STM32---FreeRTOS中断管理试验
一、实验 实验目的:学会使用FreeRTOS的中断管理 创建两个定时器,一个优先级为4,另一个优先级为6;注意:系统所管理的优先级范围 :5~15 现象:两个定时器每1s,打印一段字符串&#x…...

深色系B端系统界面,在何种场景下更加适合?
在数字化办公日益普及的当下,B 端系统已成为企业运营管理不可或缺的工具。B 端系统界面设计的优劣,直接影响着用户体验和工作效率。界面不仅仅是人与系统交互的媒介,更是企业业务流程的可视化呈现。随着设计理念和技术的不断发展,…...

如何使用 Python+Flask+win32print 实现简易网络打印服务1
Python 实现网络打印机:Flask win32print 在工作场景中,我们可能需要一个简单的网页接口,供他人上传文档并自动打印到指定打印机。 本文将演示如何使用 Python Flask win32print 库来实现这一需求。 代码详见:https://github.…...

深度学习DNN实战
导包: import matplotlib as mpl import matplotlib.pyplot as plt %matplotlib inline import numpy as np import sklearn import pandas as pd import os import sys import time from tqdm.auto import tqdm import torch import torch.nn as nn import torch…...

课程3. 分批训练与数据规范、标准化
课程3. 分批训练与数据规范、标准化 理论神经网络的梯度优化反向传播算法 批量训练网络输入的规范化BatchNorm 验证样本实践加载数据集网络构建训练神经网络 课程计划: 1.理论: 批量训练; 输入数据的规范化; 批量标准化ÿ…...

《机器学习数学基础》补充资料:过渡矩阵和坐标变换推导
尽管《机器学习数学基础》这本书,耗费了比较长的时间和精力,怎奈学识有限,错误难免。因此,除了在专门的网页( 勘误和修订 )中发布勘误和修订内容之外,对于重大错误,我还会以专题的形…...

linux指令学习--sudo apt-get install vim
1. 命令分解 部分含义sudo以管理员权限运行命令(需要输入用户密码)。apt-getUbuntu 的包管理工具,用于安装、更新、卸载软件包。installapt-get 的子命令,表示安装软件包。vim要安装的软件包名称(Vim 文本编辑器&…...

类和对象—多态—案例2—制作饮品
案例描述: 制作饮品的大致流程为:煮水-冲泡-倒入杯中-加入辅料 利用多态技术实现本案例,提供抽象制作产品基类,提供子类制作咖啡和茶叶 思路解析: 1. 定义抽象基类 - 创建 AbstractDrinking 抽象类,该类…...

嵌入式产品级-超小尺寸游戏机(从0到1 硬件-软件-外壳)
Ultra-small size gaming console。 超小尺寸游戏机-Pico This embedded product is mainly based on miniaturization, followed by his game functions are also very complete, for all kinds of games can be played, and there will be relevant illustrations in the fo…...

计算机毕业设计Python+Django+Vue3微博数据舆情分析平台 微博用户画像系统 微博舆情可视化(源码+ 文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

前端开发10大框架深度解析
摘要 在现代前端开发中,框架的选择对项目的成功至关重要。本文旨在为开发者提供一份全面的前端框架指南,涵盖 React、Vue.js、Angular、Svelte、Ember.js、Preact、Backbone.js、Next.js、Nuxt.js 和 Gatsby。我们将从 简介、优缺点、适用场景 以及 实际…...

Mybatis 的关联映射(一对一,一对多,多对多)
前言 在前面我们已经了解了,mybatis 的基本用法,动态SQL,学会使用mybatis 来操作数据库。但这些主要操作还是针对 单表实现的。在实际的开发中,对数据库的操作,常常涉及多张表。 因此本篇博客的目标:通过my…...

深度解码!清华大学第六弹《AIGC发展研究3.0版》
在Grok3与GPT-4.5相继发布之际,《AIGC发展研究3.0版》的重磅报告——这份长达200页的行业圣经,不仅预测了2025年AI技术爆发点,更将「天人合一」的东方智慧融入AI伦理建构,堪称数字时代的《道德经》。 文档:清华大学第…...

/dev/console文件详解
/dev/console概览 /dev/console 是 Linux 系统中的一个特殊设备文件,通常用于与系统的控制台进行交互。它的作用和特点如下: 1. 作用 init 进程(PID 1)和某些系统服务在启动时会使用 /dev/console 进行日志输出,以确…...

ProfibusDP主站转ModbusTCP网关如何进行数据互换
ProfibusDP主站转ModbusTCP网关如何进行数据互换 在现代工业自动化领域,通信协议的多样性和复杂性不断增加。Profibus DP作为一种经典的现场总线标准,广泛应用于工业控制网络中;而Modbus TCP作为基于以太网的通信协议,因其简单易…...

springboot3 WebClient
1 介绍 在 Spring 5 之前,如果我们想要调用其他系统提供的 HTTP 服务,通常可以使用 Spring 提供的 RestTemplate 来访问,不过由于 RestTemplate 是 Spring 3 中引入的同步阻塞式 HTTP 客户端,因此存在一定性能瓶颈。根据 Spring 官…...

牛客周赛 Round 83
A.和猫猫一起起舞! 思路:遇到‘U’和‘D’,输出‘R’或者‘L’;遇到‘R’和‘L’,输出‘U’或者‘D’.(这题比较简单) AC代码: void solve() {int n, m, k;char ch;cin >> ch;if (ch U || ch D)…...