MySQL 06 章——多表查询
多表查询,也称为关联查询,是指两个表或多个表一起完成查询操作
前提条件,这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段的。这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联
一、一个案例引发的多表连接
(1)案例说明
(2)笛卡尔积(或交叉连接)的理解
- 笛卡尔积是一个数学运算。假设我有两个集合X和Y,那么X和Y的笛卡尔积就是X和Y的所有可能组合,也就是说第一个对象来自于X的的所有可能,第二个对象来自于Y的所有可能。组合的个数即为两个集合中元素个数的乘积
- SQL92中,笛卡尔积也称为交叉连接,英文是CROSS JOIN。在SQL99中也是使用CROSS JOIN表示交叉连接。它的作用就是把任意表进行连接,即使这两张表不相关。在MySQL如下情况会出现笛卡尔积:
(3)案例分析与问题解决
- 多表查询的正确方式,需要有连接条件(就是先把表格交叉连接,然后筛选出符合条件的):
- 笛卡尔积的错误会在下面条件下产生:
- 省略多个表的连接条件(或关联条件)
- 连接条件(或关联条件)无效
- 所有表中的所有行互相连接
- 因为employees表和departments表中都有字段department_id,所以这样会导致错误:
- 如果查询语句中出现了多个表中都存在的字段,则必须指明该字段所在的表。建议:从SQL优化的角度,建议多表查询时,每个字段前都指明其所在的表
- 可以在FROM中给表起别名,在SELECT和WHERE中使用表的别名
- 如果给表起了别名,一旦在SELECT或WHERE中使用表名的话,则必须使用表的别名,而不能再使用表的原名
- 练习:查询员工的employee_id,last_name,department_name,city
- 总结:如果有n个表实现多表查询,则至少需要n-1个连接条件
二、多表查询分类讲解
(1)等值连接 VS 非等值连接
- 非等值连接的例子:
(2)自连接 VS 非自连接
- 非自连接:不同的表进行的连接操作
- 自连接的例子(连接的表是同一张表,给同一张表起不同的名字):
(3)内连接 VS 外连接
- 内连接:当合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行(比如,有的员工没有被分配部门,他的部门id是null,所以没有出现在结果中)
- 外连接:当合并具有同一列的两个以上的表的行,结果集中除了包含一个表与另一个表匹配的行之外,还查询到了左表或右表中不匹配的行
- 外连接的分类:(1)左外连接(2)右外连接(3)满外连接
- 左外连接:两个表在连接过程中,除了返回满足连接条件的行以外,还返回左表中不满足条件的行,这种连接称为左外连接。如果是左外连接,则连接条件中左边的表也称为主表,右边的表称为从表
- 右外连接:两个表在连接过程中,除了返回满足连接条件的行以外,还返回右表中不满足条件的行,这种连接称为右外连接。如果是右外连接,则连接条件中右边的表也称为主表,左边的表称为从表
- SQL92语法实现内连接的方式见上(看一中的(2)),略;SQL92语法实现外连接的方式:使用+,但是MySQL不支持SQL92中外连接的写法。因为左边的数据更多,所以+写在右边,用以补齐
三、SQL99语法实现多表查询
- SQL99语法实现内连接(JOIN前面可以省略INNER):
- SQL99语法实现外连接(必须标明左外连接还是右外连接):
- 上面这个例子中,如果是左外连接:那么有的员工没有被分配部门,他的部门id就为null,因为是左外连接,所以他被保留。如果是右外连接:那么有的部门没有员工,即它的部门id没有在员工表中出现过,因为是右外连接,所以它被保留
- 满外连接(MySQL不支持FULL OUTER JOIN)
四、UNION的使用
- 合并查询结果:利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同,并且相互对应。各个SELECT语句之间,使用UNION或UNION ALL关键字分隔
- UNION操作符:返回两个查询结果集的并集,去除重复记录
- UNION ALL操作符:返回两个查询结果集的并集。对于两个结果集的重复部分,不去重
- 注意:执行UNION ALL语句时,所需要的资源比UNION语句少。如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复数据,则尽量使用UNION ALL语句,以提高查询数据的效率
五、7种SQL JOINS的实现
- 内连接的实现:
SELECT e.employee_id,d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id;
- 左外连接的实现:
SELECT e.employee_id,d.department_name FROM employees e LEFT OUTER JOIN departments d ON e.department_id = d.department_id;
- 右外连接的实现:
SELECT e.employee_id,d.department_name FROM employees e RIGHT OUTER JOIN departments d ON e.department_id = d.department_id;
- 图一的实现:
SELECT e.employee_id,d.department_name FROM employees e LEFT OUTER JOIN departments d ON e.department_id = d.department_id WHERE e.department_id IS NULL;
- 图二的实现:
SELECT e.employee_id,d.department_name FROM employees e RIGHT OUTER JOIN departments d ON e.department_id = d.department_id WHERE e.employee_id IS NULL;
- 图三的实现:
SELECT employee_id,department_name FROM employees e LEFT OUTER JOIN departments d ON e.department_id = d.department_id WHERE e.department_id IS NULLUNION ALLSELECT employee_id,department_name FROM employees e RIGHT OUTER JOIN departments d ON e.department_id = d.department_id WHERE e.employee_id IS NULL;
- 满外连接的实现:
SELECT employee_id,department_name FROM employees e LEFT OUTER JOIN departments d ON e.department_id = d.department_idUNION ALLSELECT employee_id,department_name FROM employees e RIGHT OUTER JOIN departments d ON e.department_id = d.department_id WHERE e.employee_id IS NULL;
六、SQL99语法新特性
(1)自然连接
- SQL99在SQL92的基础上提供了一些特殊语法,比如NATURAL JOIN用来表示自然连接。我们可以把自然连接理解为SQL92中的等值连接。它会帮你自动查询两张连接表中所有相同的字段,然后进行等值连接
- 在SQL92中(这两张表有两个相同字段):
SELECT employee_id,last_name,department_name FROM employees e JOIN departments d ON e.department_id = d.department_id AND e.manager_id = d.manager_id;
- 在SQL99中:
SELECT employee_id,last_name,department_name FROM employees e NATURAL JOIN departments d;
(2)USING连接
- 当我们进行连接的时候,SQL99还支持使用USING指定数据表里的同名字段进行等值连接。但是USING只能配合JOIN一起使用
- 举例:
七、课后练习
- 显示所有员工的姓名、部门号和部门名称
#显示所有员工的姓名、部门号和部门名称 SELECT e.last_name,e.department_id,d.department_name FROM employees e LEFT OUTER JOIN departments d ON e.department_id = d.department_id;
- 查询90号部门员工的job_id和90号部门员工的location_id
#查询90号部门员工的job_id和90号部门员工的location_id SELECT e.job_id,d.location_id FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE e.department_id = 90;
- 选择所有有奖金的员工的 last_name , department_name , location_id , city
#选择所有有奖金的员工的 last_name , department_name , location_id , city SELECT e.last_name,d.department_name,l.location_id,l.city FROM employees e LEFT OUTER JOIN departments d ON e.department_id = d.department_id LEFT OUTER JOIN locations l ON d.location_id = l.location_id WHERE e.commission_pct IS NOT NULL;
- 选择city在Toronto的员工的last_name , job_id , department_id , department_name
#选择city在Toronto的员工的last_name , job_id , department_id , department_name SELECT e.last_name,e.job_id,d.department_id,d.department_id FROM employees e JOIN departments d ON e.department_id = d.department_id JOIN locations l ON d.location_id = l.location_id WHERE l.city = 'Toronto';
- 查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所在部门的部门名称为’Executive’
#查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所在部门的部门名称为’Executive’ SELECT e.last_name,e.job_id,e.salary,d.department_name,l.street_address FROM employees e LEFT OUTER JOIN departments d ON e.department_id = d.department_id LEFT OUTER JOIN locations l ON d.location_id = l.location_id WHERE d.department_name = 'Executive';
- 选择指定员工的姓名、员工号,以及他的管理者的姓名、员工号
#选择指定员工的姓名、员工号,以及他的管理者的姓名、员工号 SELECT emp.last_name "employees",emp.employee_id "Emp#",mgr.last_name "manager",mgr.employee_id "Mgr#" FROM employees emp LEFT OUTER JOIN employees mgr ON emp.manager_id = mgr.employee_id;
- 查询哪些部门没有员工
#查询哪些部门没有员工 SELECT d.department_id,d.department_name FROM employees e RIGHT OUTER JOIN departments d ON e.department_id = d.department_id WHERE e.employee_id IS NULL;
- 查询哪个城市没有部门
#查询哪个城市没有部门 SELECT l.city FROM departments d RIGHT OUTER JOIN locations l ON d.location_id = l.location_id #总结:where相当于是在on的基础上再筛选 WHERE d.location_id IS NULL;
- 查询部门名为 Sales 或 IT 的员工信息
#查询部门名为 Sales 或 IT 的员工信息 SELECT e.employee_id,e.last_name,d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE d.department_name IN('Sales','IT');
该笔记根据尚硅谷的MySQL课程整理
相关文章:

