当前位置: 首页 > news >正文

MySQL-多表联合查询

 🎉欢迎您来到我的MySQL基础复习专栏

☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹
✨博客主页:小小恶斯法克的博客
🎈该系列文章专栏:重拾MySQL
🍹文章作者技术和水平很有限,如果文中出现错误,希望大家能指正🙏
📜 感谢大家的关注! ❤️

目录

🚀联合查询

🚀子查询

🚀标量子查询

🚀列子查询

🚀行子查询

🚀​​​​​​表子查询


🚀联合查询

union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集

主要代码:

SELECT 字段列表	FROM	表 A ...UNION [ ALL ]SELECT 字段列表  FROM	表B	;

联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。

union all 会将全部的数据直接合并在一起,并不会去重

union 会对合并之后的数据去重。

案例:将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来.

思路:

1.直接使用多条件查询,使用逻辑运算符 or 连接

2.通过union/union all来联合查询

select * from empcp where salary < 5000union allselect * from empcp where age > 50; --联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。

执行:

第一部分

第二部分

联合(即要薪资低于5000的员工,又要年龄大于50的员工,那么就意味着这两条数据要合并,关键字union all

我们发现union all查询出来的结果,有一个员工k是重复的,k的薪资低于5000,年龄又大于50,所以查询了两次,数据直接合并,仅仅进行简单的合并,并未去重。

select * from empcp where salary < 5000unionselect * from empcp where age > 50;

执行:

我们发现union联合查询,会对查询出来的结果进行去重处理。

注意:

如果多条查询语句查询出来的结果,字段数量不一致,在进行union/union all联合查询时,将会报错。如:

🚀子查询

SQL语句中嵌套的SELECT语句,称为嵌套查询,又称子查询。

SELECT * FROM	t1	WHERE column1 = ( SELECT column1 FROM t2 ); 

注意!子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个。

此时,子查询因为存在嵌套关系,逻辑性较强,代码是比较变通的,切不可死记硬背,根据逻辑去思考问题

根据子查询结果不同,可分为:

1.标量子查询(子查询结果为单个值)

2.列子查询(子查询结果为一列)

3.行子查询(子查询结果为一行)

4.表子查询(子查询结果为多行多列)

根据子查询位置,可分为:

1.WHERE之后

2.FROM之后

3.SELECT之后

🚀标量子查询

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。  常用的操作符:= <>  >    >= <  <=

案例:

查询 "销售部" 的所有员工信息

思路:

拆解为两步 (因为在员工表中是没有存储销售部这个部门名称的,仅仅只有部门id)

1.查询"销售部" 部门ID

select id from dept where name = '销售部';

2.根据 "销售部" 部门ID, 查询员工信息,用*返回员工所有信息的字段

select * from empcp where dept_id = (select id from dept where name = '销售部');
或者
select * from empcp where dept_id = 4 ;

执行:

执行:

查询在 "e"这个员工 入职之后的员工信息

思路:

拆解为两步

1.查询 e 的入职日期

select entrydate from empcp where name = 'e';

2.查询指定入职日期之后入职的员工信息

select * from empcp where entrydate > (select entrydate from empcp where name = 'e');
或者
select * from empcp where entrydate > 2004-9-7 ;

执行:

执行:

当然,我们需要了解entrydate是如何比较呢?

在SQL中,entrydate是一个字段名,通常表示一个日期或日期时间类型的数据。

要比较entrydate字段,你可以使用各种比较运算符,如=<><=>=<>!=

以下是一些示例,说明如何比较entrydate字段:

1.等于,大于,小于,小于等于,大于等于,不等于就不过多演示了,因为直接更改比较运算符即可

SELECT * FROM your_table WHERE entrydate = '2023-10-23';
-- =可以改为<,>,<>,<=,>=......

2.BETWEEN: 如果你想选择一个日期范围内的记录,你可以使用BETWEEN:

SELECT * FROM your_table WHERE entrydate BETWEEN '2023-10-01' AND '2023-10-31';

这个查询会返回所有entrydate在'2023-10-01'和'2023-10-31'之间的记录。注意,BETWEEN运算符是包含边界值的。


3. LIKE 和日期: 如果你想基于日期的部分部分进行比较,例如查找以特定年份开始的日期,你可以使用LIKE:

SELECT * FROM your_table WHERE entrydate LIKE '2023%';

这个查询会返回所有以'2023'开头的entrydate的记录。LIKE运算符通常与通配符一起使用,如%表示任何数量的任何字符。


4. DATE() 函数: 如果你只想比较日期部分而忽略时间部分,你可以使用DATE()函数:

SELECT * FROM your_table WHERE DATE(entrydate) = '2023-10-23';

这个查询只会比较日期部分,忽略时间部分。这对于只关心日期而不关心具体时间的情况很有用。

5. 时间间隔: 如果你想基于两个日期之间的时间间隔进行比较,你可以使用减法:

SELECT * FROM your_table WHERE DATEDIFF(day, entrydate, '2023-10-23') > 5;

这个查询会返回所有与'2023-10-23'相差超过5天的entrydate的记录。DATEDIFF()函数根据指定的时间间隔返回两个日期之间的差异。在这个例子中,我们使用天作为时间间隔单位。不同的数据库系统可能有不同的函数来计算日期差异,所以请根据你使用的系统查阅相应的文档。

🚀列子查询

子查询返回的结果是一列(可以是多行),这种子查询称为列子查询

常用的操作符:IN 、NOT IN ANY SOME ALL

操作符

描述

IN

在指定的集合范围之内,多选一

NOT IN

不在指定的集合范围之内

ANY

子查询返回列表中,有任意一个满足即可

SOME

与ANY等同,使用SOME的地方都可以使用ANY

ALL

子查询返回列表的所有值都必须满足

案例:

查询 "销售部" 和 "市场部" 的所有员工信息

思路:

分解为两步

1.查询 "销售部" "市场部" 的部门ID

select id from dept where name = '销售部' or name = '市场部';

2.根据部门ID, 查询员工信息  (由于是两个元素,所以用到了in)

select * from empcp where dept_id in (select id from dept where name = '销售部' or name = '市场部');
或者
select * from empcp where dept_id in(2,4) --2.4是上述语句查询的结果,所以我们可以把2,4替换掉,让上面的语句作为子查询存在

而由于内部的sql查询出来不再是一个单个值了,而是一列,多行。所以这种子查询称为列子查询

执行:

执行:

查询比 财务部 所有人工资都高的员工信息

思路:

分解为以下两步

1.查询所有 财务部 人员工资

select id from dept where name = '财务部'; select salary from empcp where dept_id = (select id from dept where name = '财务部');
或者
select salary from empcp where dept_id = 3;

2.比 财务部 所有人工资都高的员工信息 (这个salary要大于这三个工资的所有值,比其中任何一个大,此时就要大于这个列表中所有值,要加上all

select * from empcp where salary > all ( select salary from empcp where dept_id =(select id from dept where name = '财务部') );

执行:

执行:

查询比 研发部 其中任意一人工资高的员工信息

思路:

分解为两步

1.查询研发部所有人工资

select salary from empcp where dept_id = (select id from dept where name = '研发部');

2.比研发部其中任意一人工资高的员工信息 (关键字any

select * from empcp where salary > any ( select salary from empcp where dept_id =(select id from dept where name = '研发部') );

执行:

执行:

🚀行子查询

子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。

常用的操作符:= 、<> 、IN 、NOT IN

案例:

查询与 "b" 的薪资及直属领导相同的员工信息 ;

思路:行子查询一般来说,左边要给组合条件,右边再给子查询的结果,不能把条件分开,再给子查询结果

拆解为两步:

1.查询 "b" 的薪资及直属领导

select salary, managerid from empcp where name = 'b';

2.查询与 "b" 的薪资及直属领导相同的员工信息 ;

第三个代码就是使用salary和managerid作为了一个组合条件,然后这个组合条件等于一个组合值

select * from empcp where (salary,managerid) = (select salary, managerid from empcpwhere name = 'b');或者select * from empcp where salary = 12500 and managerid = 1 ;或者select * from empcp where (salary , managerid) =  (12500 ,1) ;

执行:

执行:

🚀​​​​​​表子查询

子查询返回的结果是多行多列,这种子查询称为表子查询。(子查询查询返回的结果就类似于一张表)

常用的操作符:IN

表子查询经常在from之后,把表子查询返回的结果作为一张临时表,再和其他表联查操作

案例:1.查询与 "k" , "p" 的职位和薪资相同的员工信息

拆解为两步:

1.查询与 "k" , "p" 的职位和薪资

select job, salary from empcp where name = 'k' or name = 'p';

2.查询与 "k" , "p" 的职位和薪资相同的员工信息 (注意,这里where之后给的是组合条件。如果where之后条件如果是单行,那么我们之前在这一块的写法是(job,salary)= 子查询的结果就ok了,但是现在查询的不是一个单行数据,而是一个多行数据吗,此时就不能等于了,这时候我们要使用的是in

3.解读,这一块的含义指的是job和salary这个组合要么满足上面的,要么满足下面的,在这个列表里面多选一,只要能够满足一个这个员工的数据就可以查询出来

select * from empcp where (job,salary) in ( select job, salary from empcp where name ='k' or name = 'p' );

执行:

执行:

查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息

思路:

分解为两步

1.入职日期是 "2006-01-01" 之后的员工信息

select * from empcp where entrydate > '2006-01-01';

2.查询这部分员工, 对应的部门信息;

3.要查询部门的相关信息就要再去联查另一个表,dept表

4.所以我们需要把第一次查询的结果作为一张表,再去联查dept表

先暂时写为*

select * from [刚刚查询的一个结果作为一张表放进来,子查询的结果作为一张临时表存在,取一个别名e] ;

select * from (select * from empcp where entrydate > '2006-01-01') e ;

✨接着查询部门信息,有一个员工q,id为17的没有部门信息,我们要不要查出来,也需要,所以要查全部数据我们要使用到左外连接,此时我们顺便把dept表取名为d

select * from (select * from empcp where entrydate > '2006-01-01') e left join dept d on e.dept_id = d.id ;

执行:

✨总结:此时我们就在from之后用到了子查询,它会把这个子查询的结果作为一张表来与另一张表做

select e.*, d.* from (select * from empcp where entrydate > '2006-01-01') e leftjoin dept d on e.dept_id = d.id ;或者select * from (select * from empcp where entrydate > '2006-01-01') e left join dept don e.dept_id = d.id ;

执行:

执行:


总结:本篇博客到这里就结束了,希望能帮到你,谢谢你这么好看还来看我      

相关文章:

MySQL-多表联合查询

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…...

商城小程序(8.购物车页面)

目录 一、商品列表区域1、渲染购物车商品列表的标题区域2、渲染商品列表区域的基本结构3、为my-goods组件封装radio勾选状态4、为my-goods组件封装radio-change事件5、修改购物车中商品的选择状态6、为my-goods组件封装NumberBox7、为my-goods封装num-change事件8、修改购物车商…...

[Vulnhub靶机] DC-1

[Vulnhub靶机] DC-1靶机渗透思路及方法&#xff08;个人分享&#xff09; 靶机下载地址&#xff1a; https://download.vulnhub.com/dc/DC-1.zip 靶机地址&#xff1a;192.168.67.28 攻击机地址&#xff1a;192.168.67.3 一、信息收集 1.使用 arp-scan 命令扫描网段内存活的…...

【springboot 中集成 knife4j 时,报错 No mapping for GET /doc.html】

出现这种情况可能是项目中含有继承WebMvcConfigurationSupport的类&#xff0c;这会导致 swagger 配置失效。 解决方法&#xff0c;继承WebMvcConfigurationSupport下重写addResourceHandlers方法 Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry)…...

C++ 具名要求-全库范围的概念 -谓词(Predicate)-二元谓词(BinaryPredicate)

此页面中列出的具名要求&#xff0c;是 C 标准的规范性文本中使用的具名要求&#xff0c;用于定义标准库的期待。 某些具名要求在 C20 中正在以概念语言特性进行形式化。在那之前&#xff0c;确保以满足这些要求的模板实参实例化标准库模板是程序员的重担。若不这么做&#xf…...

MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询

MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询 MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询 com.github.dreamyoung mprelation 0.0.3.2-RELEASE 注解工具使用优缺点&#xff1a; 优点&#xff1a; 使用简单&#xf…...

arcgis javascript api4.x加载天地图web墨卡托(wkid:3857)坐标系

效果&#xff1a; 示例代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv&quo…...

中职组安全-win20230217-环境-解析

*任务说明&#xff1a; 仅能获取win20230217的IP地址 用户名&#xff1a;test&#xff0c;密码&#xff1a;123456 访问服务器主机,找到主机中管理员名称,将管理员名称作为Flag值提交&#xff1b; john 访问服务器主机,找到主机中补丁信息,将补丁编号作为Flag值提交&#xff…...

PMP学习考试经验总结

PMP备考日程计划表 我的PMP的备考大概花了三个月的时间, 可以分为以下几个阶段&#xff1a; Week 1-4: 读完PMBoK 前面7个知识领域&#xff08;中英文版PMBoK一起看&#xff09;。每看完一个知识领域&#xff0c;就看参考书里面的相应章节&#xff08;汪博士那本&#xff09;…...

leetcode206.反转链表

https://leetcode.cn/problems/reverse-linked-list/description/ 题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&am…...

python每日学17:控制推导逻辑的子表达式不要超过两个

背景&#xff1a;今天放假在家&#xff0c;《python学习手册》不在身边&#xff0c;所以今天学习《Effective Python: 编写高质量Python代码的90个有效方法》第28条《控制推导逻辑的子表达式不要超过两个》&#xff0c;这本书已经是第二版了&#xff0c;第一版是《编写高质量py…...

地质时间与数值模拟时间转换(mm/Ma-->m/s)

一百万年(1Ma)等于315,576,000,0003.15576e11秒。 计算方法如下&#xff1a; 一年通常定义为365天&#xff08;非闰年&#xff09;。每天有24小时。每小时有60分钟。每分钟有60秒。 所以&#xff0c;一年的秒数为&#xff1a; 365天 24小时/天 60分钟/小时 60秒/分钟 31…...

linux文件描述符管理

在实际的项目开发中&#xff0c;文件描述符是经常用到的并且在释放资源过程中也是很容易忽略的&#xff0c;使用之后不释放就会增加cpu负担&#xff0c;无异于内存泄漏&#xff1b;所以时刻掌握文件描述符的状态是非常重要的&#xff01;下面介绍文件描述符的管理方法。 1. 文…...

谷歌翻译不能使用 host添加IP

谷歌浏览器翻译不能使用解决教程_142.250.100.90 translate.googleapis.com-CSDN博客...

Redis命令 - Lists命令组常用命令

先创建一个 key 叫做 mylist&#xff0c;mylist存一个list。 list数据类型底层是一个链表。先进后出&#xff0c;后进先出。 命令中的L&#xff08;Left&#xff09;、R&#xff08;Right&#xff09;代表链表的头部L&#xff08;下标0的位置&#xff09;和尾部R&#xff08;…...

切分大文件sql为小份

数据库太大了&#xff0c;整个备份导入出问题或者慢&#xff0c;需要将整个库按照表分割&#xff08;一个表一个sql文件&#xff09; 环境 win10 工具&#xff1a;python3.7pycharm 要分割的文件大小&#xff1a;6G&#xff0c;sql文件import redbname with open(best**.sql,…...

最新版CleanMyMac X4.14.7智能清理mac磁盘垃圾工具

CleanMyMac X是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件&#xff0c;修复系统漏洞&#xff0c;一键扫描和优化Mac系统&#xff0c;…...

数据割据:当代社会数据治理的挑战

数据割据是指各个组织、企业或政府机构在数据的采集、存储和使用上形成了相对独立的局面&#xff0c;彼此之间缺乏有效的数据共享和流通机制。这种割据现象导致了数据的重复采集、冗余存储以及信息孤岛的出现&#xff0c;不仅浪费了大量的资源&#xff0c;还制约了数据的价值发…...

逻辑回归(解决分类问题)

定义&#xff1a;逻辑回归是一种用于解决分类问题的统计学习方法。它通过对数据进行建模&#xff0c;预测一个事件发生的概率。逻辑回归通常用于二元分类问题&#xff0c;即将数据分为两个类别。它基于线性回归模型&#xff0c;但使用了逻辑函数&#xff08;也称为S形函数&…...

论文阅读:Feature Refinement to Improve High Resolution Image Inpainting

项目地址&#xff1a;https://github.com/geomagical/lama-with-refiner 论文地址&#xff1a;https://arxiv.org/abs/2109.07161 发表时间&#xff1a;2022年6月29日 项目体验地址&#xff1a;https://colab.research.google.com/github/advimman/lama/blob/master/colab/LaMa…...

结构型设计模式——适配器模式

适配器模式 这个更加好理解&#xff0c;就是做适配功能的类&#xff0c;例如&#xff0c;现在手机没有了圆形耳机接口&#xff0c;只有Type-C接口&#xff0c;因此你如果还想要使用圆形耳机的话需要买个圆形接口转Type-C的转换器&#xff08;适配器&#xff09;&#xff0c;这…...

三菱FX系列PLC定长切割控制(线缆裁切)

三菱PLC绝对定位指令DDRVA实现往复运动控制详细介绍请查看下面文章链接&#xff1a; https://rxxw-control.blog.csdn.net/article/details/135570157https://rxxw-control.blog.csdn.net/article/details/135570157这篇博客我们介绍线缆行业的定长切割控制相关算法。 未完待…...

GPT编程:运行第一个聊天程序

环境搭建 很多机器学习框架和类库都是使用Python编写的&#xff0c;OpenAI提供的很多例子也是Python编写的&#xff0c;所以为了方便学习&#xff0c;我们这个教程也使用Python。 Python环境搭建 Python环境搭建有很多种方法&#xff0c;我们这里需要使用 Python 3.10 的环境…...

NLP论文阅读记录 - WOS | ROUGE-SEM:使用ROUGE结合语义更好地评估摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结 前言 ROUGE-SEM: Better evaluation of summarization using ROUGE combin…...

vscode 创建文件自动添加注释信息

随机记录 目录 1. 背景介绍 2. "Docstring Generator"扩展 2.1 安装 2.2 设置注释信息 3. 自动配置py 文件头注释 1. 背景介绍 在VS Code中&#xff0c;您可以使用扩展来为新创建的Python文件自动添加头部注释信息。有几个常用的扩展可以实现此功能&#xff0…...

JVM内存区域详解,一文弄懂JVM内存【内存分布、回收算法、垃圾回收器】

视频讲解地址 学习文档 一、内存区域 区域描述线程私有如何溢出程序计数器为了线程切换后能恢复到正确的执行位置&#xff0c;每个线程都要有一个独立的程序计数器。✅唯一一个不会内存溢出的地方虚拟机栈1. 每个方法执行的时候&#xff0c;Java虚拟机都会同步创建一个栈帧用于…...

uniapp搜索附近蓝牙信标(iBeacon)

一、 iBeacon介绍 iBeacon是苹果在2013年WWDC上推出一项基于蓝牙4.0&#xff08;Bluetooth LE | BLE | Bluetooth Smart&#xff09;的精准微定位技术&#xff0c;在iPhone 4S后支持。当你的手持设备靠近一个Beacon基站时&#xff0c;设备就能够感应到Beacon信号&#xff0c;范…...

Redis 常见数据结构以及使用场景分析

Java面试题目录 Redis 常见数据类型以及使用场景分析 Redis中有string、list、hash、set、sorted set、bitmap这6种数据类型。 string可以用来做缓存&#xff0c;分布式锁&#xff0c;计数器等。 list可以实现消息队列&#xff0c;分页查询等。 hash适合存储对象结构。 set 可…...

LMDeploy 大模型量化部署实践

LMDeploy 大模型量化部署实践 大模型部署背景模型部署定义产品形态计算设备 大模型特点大模型挑战大模型部署方案 LMDeploy简介推理性能核心功能-量化核心功能-推理引擎TurboMind核心功能 推理服务 api-server 案例(安装、部署、量化) 大模型部署背景 模型部署 定义 将训练好…...

15个为你的品牌增加曝光的维基百科推广方法-华媒舍

维基百科是全球最大的免费在线百科全书&#xff0c;拥有庞大的用户群体和高质量的内容。在如今竞争激烈的市场中&#xff0c;利用维基百科推广品牌和增加曝光度已成为许多企业的重要策略。本文将介绍15种方法&#xff0c;帮助你有效地利用维基百科推广品牌&#xff0c;提升曝光…...