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 ;

执行:

执行:


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

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

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

相关文章

【笔记】认识电机

认识电机 电机一些概念永磁同步电机永磁体定子和转子励磁电磁感应定律 AC Optimal Power Flow功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右Smart…

说清楚Kubernetes、Docker、Dockershim、Containerd、runC、CRI、OCI的关系

Kubernetes v1.20版本 的 release note 里说 deprecated docker。并且在后续版本 v1.24 正式删除了 dockershim 组件&#xff0c;这对我们有什么影响呢&#xff1f;Kubernetes 1.20: The Raddest Release | Kubernetes 为了搞明白这件事情&#xff0c;以及理解一系列容器名词 …

JDK8-JDK17版本升级

局部变量类型推断 switch表达式 文本块 Records 记录Records是添加到 Java 14 的一项新功能。它允许你创建用于存储数据的类。它类似于 POJO 类&#xff0c;但代码少得多&#xff1b;大多数开发人员使用 Lombok 生成 POJO 类&#xff0c;但是有了记录&#xff0c;你就不需要使…

【MATLAB】 HANTS滤波算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 HANTS滤波算法是一种时间序列谐波分析方法&#xff0c;它综合了平滑和滤波两种方法&#xff0c;能够充分利用遥感图像存在时间性和空间性的特点&#xff0c;将其空间上的分布规律和时间上的变化规律联系起来…

MySQL——性能优化与关系型数据库

文章目录 什么是性能&#xff1f;什么是关系型数据库&#xff1f;数据库设计范式 常见的数据库SQL语言结构化查询语言的六个部分版本 MySQL数据库故事历史版本5.6/5.7差异5.7/8.0差异 什么是性能&#xff1f; 吞吐与延迟&#xff1a;有些结论是反直觉的&#xff0c;指导我们关…

【MySQL】mysql集群

文章目录 一、mysql日志错误日志查询日志二进制日志慢查询日志redo log和undo log 二、mysql集群主从复制原理介绍配置命令 读写分离原理介绍配置命令 三、mysql分库分表垂直拆分水平拆分 一、mysql日志 MySQL日志 是记录 MySQL 数据库系统运行过程中不同事件和操作的信息的文件…

mysql数据库优化

数据库的性能调优和优化是指通过优化数据库结构、SQL语句的编写以及服务器硬件和操作系统等方面的配置&#xff0c;来提高数据库的响应速度和稳定性&#xff0c;以满足业务需求。 结合实际需求&#xff0c;从以下四个方面进行讲解。 一、数据库设计优化 二、SQL语句优化 三、…

Dockerfile的ADD和COPY

文章目录 环境ADD规则校验远程文件checksum添加Git仓库添加私有Git仓库ADD --link COPYCOPY --parent 使用ADD还是COPY&#xff1f;参考 环境 RHEL 9.3Docker Community 24.0.7 ADD ADD 指令把 <src> 的文件、目录、或URL链接的文件复制到 <dest> 。 ADD 有两种…

将图片添加到 PDF 的 5 种方法

需要一种称为 PDF 编辑器的特定工具才能将图片添加到 PDF。尽管大多数浏览器在查看和注释 PDF 文件方面都非常出色&#xff0c;但如果您使用图像到 PDF 技术&#xff0c;则只能将照片放入 PDF 中。无需修改即可将 PDF 文件恢复为原始格式的能力是使用此类软件程序甚至在线服务的…

基于Matlab/Simulink开发自动驾驶的解决方案

文章目录 处理自动驾驶数据 仿真自动驾驶场景 设计感知算法 设计规划和控制算法 生成代码和部署算法 集成和测试 参考文献 使用 MATLAB/Simulink开发自动驾驶&#xff0c;能够深入建模真实世界的行为、减少车辆测试并验证嵌入式软件的功能&#xff0c;从而推进自动驾驶感…

基于ssm的线上旅游体验系统+vue论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

安防视频监控系统EasyCVR设备分组中在线/离线数量统计的开发与实现

安防视频监控EasyCVR系统具备较强的兼容性&#xff0c;它可以支持国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&#xff0c;如&#xff1a;海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等。EasyCVR平台可覆盖多类型的设备接入&am…

05.neuvector网络学习与管控实现

原文链接&#xff0c;欢迎大家关注我的github 一、网络的策略学习 1.1.非主机模式的网络连接学习 agent进程侧&#xff1a; 调用taskAddContainer->taskInterceptContainer->programDP->DPCtrlAddTapPort为所有非host模式的容器向dp传送 DPAddTapPortReq对象数据.&…

第 3 场 蓝桥杯小白入门赛 解题报告 | 珂学家 | 单调队列优化的DP + 三指针滑窗

前言 整体评价 T5, T6有点意思&#xff0c;这场小白入门场&#xff0c;好像没真正意义上的签到&#xff0c;整体感觉是这样。 A. 召唤神坤 思路: 前后缀拆解 #include <iostream> #include <algorithm> #include <vector> using namespace std;int main()…

爬虫案例—抓取豆瓣电影的电影名称、评分、简介、评价人数

爬虫案例—抓取豆瓣电影的电影名称、评分、简介、评价人数 豆瓣电影网址&#xff1a;https://movie.douban.com/top250 主页截图和要抓取的内容如下图&#xff1a; 分析&#xff1a; 第一页的网址&#xff1a;https://movie.douban.com/top250?start0&filter 第二页的…

时间差异导致数据缺失,如何调整Grafana时间与Prometheus保持同步?

Grafana时间如何调快或调慢&#xff1f; 在k8s环境中&#xff0c;常使用prometheusgrafana做监控组件&#xff0c;prometheus负责采集、存储数据&#xff0c;grafana负责监控数据的可视化。 在实际的使用中&#xff0c;有时会遇到这样的问题&#xff0c;k8s集群中的时间比真实…

unity C#中使用ref、out区别和使用案例

文章目录 ref 关键字out 关键字 在Unity&#xff08;以及C#编程语言中&#xff09;&#xff0c; ref 和 out 都是用来传递参数的引用&#xff0c;这意味着它们允许函数修改实参变量&#xff0c;并且这些修改会反映到调用函数的地方。但它们之间确实存在一些关键区别和使用场景…

【数据结构 | 直接选择排序】

直接选择排序 基本思路直接插入排序SelectSort 基本思路 直接插入排序&#xff08;StraightInsertionSort&#xff09;的基本操作是将一个记录插入到已经排好序的有序表中&#xff0c;从而得到一个新的、记录数增1的有序表。 我们可以同时从数组的头部和尾部同时进行排序工作…

Jenkins集成Sonar Qube

下载插件 重启Jenkins 容器 sonarqube 使用令牌 Jenkins 配置 重新构建

智能合约笔记

前言&#xff1a; 首先了解下为什么会出现智能合约&#xff0c;打个比方现在有两个人A和B打赌明天会不会下雨&#xff0c;每个人赌注100元&#xff0c;如果第二天下雨则A拿走200元&#xff0c;否则B拿走200元&#xff0c;这样就有一个问题&#xff0c;赌注要到第二天才能见效&…