MySQL 06 章——多表查询
多表查询,也称为关联查询,是指两个表或多个表一起完成查询操作 前提条件,这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段的。这个关联字段可能建立了外键,也可能没…...

猴子吃桃.
本节通过学习解决一个有趣的问题来加深对递归的理解. 问题描述: 有一个猴子摘了桃子吃,第一天吃一半多一个,第二天吃第一天剩余的一半多一个,第三天吃第二天剩余的一半多一个..以此类推,当第n天时,恰好只剩下一个桃子.求猴子一共摘了多少桃子. 思路解析: 解读题目,第n天的桃子…...

游戏引擎学习第72天
无论如何,我们今天有一些调试工作要做,因为昨天做了一些修改,结果没有时间进行调试和处理。我们知道自己还有一些需要解决的问题,却没有及时完成,所以我们想继续进行这些调试。对我们来说,拖延调试工作总是…...

element-ui dialog 组件源码分享
简单分享 dialog 组件源码,主要从以下三个方面: 1、dialog 页面结构。 2、dialog 组件属性。 3、dialog 组件挂载。 4、dialog 组件事件。 一、dialog 页面结构: 二、组件属性: 2.1 visible 是否显示 Dialog,支持…...

unity开发之shader 管道介质流动特效
效果 shader graph 如果出现下面的效果,那是因为你模型的问题,建模做贴图的时候没有设置好UV映射,只需重新设置下映射即可...

