第10章 多表查询
一、什么是多表查询
多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进 行关联。
二、为什么需要多表查询
1、是否可以将多个表合并为一张表?
答:可以,不过会有弊端。
2、弊端1:会增加很多冗余数据。
比如:如果有员工表和部门表。在员工表中有100个人在10号部门,在部门表中只需要有一条数据记录该部门即可。但是合成一张表后就会有大量的数据冗余。

2、弊端2:在进行查询数据的时候数据需要从磁盘加载到内存中,当一张表的字段更多,加载相同数量的记录就需要更多的IO,影响查询性能。
3、弊端3:在事务中,因为表会锁定。如果是一张表,那么多人共用并不方便,效率也会更低。
三、熟悉需要使用的表

四、错误的多表查询(笛卡尔积)
1、案例
#案例:查询员工的姓名及其部门名称
SELECT last_name, department_name
FROM employees, departments;

分析:107 * 27 = 2889。错误条数的查询是因为员工表中的每一条记录都匹配了一遍部门表中的每一条记录,这种错误被称为笛卡尔积错误。错误的原因就是因为缺少了多表连接的条件。
2、笛卡尔积(或交叉连接)的理解
笛卡尔乘积是一个数学运算。假设我有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能 组合,也就是第一个对象来自于 X,第二个对象来自于 Y 的所有可能。组合的个数即为两个集合中元素个数的乘积数。

SQL92中,笛卡尔积也称为交叉连接 ,英文是 CROSS JOIN 。在 SQL99 中也是使用 CROSS JOIN表示交 叉连接。它的作用就是可以把任意表进行连接,即使这两张表不相关。在MySQL中如下情况会出现笛卡尔积:
#查询员工姓名和所在部门名称
SELECT last_name,department_name FROM employees,departments;
SELECT last_name,department_name FROM employees CROSS JOIN departments;# 交叉连接
SELECT last_name,department_name FROM employees INNER JOIN departments;# 内连接
SELECT last_name,department_name FROM employees JOIN departments;
3、案例分析与问题解决
笛卡尔积的错误会在下面条件下产生:
| 1、省略多个表的连接条件(或关联条件) 2、连接条件(或关联条件)无效 3、所有表中的所有行互相连接 |
为了避免笛卡尔积, 可以在 WHERE 加入有效的连接条件。 加入连接条件后,查询语法:
| SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1 = table2.column2; #连接条件 |
上述案例的正确写法:
#案例:查询员工的姓名及其部门名称
SELECT last_name, department_name
FROM employees, departments
WHERE employees.department_id = departments.department_id;
注意:在查询的多个表中有相同列(字段)时,必须在列名之前加上表名前缀。
建议:从sql优化的角度,建议多表查询时,每个字段前都指明其所在的表。
优化:如果查询的字段很多,那么就会写得很长,可以对查询的表起别名。但是如果起了别名,需要用表名就必须使用别名,而不能再使用原名。
SELECT emp.last_name, dept.department_name
FROM employees emp, departments dept
WHERE emp.department_id = dept.department_id;
4、n个表实现多表连接
如果有n个表实现多表查询,则至少需要n-1个连接条件。
例如:

