关系型数据库MySQL开发要点之多表查询2024详解

本文主要是介绍关系型数据库MySQL开发要点之多表查询2024详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

多表查询

准备测试数据

-- 部门管理
create table tb_dept(id int unsigned primary key auto_increment comment '主键ID',name varchar(10) not null unique comment '部门名称',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间'
) comment '部门表';insert into tb_dept (id, name, create_time, update_time) values(1,'学工部',now(),now()),(2,'教研部',now(),now()),(3,'咨询部',now(),now()), (4,'就业部',now(),now()),(5,'人事部',now(),now());-- 员工管理
create table tb_emp (id int unsigned primary key auto_increment comment 'ID',username varchar(20) not null unique comment '用户名',password varchar(32) default '123456' comment '密码',name varchar(10) not null comment '姓名',gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',image varchar(300) comment '图像',job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',entrydate date comment '入职时间',dept_id int unsigned comment '部门ID',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间'
) comment '员工表';INSERT INTO tb_emp
(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES(1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),(2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),(3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),(4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),(5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),(6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),(7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),(8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),(9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),(10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),(11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),(12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),(13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,now(),now()),(14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),(15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),(16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2007-01-01',2,now(),now()),(17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());-- 查询表中的数据
select  * from tb_emp;
select * from tb_emp;

多表查询就是从多张表中查询数据

-- 多表查询的SQL雨具
select * from tb_emp , tb_dept;

这种方式的多表查询 查询出来的结果有很多次

这个叫 笛卡尔积

多表查询的目的

从多张数据库表中查询数据 并删去无效数据

消除笛卡尔积

-- 多表查询的SQL雨具
-- 指定连接条件
select * from tb_emp , tb_dept where tb_emp.dept_id = tb_dept.id;

内连接查询

-- 数据已经事先写入数据库-- 内连接-- 查询员工姓名 以及所属的部门名称 (隐式内连接实现)
-- * 代表的是查询两张表中的所有字段
select  tb_emp.name ,tb_dept.name from tb_emp,tb_dept where tb_emp.dept_id= tb_dept.id;

查询时如果员工表中没有job数据 那么无法显示

内连接查询的是两张表交集的数据

A表中没有与B表关联的数据是查询不出来的

-- 数据已经事先写入数据库-- 内连接-- 查询员工姓名 以及所属的部门的名称(显式内连接实现)
-- * 代表的是查询两张表中的所有字段
select tb_emp.name,tb_dept.name from tb_emp inner join tb_dept on tb_emp.dept_id=tb_dept.id;
-- 数据已经事先写入数据库-- 内连接-- 查询员工姓名 以及所属的部门的名称(显式内连接实现)
-- * 代表的是查询两张表中的所有字段
select tb_emp.name,tb_dept.name from tb_emp inner join tb_dept on tb_emp.dept_id=tb_dept.id;

我们在多表联查的时候可以起别名

-- 多表查询的时候 给表起别名
select * from tb_emp e,tb_dept d where e.dept_id=d.id;

外连接查询

左外连接 会完全包含左表的数据

右外连接 会完全包含右表的数据

-- 外连接
-- A 查询员工表 所有 员工的姓名 和 对应的部门名称(左外连接)
select e.name ,d.name from tb_emp e left join tb_dept d on e.dept_id=d.id;-- B 查询部门表 所有 部门的名称 和 对应的员工名称(右外连接)
select e.name,d.name from tb_emp e right join tb_dept d on e.dept_id =d.id;

小结

子查询(标量 列)

-- 子查询-- 标量子查询-- A 查询"教研部"的所有员工信息
-- a 查询 教研部 部门ID
select id from tb_dept where name = '教研部';
-- b 查询该部门ID下的员工信息
select * from tb_emp where dept_id =2;-- 合并简写
select * from tb_emp where dept_id =(select id from tb_dept where name = '教研部');-- B 查询"方东白"入职之后的员工信息
-- a 查询 方东白 入职日期
select entrydate from tb_emp where name = '方东白';-- b 查询 该入职日期后的员工
select * from tb_emp where entrydate > '2012-11-01';-- 合并简写
select * from tb_emp where entrydate > (select entrydate from tb_emp where name='方东白');

-- 子查询-- 列子查询-- A 查询 "教研部" 和 "咨询部" 的 所有员工信息
-- a 查询 教研部 咨询部 的部门ID
select id from tb_dept where name ='教研部' or name ='咨询部';-- b 根据部门 ID 查询该部门下的员工信息 tb_emp
select * from tb_emp where dept_id in (3,2);-- 合并简写
select * from tb_emp where dept_id in (select id from tb_dept where name ='教研部' or name ='咨询部');

子查询(行 表)

-- 行子查询
-- A 查询 与 韦一笑 入职时间 职位 都相同的员工信息-- a 查询 韦一笑的入职时间和职位
select tb_emp.entrydate,tb_emp.job from tb_emp where name ='韦一笑';-- b 查询 与其入职时间和职位都相同的员工
select * from tb_emp where entrydate= '2007-01-01' and  job=2;-- 合并简写-- 对表进行了多次查询 性能较低
select * from tb_emp where entrydate= (select tb_emp.entrydate from tb_emp where name ='韦一笑') and  job=(select tb_emp.job from tb_emp where name ='韦一笑');-- 高效写法
select * from tb_emp where (entrydate,job) =(select tb_emp.entrydate,tb_emp.job from tb_emp where name ='韦一笑');

-- 表子查询
-- A 查询入职时间是 "2006-01-01" 之后的员工信息 及其部门名称-- a 查询入职时间是 "2006-01-01" 之后的员工信息
select * from tb_emp where entrydate > '2006-01-01';-- b 查询 其部门名称
select e.*,d.name from (select * from tb_emp where entrydate > '2006-01-01') e, tb_dept d where e.dept_id=d.id;# 我们是把子查询作为一张临时表来使用的

这篇关于关系型数据库MySQL开发要点之多表查询2024详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972567

相关文章

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

SQL Server 中的表进行行转列场景示例

《SQLServer中的表进行行转列场景示例》本文详细介绍了SQLServer行转列(Pivot)的三种常用写法,包括固定列名、条件聚合和动态列名,文章还提供了实际示例、动态列数处理、性能优化建议... 目录一、常见场景示例二、写法 1:PIVOT(固定列名)三、写法 2:条件聚合(CASE WHEN)四、

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

Springboot配置文件相关语法及读取方式详解

《Springboot配置文件相关语法及读取方式详解》本文主要介绍了SpringBoot中的两种配置文件形式,即.properties文件和.yml/.yaml文件,详细讲解了这两种文件的语法和读取方... 目录配置文件的形式语法1、key-value形式2、数组形式读取方式1、通过@value注解2、通过

Mybatis对MySQL if 函数的不支持问题解读

《Mybatis对MySQLif函数的不支持问题解读》接手项目后,为了实现多租户功能,引入了Mybatis-plus,发现之前运行正常的SQL语句报错,原因是Mybatis不支持MySQL的if函... 目录MyBATis对mysql if 函数的不支持问题描述经过查询网上搜索资料找到原因解决方案总结Myb

自定义注解SpringBoot防重复提交AOP方法详解

《自定义注解SpringBoot防重复提交AOP方法详解》该文章描述了一个防止重复提交的流程,通过HttpServletRequest对象获取请求信息,生成唯一标识,使用Redis分布式锁判断请求是否... 目录防重复提交流程引入依赖properties配置自定义注解切面Redis工具类controller

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

《MySQL筛选条件放ON后vs放WHERE后的区别解析》文章解释了在MySQL中,将筛选条件放在ON和WHERE中的区别,文章通过几个场景说明了ON和WHERE的区别,并总结了ON用于关... 今天我们来讲讲数据库筛选条件放 ON 后和放 WHERE 后的区别。ON 决定如何 "连接" 表,WHERE

mysql_mcp_server部署及应用实践案例

《mysql_mcp_server部署及应用实践案例》文章介绍了在CentOS7.5环境下部署MySQL_mcp_server的步骤,包括服务安装、配置和启动,还提供了一个基于Dify工作流的应用案例... 目录mysql_mcp_server部署及应用案例1. 服务安装1.1. 下载源码1.2. 创建独立

VSCode开发中有哪些好用的插件和快捷键

《VSCode开发中有哪些好用的插件和快捷键》作为全球最受欢迎的编程工具,VSCode的快捷键体系是提升开发效率的核心密码,:本文主要介绍VSCode开发中有哪些好用的插件和快捷键的相关资料,文中... 目录前言1、vscode插件1.1 Live-server1.2 Auto Rename Tag1.3

Mysql中RelayLog中继日志的使用

《Mysql中RelayLog中继日志的使用》MySQLRelayLog中继日志是主从复制架构中的核心组件,负责将从主库获取的Binlog事件暂存并应用到从库,本文就来详细的介绍一下RelayLog中... 目录一、什么是 Relay Log(中继日志)二、Relay Log 的工作流程三、Relay Lo