人工智能之机器学习算法
所有的机器学习算法都是要优化的,优化的必要条件是确定优化的目标函数(损失函数),目标函数是根据实际问题(数据)转成的数学公式。 一.线性回归原理推导 (1)回归问题概述 在机器学习的有监督算法中,分类与回归二种情…...
Android布局layout的draw简洁clipPath实现圆角矩形布局,Kotlin
Android布局layout的draw简洁clipPath实现圆角矩形布局,Kotlin 通常,如果要把一个相对布局,FrameLayout,或者线性布局等这样的布局变成具有圆角或者圆形的布局,需要增加一个style,给它设置圆角,…...

信息系统常见的系统架构
1.1单文件架构 现在很多企业内部虽然已经建设了一些信息系统,但还是有不少业务没有用专门的信息系统管理起来,普遍都是采用Excel表格来实现这些业务数据的填报和查询统计。Excel就是属单文件架构,这种架构是指整个系统就是一个文件࿰…...

AngularJS 过滤器:提升用户体验的数据处理利器
AngularJS 过滤器:提升用户体验的数据处理利器 AngularJS,作为一款由Google维护的开源JavaScript框架,以其独特的双向数据绑定和MVVM(Model-View-ViewModel)架构在Web应用开发领域占据着重要地位。其中,AngularJS的过滤器(Filters)功能,为开发者提供了一种轻量级、高…...

