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

相关文章

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

mybatis中resultMap的association及collectio的使用详解

《mybatis中resultMap的association及collectio的使用详解》MyBatis的resultMap定义数据库结果到Java对象的映射规则,包含id、type等属性,子元素需... 目录1.reusltmap的说明2.association的使用3.collection的使用4.总

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分