五、多表查询的分类
1、分类
角度一:针对连接条件而言,分为等值连接与非等值连接。
角度二:针对连接的表间关系来讲,分为自连接与非自连接。
角度三:内连接与外连接。(见第11章)
2、示例
等值连接示例:
连接条件使用等号限制。
SELECTe.last_name,e.salary,e.department_id,d.department_name
FROMemployees e,departments d
WHERE e.department_id = d.department_id;
非等值连接示例:
连接条件不是使用等号限制的。
SELECTe.last_name,e.salary,j.grade_level
FROMemployees e,job_grades j
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;
自连接示例:
连接相同的两张表称为自连接。(将一张表看成两张相同的表。当t1和t2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行多表连接查询。)
SELECT t1.employee_id, t1.last_name, t2.employee_id manager_id, t2.last_name manager_name
FROM employees t1,employees t2
WHERE t1.manager_id = t2.employee_id
非自连接示例:
连接不同的两张或多张表,称为非自连接。
SELECTe.last_name,e.salary,e.department_id,d.department_name
FROMemployees e,departments d
WHERE e.department_id = d.department_id;
扩展:
- 多个表中有相同列时,必须在列名之前加上表名前缀。
- 在不同表中具有相同列名的列可以用 表名 加以区分。
- 使用别名可以简化查询。 列名前使用表名前缀可以提高查询效率。需要注意的是,如果我们使用了表的别名,在查询字段中、过滤条件中就只能使用别名进行代替, 不能使用原有的表名,否则就会报错。
相关文章:
第10章 多表查询
一、什么是多表查询 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立…...
【基于LSM的ELF文件安全模块设计】参考
《基于LSM的ELF文件安全模块设计文档》 一、设计目标 本设计致力于通过 Linux 安全模块(LSM)构建一个强大而严密的安全防护体系,以实现对 ELF 文件(涵盖可执行文件和动态链接库)的绝对严格的合法性和完整性检查。其核…...
全卷积和全连接
全连接网络和全卷积网络不一样 以下是对两者的正确解释和代码示例: 1. 全连接网络(Fully Connected Network) 全连接网络使用的是 线性层(nn.Linear),也就是我们常说的“全连接层”。它是用于将每一个输入…...
Unity图形学之Shader结构
Unity - Manual: ShaderLab: Legacy Lighting 1.Shader 语言: OpenGL:SGL 跨平台性能非常好 GLSL语言 OpenGL Shader LanguageDX:微软 非跨平台 性能非常好 HLSL语言 High Level Shader LanguageCG:微软和英伟达 联合开发CG …...
离散时间信号的产生
文章目录 前言1.单位冲激序列函数1.2 函数:1.3 实现代码:1.3 调用方式1.4 调用结果 2.单位阶跃序列函数2.1 函数2.2实现代码2.3调用方式2.4调用结果 3.矩形序列3.1函数3.2 实现代码3.3调用方式3.4 调用结果 4.实指数序列4.1函数4.2实现代码4.3调用方式4.…...
物联优化汽车齿轮锻造
在汽车齿轮的锻造工艺中,锻造温度、锻造压力与行程、锻造速度与锤击方式以及热处理工艺等核心参数扮演着举足轻重的角色。这些参数的精准控制与实时监测,对于提升生产效率、确保产品质量、削减生产成本以及推动生产智能化转型具有不可估量的价值。明达技…...
CocosCreator 构建透明背景应用(最新版!!!)
文章目录 透明原理补充设置截图以及代码step1: electron-js mian.jsstep2:ENABLE_TRANSPARENT_CANVASstep3:SOLID_COLOR Transparentstep:4 Build Web phonestep5:package electron-js & change body background-color 效果图补充 透明原理 使用Cocos creator 做桌面应用开…...
使用CentOS宝塔面板docker搭建EasyTier内网穿透服务
0. 前言 EasyTier是一个简单、安全、去中心化的内网穿透 VPN 组网方案,部署方便,支持 MacOS/Linux/Windows/FreeBSD/Android平台,而且作者搭建了一个公共服务器,不想折腾自建服务,可以使用默认的公共服务器地址 tcp:/…...
HTMLCSS: 实现可爱的冰墩墩
效果演示 HTML <div class"wrap"><div class"body"></div><div class"ear"></div><div class"ear rightEar"></div><div class"leftHand"></div><div class"…...
天地图入门|标注|移动飞行|缩放,商用地图替换
“天地图”是国家测绘地理信息局建设的地理信息综合服务网站。集成了来自国家、省、市(县)各级测绘地理信息部门,以及相关政府部门、企事业单位 、社会团体、公众的地理信息公共服务资源,如果做的项目是政府部门、企事业单位尽量选…...
Flutter PC端UI组件库
一、参考Element-ui的设计和交互,构建基于dart的Flutter UI组件库 https://javonhuang.github.io/sky-ui-page/index.html...
NVR小程序接入平台/设备EasyNVR多品牌NVR管理工具/设备汇聚公共资源场景方案全析
随着信息技术的飞速发展,视频监控已经成为现代社会安全管理和业务运营不可或缺的一部分。特别是在公共资源管理方面,视频监控的应用日益广泛,涵盖了智慧城市、智能交通、大型企业以及校园安防等多个领域。NVR小程序接入平台EasyNVR作为一款功…...
干部谈话考察系统:革新传统,精准高效
在干部选拔任用和考核评价的过程中,谈话考察一直是关键环节之一。然而,传统的谈话考察方式却面临着诸多痛点,严重影响了干部考察工作的质量和效率。干部谈话考察系统的出现,为解决这些问题提供了有力的武器。 一、传统谈话考察的…...
反转链表(Leetcode)
反转链表 Leetcode题目链接 题意:翻转一个单链表 🌰: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 在链表本身进行反转即可,不用重新定义链表,这同时浪费时间和空间。 需要采用哑…...
制作游戏外挂的技术栈有哪些
制作游戏外挂是一项涉及多方面技术的复杂任务。这项技术通常被用于在游戏中获得不公平的优势,因此也遭到了大量的讨论与争议。制作外挂需要深厚的编程基础、对系统底层的深入理解以及对具体游戏架构的详细研究。以下是一篇全面的分析文章,旨在揭示制作游…...
python下载pdf
要下载 PDF 文件并将其保存到本地文件夹中,你可以使用 Python 的 requests 库来发送 HTTP 请求,并使用 os 和 io 库来处理文件操作。以下是一个示例代码,展示了如何从给定的 URL 下载 PDF 文件并将其保存到本地 data 文件夹中: i…...
我们来学mysql -- 同时使用 AND 和 OR 查询错误(填坑篇)
AND 和 OR 一同使用问题 现象分析处理扩展 现象 业务上在“锁定”当前零件所在出口国的所有零件时,出现其他国家零件 问题定位 分析 or 切断了操作符之间的连续性,从union角度分析 where k1 Td621 and k1 Vda96 or k3 P00009等同 select * fr…...
关于Websocket
Websocket的基本概念 Websocket是一个“应用层协议”,和HTTP地位是对等的。都是基于传输层的TCP实现的一个广泛被使用的应用层协议。这个协议可以实现服务器主动给客户端推送数据这样的功能。 websocket报文格式 简单了解一下Websocket的报文格式: FIN表…...
vue2 pdf 链接地址打开
vue2 pdf 链接地址打开 1、先下载依赖 “vue-pdf”: “^4.3.0”, “pdfh5”: “^1.4.0”, “pdfjs-dist”: “2.5.207”, 3、打开pdf <template><div id"app"><div id"demo"></div></div> </template> <script&g…...
c# 动态lambda实现二级过滤(多种参数类型)
效果 调用方法 实体类(可以根据需求更换) public class ToolStr50 {public bool isSelected { get; set; }public string toolStr1 { get; set; }public string toolStr2 { get; set; }public string toolStr3 { get; set; }public string toolStr4 { …...
3步实现视频硬字幕精准提取:本地化多语言解决方案如何解决你的字幕难题
3步实现视频硬字幕精准提取:本地化多语言解决方案如何解决你的字幕难题 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区…...
Phi-3-mini-4k-instruct-gguf入门必看:q4-GGUF量化对中文语义保留的影响实测
Phi-3-mini-4k-instruct-gguf入门必看:q4-GGUF量化对中文语义保留的影响实测 1. 模型简介 Phi-3-mini-4k-instruct-gguf是微软Phi-3系列中的轻量级文本生成模型GGUF版本,特别适合中文场景下的问答、文本改写、摘要生成等任务。这个经过量化的模型版本在…...
大厂疯抢!AI Agent开发岗要求速览+进阶学习路线图,速收藏!
文章分析了大厂AI Agent开发岗位的核心要求,包括扎实的后端开发基础、AI知识储备、主流框架掌握等。文章强调AI应用开发与后端开发并非对立,而是相辅相成,并提供了详细的学习路线图,涵盖基础阶段、AI知识入门、实践项目、深化与拓…...
WebDAV网盘横向评测:从个人备份到多端同步的实战指南
1. WebDAV网盘入门:为什么你需要它? 刚接触WebDAV时,我和大多数人一样疑惑:明明有那么多现成的网盘,为什么还要折腾这个?直到有次出差,急需修改存放在某商业网盘里的设计方案,却发现…...
MCP服务器越权访问漏洞零容忍方案(基于Open Policy Agent的动态策略引擎实战)
第一章:MCP服务器越权访问漏洞零容忍方案总览MCP(Microservice Control Plane)服务器作为微服务架构中权限调度与策略执行的核心组件,其任意越权访问均可能导致全链路认证绕过、敏感配置泄露甚至横向渗透。本方案坚持“零容忍”原…...
从vector的push_back看C++的‘完美转发’:一个emplace_back如何省掉一次临时对象构造
从vector的emplace_back揭秘C完美转发的魔法 在C的世界里,vector作为最常用的容器之一,其性能优化一直是开发者关注的焦点。当我们向vector添加元素时,push_back和emplace_back这两个看似相似的函数,背后却隐藏着现代C最精妙的语言…...
智能车越野组硬件拆解:我们如何用CYT4BB7核心板与四硅麦矩阵搞定声音信标定位?
智能车越野组硬件拆解:四硅麦矩阵与CYT4BB7核心板的声学定位实战 全国大学生智能车竞赛越野组的硬件设计,本质上是一场关于精度、效率和可靠性的极限挑战。当其他队伍还在为三硅麦方案的布线发愁时,我们已经用四硅麦矩阵将声音信标定位误差控…...
3大实战场景解析:如何用FakeLocation实现Android应用级GPS伪装
3大实战场景解析:如何用FakeLocation实现Android应用级GPS伪装 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation FakeLocation是一款基于Xposed框架的Android位置模拟工…...
金蝶K3生产任务单状态查询SQL全解析:从计划到结案
1. 金蝶K3生产任务单状态查询SQL入门指南 第一次接触金蝶K3的生产任务单查询时,我也被那些复杂的SQL语句搞得头晕眼花。后来才发现,只要理解了系统设计逻辑,这些查询其实就像查快递单号一样简单。生产任务单在系统中会经历计划、确认、下达、…...
让通用 URL 准确落到目标 Page Builder:SAP Fiori 页面管理中的重定向实践
在很多 SAP Fiori 项目里,大家更容易把注意力放在 SAPUI5 组件、OData 服务、Launchpad 编排,或者 Fiori Elements 的元数据驱动开发上,却很少有人愿意花时间审视一条看似普通的访问路径。当系统进入页面管理阶段,尤其是管理员通过 Page Administration UI 去打开、维护、跳…...