Upload-labs 第四关(学习记录)
上传.htaccess文件 SetHandler application/x-httpd-php <IfModule mime_module> SetHandler application/x-httpd-php #在当前目录下,所有文件都会被解析成php代码执行 </IfModule> 上传一句话木马 保存为 1.png 文件 成功解析...

金融租赁系统的创新与发展推动行业效率提升
金融租赁系统的技术升级与创新 在当今快速发展的金融市场中,金融租赁系统的技术升级与创新充满了无限可能。想象一下,传统的租赁方式就像一位沉闷的老师,而新兴技术就如同一位活泼的学生,不断追求新鲜事物。通过自动化、人工智能…...

MYSQL在Windows平台上的限制
以下限制适用于在Windows平台上使用MySQL: 程序内存 在windows32位上,一个进程(包括MySQL)内默认使用超过2GB的内存是不可能的。这是因为windows 32位的物理地址限制是4GB,视窗内的默认设置是在内核(2GB&a…...

Rust 泛型、特征与生命周期详解
Rust 泛型、特征与生命周期详解 泛型编程 泛型函数 // 泛型函数:找出最大值 fn largest<T: PartialOrd>(list: &[T]) -> &T {let mut largest &list[0];for item in list {if item > largest {largest item;}}largest }fn main() {let…...

基于 Python 虎扑网站的 NBA 球员大数据分析与可视化
标题:基于 Python 虎扑网站的 NBA 球员大数据分析与可视化 内容:1.摘要 摘要:本文介绍了一种基于 Python 的虎扑网站 NBA 球员大数据分析与可视化方法。通过网络爬虫技术获取球员数据,利用数据分析和可视化工具对数据进行处理和展示,帮助用户…...

小程序组件 —— 26 组件案例 - 跳转到商品列表
在上一节实现了商品导航区域,这一节实现跳转到商品列表的功能;当用户在点击商品导航时,需要能够跳转到商品列表页面;在微信小程序中,如果需要进行跳转,需要使用 navigator 组件,navigator 组件有…...

【Spring学习】为什么Spring中的IOC(控制反转)能够降低耦合性(解耦)?
为什么Spring中的IOC能够降低耦合性? 前言1.传统方式2.使用接口3.工厂方法4.反射改造工厂类5.IOC总结参考 前言 本文目标:本文旨在讲解为什么IOC能够降低耦合性。 情景:假设你是一个爱摸鱼的程序员,现在需要测试一个游戏&#x…...

机场安全项目|基于改进 YOLOv8 的机场飞鸟实时目标检测方法
目录 论文信息 背景 摘要 YOLOv8模型结构 模型改进 FFC3 模块 CSPPF 模块 数据集增强策略 实验结果 消融实验 对比实验 结论 论文信息 《科学技术与工程》2024年第24卷第32期刊载了中国民用航空飞行学院空中交通管理学院孔建国, 张向伟, 赵志伟, 梁海军的论文——…...

卸载干净 IDEA(图文讲解)
目录 1、卸载 IDEA 程序 2、注册表清理 3、残留清理 1、卸载 IDEA 程序 点击屏幕左下角 Windows 图标 -> 设置-控制面板->intellij idea 勾选第一栏 Delete IntelliJ IDEA 2022.2 caches and local history,表示同时删除 IDEA 本地缓存以及历史。 Delete I…...

云端微光,AI启航:低代码开发的智造未来
文章目录 前言一、引言:技术浪潮中的个人视角初次体验腾讯云开发 Copilot1.1 低代码的时代机遇1.1.1 为什么低代码如此重要? 1.2 AI 的引入:革新的力量1.1.2 Copilot 的亮点 1.3 初学者的视角1.3.1 Copilot 带来的改变 二、体验记录ÿ…...

工程师了解的Lua语言
1、关于lua语言 lua语言是用于嵌入式领域当中的一门脚本语言,其实在大学期间,我也没有接触过这门语言,但是在未来的发展之路当中,需要用到这门语言,所以在我的知识库当中添加这门语言知识是必要而且重要的,…...

著名的软件都用什么语言编写?
你是否曾经好奇,身边那些耳熟能详的软件,它们究竟是用什么语言编写的?从操作系统到浏览器、从数据库到编程工具,每一款软件背后都承载着开发者们的智慧与技术选型。那么,究竟哪些编程语言成就了这些世界级的软件呢&…...

设计模式 结构型 代理模式(Proxy Pattern)与 常见技术框架应用 解析
代理模式(Proxy Pattern)是一种常见的设计模式,在软件开发中有着广泛的应用。其核心思想是通过创建一个代理类来控制对另一个对象的访问,从而实现对目标对象功能的扩展、保护或其他附加操作。 一、核心思想 代理模式的核心思想在…...

Linux环境(CentOs7) 安装 Node环境
Linux环境(CentOs7) 安装 Node环境 使用NodeSource安装Node.js 1、清除缓存(可选但推荐) sudo yum clean all2、添加NodeSource仓库,根据你想要安装的Node.js版本,选择相应的NodeSource安装脚本。例如&am…...

Tailwind CSS 实战:现代登录注册页面开发
在前端开发中,登录注册页面是最常见的需求之一。一个设计精美、交互友好的登录注册页面不仅能提升用户体验,还能增加产品的专业度。本文将详细介绍如何使用 Tailwind CSS 开发一个现代化的登录注册页面。 设计思路 在开始编码之前,我们先明…...

Unity2022接入Google广告与支付SDK、导出工程到Android Studio使用JDK17进行打包完整流程与过程中的相关错误及处理经验总结
注:因为本人也是第一次接入广告与支付SDK相关的操作,网上也查了很多教程,很多也都是只言片语或者缺少一些关键步骤的说明,导致本人也是花了很多时间与精力踩了很多的坑才搞定,发出来也是希望能帮助到其他人在遇到相似问…...
反向传播算法的偏置更新步骤
偏置的更新步骤 假设我们有一个三层神经网络(输入层、隐藏层和输出层),并且每层的激活函数为 sigmoid 函数。我们需要更新隐藏层和输出层的偏置。以下是详细的步骤: 1. 计算误差项(Error Term) 输出层的…...

条款47:请使用 traits classes 表现类型信息(Use traits classes for information about types)
条款47:请使用 traits classes 表现类型信息 1.1 提出问题 想一想,下面的功能如何实现?(可以查看std::advance源码) template<typename IterT, typename DistT> void advance(IterT& iter, DistT d); /…...

yolov5和yolov8的区别
1. yolov5有建议框,yolov8没有建议框 2. yolov5标签中有自信度,而yolov8没有自信度。因为自信度是建议框和真实框的交集 3. yolov5有三个损失函数,回归问题:预测框和建议框的损失(中心点宽高偏移量的损失):CIOUFocal…...

Redis 实现分布式锁
文章目录 引言一、Redis的两种原子操作1.1 Redis 的原子性1.2 单命令1.3 Lua 脚本1.4 对比单命令与 Lua 脚本 二、Redis 实现分布式锁2.1 分布式锁的概念与需求2.1.1 什么是分布式锁?2.1.2 分布式锁的常见应用场景 2.2 基于 Redis 的分布式锁实现2.2.1 锁的获取与释…...

django StreamingHttpResponse fetchEventSource实现前后端流试返回数据并接收数据的完整详细过程
django后端环境介绍: Python 3.10.14 pip install django-cors-headers4.4.0 Django5.0.6 django-cors-headers4.4.0 djangorestframework3.15.2 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 总环境如下: Package Version -…...