关系型数据库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;# 我们是把子查询作为一张临时表来使用的

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

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

相关文章

网络安全公司观察,看F5如何将安全化繁为简

应用无处不在的当下,从传统应用到现代应用再到边缘、多云、多中心的安全防护,安全已成为企业数字化转型中的首要挑战。根据IDC2023年《全球网络安全支出指南》,2022年度中国网络安全支出规模137.6亿美元,增速位列全球第一。有专家…

使用 docker-compose 编排 lnmp(dockerfile) 完成 wordpress

一、使用 docker-compose 编排 lnmp(dockerfile) 完成 wordpress 环境准备 ##修改主机名 hostnamectl set-hostname lyh bash [rootlyh ~]###关闭防火墙及核心防护 systemctl stop firewalld ##关闭核心防护 setenforce 0 ##关闭核心防护##安装Docker-20…

3.控速,红外传感

1.基础知识 2.小车转速代码 int leftX 11; int rightX 12;void carInit() {// put your setup code here, to run once:pinMode(2, OUTPUT); // 配置2口为输出引脚pinMode(3, OUTPUT); // 配置3口为输出引脚//右轮信号方向初始化pinMode(4, OUTPUT); // 配置4口为输出引脚pi…

JavaEE技术之MySql高级-ShardingSphere5(SpringBoot版本:3.0.5)

文章目录 1 ShardingSphere-JDBC读写分离1.1 创建SpringBoot程序1.1.1、创建项目1.1.2、添加依赖1.1.3、创建实体类1.1.4、创建Mapper1.1.5、配置 Spring Boot1.1.6、配置shardingsphere 1.2 测试1.2.1 读写分离测试1.2.2 负载均衡测试1.2.3 事务测试常见错误 2 ShardingSphere…

使用ffmpeg对视频进行转码(支持浏览器播放)

在开发中,算法保存的mp4视频文件通过路径打开该视频发现视频播放不了,需要转码进行播放。使用java代码进行转码。代码如下,inputFilePath是转之前的视频路径,outputFilePath是转之后的视频路径。ffmpeg命令中libx264也可以改为其它…

泉州晋江厦门拉货最便宜的7个方式,建议收藏

众所周知,搬家、拉货的时间长、距离长,运费也比较贵。面对不菲的费用,很多人会比较谨慎,先网上搜搬家攻略,一番对比以后,找到最便宜的运输方式。那怎么运输最便宜最放心呢? 方式一:找…

【iOS】-- 内存五大分区

【iOS】-- 内存五大分区 内存五大分区1.栈区优点: 2.堆区优点: 3.全局区4.常量区5.代码区 验证static、extern、const关键字比较1.static关键字static关键字的作用:全局静态变量局部静态变量 2.extern关键字对内的全局变量对外的全局变量 3.c…

历代著名画家作品赏析-东晋顾恺之

中国历史朝代顺序为:夏朝、商朝、西周、东周、秦朝、西楚、西汉、新朝、玄汉、东汉、三国、曹魏、蜀汉、孙吴、西晋、东晋、十六国、南朝、刘宋、南齐、南梁、南陈、北朝、北魏、东魏、北齐、西魏、北周、隋,唐宋元明清,近代。 一、东晋著名…

ssm+vue的私人健身和教练预约管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的私人健身和教练预约管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通…

Yolov8实现loopy视频识别

1、前言 loopy是一个非常可爱的动漫角色(可爱粉色淀粉肠),闲来无事,打算用yolov8训练一个模型对loopy进行识别。 2、准备工作 先在网络上搜寻很多loopy的图片,然后将图片导入Lablel Studio软件进行标注,并…

三、VGA接口驱动与图像显示动态移动

文章目录 一、参数介绍二、彩条显示2.1 模块系统架构框图2.2 行、场同步波形:2.3 代码三、VGA 图像显示动态移动3.1波形设计3.2代码 一、参数介绍 对于普通的 VGA 显示器,共有 5 个信号:R、G、B 三基色;HS(行同步信号&#xff09…

remmina无法连接远程桌面,Remmina无法连接远程桌面的原因与解决办法

在解决Remmina无法连接远程桌面的问题时,我们需要考虑多种可能的原因,并采取相应的解决办法。以下是一些常见的原因及其对应的解决方案: 1、网络问题 原因:不稳定的网络连接或中断可能导致无法建立远程桌面连接。 解决办法&#x…

ICode国际青少年编程竞赛- Python-1级训练场-变量练习

ICode国际青少年编程竞赛- Python-1级训练场-变量练习 1、 a 8 for i in range(8):Dev.step(a)Dev.turnRight()a - 12、 a 3 for i in range(4):Dev.step(a)Dev.turnRight()a a 1 Dev.step(5)3、 a 4 for i in range(4):Dev.step(2)Dev.step(-5)Dev.step(3)Spaceship.…

FreeRTOS学习笔记-基于stm32(6)时间片调度实验

1、什么是时间片调度 在任务优先级相同的时候,CPU会轮流使用相同的时间去执行它,即时间片调度。这个相同的时间就是时间片。而时间片的大小就是SysTick的中断周期(SysTick的中断周期可以修改)。 比如有三个相同优先级的任务在运行…

练习题(2024/5/8)

1 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(…

Spring后端参数校验——自定义校验方式(validation)

文章目录 开发场景技术名词解释——Spring Validation自定义校验 技术细节小结1.实体参数校验2.自定义校验 完整代码 开发场景 业务场景:新增文章 基本信息 请求路径:/article 请求方式:POST 接口描述:该接口用于新增文章(发布文…

解决:mybatisplus分页查询失效,总是查询到所有数据

目录 问题描述&#xff1a;解决方案&#xff1a;1.配置mybatisplus拦截器PaginationInterceptor2.自行编写SQL语句查询 问题描述&#xff1a; 在前端使用Map<String, Object> params&#xff0c;把page&#xff0c;limit参数作为请求体传送到后端&#xff0c;但是分页查…

Baidu Comate智能编码助手 -----AI编程帮你解放双手

目录 Baidu Comate是什么&#xff1f; Baidu Comate如何安装&#xff1f; 在VSCode上安装Baidu Comate插件 Baidu Comate如何使用&#xff0c;有哪些功能&#xff1f; 1.代码解释 2.代码注释 使用感受 如何体验 Baidu Comate是什么&#xff1f; Baidu Comate智能编码助手…

DSP28335开发教程--CCS问题02:Tnteger conversion resulted in truncation

出现黄色警告&#xff0c; 如何解决&#xff1a; 当你看到“integer conversion resulted in truncation”这样的错误或警告时&#xff0c;它通常意味着在数据转换过程中有数据丢失。具体来说&#xff0c;就是将一个较大的数值&#xff08;可能是浮点数、长整型等&#xff09;…

PHPStudy 下载PHP提示“当前网络不稳定,下载失败”

错误信息 当前网络不稳定&#xff0c;下载失败 获取下载链接失败&#xff0c;请检查网络 假查网络 问题原因 xp.cn服务器的网络不稳定&#xff0c;不是你电脑的网络问题。 解决办法 第一步&#xff1a;下载现成的PHP文件 直接下载现成的文件&#xff0c;放到php目录。 将…