关系型数据库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

相关文章

MySQL8.0设置redo缓存大小的实现

《MySQL8.0设置redo缓存大小的实现》本文主要在MySQL8.0.30及之后版本中使用innodb_redo_log_capacity参数在线更改redo缓存文件大小,下面就来介绍一下,具有一... mysql 8.0.30及之后版本可以使用innodb_redo_log_capacity参数来更改

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景