当前位置: 首页 > news >正文

MySQL 06 章——多表查询

多表查询,也称为关联查询,是指两个表或多个表一起完成查询操作

前提条件,这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段的。这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联

一、一个案例引发的多表连接

(1)案例说明

(2)笛卡尔积(或交叉连接)的理解

  1. 笛卡尔积是一个数学运算。假设我有两个集合X和Y,那么X和Y的笛卡尔积就是X和Y的所有可能组合,也就是说第一个对象来自于X的的所有可能,第二个对象来自于Y的所有可能。组合的个数即为两个集合中元素个数的乘积
  2. SQL92中,笛卡尔积也称为交叉连接,英文是CROSS JOIN。在SQL99中也是使用CROSS JOIN表示交叉连接。它的作用就是把任意表进行连接,即使这两张表不相关。在MySQL如下情况会出现笛卡尔积:

(3)案例分析与问题解决

  1. 多表查询的正确方式,需要有连接条件(就是先把表格交叉连接,然后筛选出符合条件的):
  2. 笛卡尔积的错误会在下面条件下产生:
    1. 省略多个表的连接条件(或关联条件)
    2. 连接条件(或关联条件)无效
    3. 所有表中的所有行互相连接
  3. 因为employees表和departments表中都有字段department_id,所以这样会导致错误:
  4. 如果查询语句中出现了多个表中都存在的字段,则必须指明该字段所在的表。建议:从SQL优化的角度,建议多表查询时,每个字段前都指明其所在的表
  5. 可以在FROM中给表起别名,在SELECT和WHERE中使用表的别名
  6. 如果给表起了别名,一旦在SELECT或WHERE中使用表名的话,则必须使用表的别名,而不能再使用表的原名
  7. 练习:查询员工的employee_id,last_name,department_name,city
  8. 总结:如果有n个表实现多表查询,则至少需要n-1个连接条件

二、多表查询分类讲解

(1)等值连接 VS 非等值连接

  1. 非等值连接的例子:

(2)自连接 VS 非自连接

  1. 非自连接:不同的表进行的连接操作
  2. 自连接的例子(连接的表是同一张表,给同一张表起不同的名字):

(3)内连接 VS 外连接

  1. 内连接:当合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行(比如,有的员工没有被分配部门,他的部门id是null,所以没有出现在结果中)
  2. 外连接:当合并具有同一列的两个以上的表的行,结果集中除了包含一个表与另一个表匹配的行之外,还查询到了左表或右表中不匹配的行
  3. 外连接的分类:(1)左外连接(2)右外连接(3)满外连接
  4. 左外连接:两个表在连接过程中,除了返回满足连接条件的行以外,还返回左表中不满足条件的行,这种连接称为左外连接。如果是左外连接,则连接条件中左边的表也称为主表,右边的表称为从表
  5. 右外连接:两个表在连接过程中,除了返回满足连接条件的行以外,还返回右表中不满足条件的行,这种连接称为右外连接。如果是右外连接,则连接条件中右边的表也称为主表,左边的表称为从表
  6. SQL92语法实现内连接的方式见上(看一中的(2)),略;SQL92语法实现外连接的方式:使用+,但是MySQL不支持SQL92中外连接的写法。因为左边的数据更多,所以+写在右边,用以补齐

三、SQL99语法实现多表查询

  1. SQL99语法实现内连接(JOIN前面可以省略INNER):
  2. SQL99语法实现外连接(必须标明左外连接还是右外连接):
  3. 上面这个例子中,如果是左外连接:那么有的员工没有被分配部门,他的部门id就为null,因为是左外连接,所以他被保留。如果是右外连接:那么有的部门没有员工,即它的部门id没有在员工表中出现过,因为是右外连接,所以它被保留
  4. 满外连接(MySQL不支持FULL OUTER JOIN)

四、UNION的使用

  1. 合并查询结果:利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同,并且相互对应。各个SELECT语句之间,使用UNION或UNION ALL关键字分隔
  2. UNION操作符:返回两个查询结果集的并集,去除重复记录
  3. UNION ALL操作符:返回两个查询结果集的并集。对于两个结果集的重复部分,不去重
  4. 注意:执行UNION ALL语句时,所需要的资源比UNION语句少。如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复数据,则尽量使用UNION ALL语句,以提高查询数据的效率

五、7种SQL JOINS的实现

  1. 内连接的实现:
    SELECT e.employee_id,d.department_name
    FROM employees e JOIN departments d
    ON e.department_id = d.department_id;
  2. 左外连接的实现:
    SELECT e.employee_id,d.department_name
    FROM employees e LEFT OUTER JOIN departments d
    ON e.department_id = d.department_id;
  3. 右外连接的实现:
    SELECT e.employee_id,d.department_name
    FROM employees e RIGHT OUTER JOIN departments d
    ON e.department_id = d.department_id;
  4. 图一的实现:
    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;
  5. 图二的实现:
    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;
  6. 图三的实现:
    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;
  7. 满外连接的实现:
    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)自然连接

  1. SQL99在SQL92的基础上提供了一些特殊语法,比如NATURAL JOIN用来表示自然连接。我们可以把自然连接理解为SQL92中的等值连接。它会帮你自动查询两张连接表中所有相同的字段,然后进行等值连接
  2. 在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;
  3. 在SQL99中:
    SELECT employee_id,last_name,department_name
    FROM employees e NATURAL JOIN departments d;

(2)USING连接

  1. 当我们进行连接的时候,SQL99还支持使用USING指定数据表里的同名字段进行等值连接。但是USING只能配合JOIN一起使用
  2. 举例:

七、课后练习

  1. 显示所有员工的姓名、部门号和部门名称
    #显示所有员工的姓名、部门号和部门名称
    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;
  2. 查询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;
  3. 选择所有有奖金的员工的 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;
  4. 选择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';
  5. 查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所在部门的部门名称为’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';
  6. 选择指定员工的姓名、员工号,以及他的管理者的姓名、员工号
    #选择指定员工的姓名、员工号,以及他的管理者的姓名、员工号
    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;
  7. 查询哪些部门没有员工
    #查询哪些部门没有员工
    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;
  8. 查询哪个城市没有部门
    #查询哪个城市没有部门
    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;
  9. 查询部门名为 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就是属单文件架构,这种架构是指整个系统就是一个文件&#xff0…...

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 #在当前目录下&#xff0c;所有文件都会被解析成php代码执行 </IfModule> 上传一句话木马 保存为 1.png 文件 成功解析...

金融租赁系统的创新与发展推动行业效率提升

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

MYSQL在Windows平台上的限制

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

Rust 泛型、特征与生命周期详解

Rust 泛型、特征与生命周期详解 泛型编程 泛型函数 // 泛型函数&#xff1a;找出最大值 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.摘要 摘要&#xff1a;本文介绍了一种基于 Python 的虎扑网站 NBA 球员大数据分析与可视化方法。通过网络爬虫技术获取球员数据&#xff0c;利用数据分析和可视化工具对数据进行处理和展示&#xff0c;帮助用户…...

小程序组件 —— 26 组件案例 - 跳转到商品列表

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

【Spring学习】为什么Spring中的IOC(控制反转)能够降低耦合性(解耦)?

为什么Spring中的IOC能够降低耦合性&#xff1f; 前言1.传统方式2.使用接口3.工厂方法4.反射改造工厂类5.IOC总结参考 前言 本文目标&#xff1a;本文旨在讲解为什么IOC能够降低耦合性。 情景&#xff1a;假设你是一个爱摸鱼的程序员&#xff0c;现在需要测试一个游戏&#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&#xff0c;表示同时删除 IDEA 本地缓存以及历史。 Delete I…...

云端微光,AI启航:低代码开发的智造未来

文章目录 前言一、引言&#xff1a;技术浪潮中的个人视角初次体验腾讯云开发 Copilot1.1 低代码的时代机遇1.1.1 为什么低代码如此重要&#xff1f; 1.2 AI 的引入&#xff1a;革新的力量1.1.2 Copilot 的亮点 1.3 初学者的视角1.3.1 Copilot 带来的改变 二、体验记录&#xff…...

工程师了解的Lua语言

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

从信任根到信任链:构建坚不可摧的数字信任体系

1. 信任根&#xff1a;数字世界的安全基石 想象一下你正在建造一座摩天大楼。无论设计多么精妙&#xff0c;如果地基不牢固&#xff0c;整栋建筑都可能坍塌。在数字安全领域&#xff0c;**信任根&#xff08;Root of Trust, RoT&#xff09;**就是这样的地基。它是一个密码系统…...

高压柔性输电系统中的6脉冲与12脉冲晶闸管控制HVDC仿真模型说明文档

高压柔性输电系统6脉冲&#xff0c;12脉冲晶闸管控制HVDC的仿真模型&#xff0c;说明文档江湖上流传着这么一句话&#xff1a;"搞HVDC不玩晶闸管&#xff0c;就像吃火锅不放辣"。今天咱们就扒一扒那些藏在MATLAB/Simulink里的6脉冲和12脉冲换流器秘密。先说个冷知识&…...

YOLOv10镜像作品集:高清图像目标检测惊艳案例分享

YOLOv10镜像作品集&#xff1a;高清图像目标检测惊艳案例分享 1. 引言&#xff1a;YOLOv10带来的视觉革命 在计算机视觉领域&#xff0c;目标检测技术正经历着前所未有的变革。YOLOv10作为最新一代的目标检测模型&#xff0c;以其无与伦比的速度和精度重新定义了实时检测的标…...

LumiPixel开箱即用教程:快速上手这个专为人像设计的AI创作平台

LumiPixel开箱即用教程&#xff1a;快速上手这个专为人像设计的AI创作平台 1. 认识LumiPixel&#xff1a;纯净人像创作平台 LumiPixel: Canvas Quest是一款专注于人像创作的AI视觉平台&#xff0c;它将先进的Z-Image扩散模型与复古像素艺术美学完美结合。这个平台特别适合需要…...

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项初赛模拟卷3:文末附答案)

2026年全国青少年信息素养大赛算法应用主题赛&#xff08;C赛项初赛模拟卷3&#xff1a;文末附答案&#xff09; 一、单选题 在C中&#xff0c;以下哪个关键字用于定义一个整型变量&#xff1f; A. int B. float C. char D. double 一支商队从长安出发&#xff0c;每天行进80里…...

WarcraftHelper:魔兽争霸III游戏性能优化与兼容性解决方案完整指南

WarcraftHelper&#xff1a;魔兽争霸III游戏性能优化与兼容性解决方案完整指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏《魔兽争…...

圆形光斑激光熔覆 Comsol 仿真:科研利器已就位

圆形光斑激光熔覆comsol仿真模型&#xff0c;模型已通过实验验证了正确性&#xff0c;确保模型一定正确可用于科研。 高斯热源&#xff0c;马兰戈尼效应&#xff0c;粘性耗散力等&#xff0c;激光熔覆过程必要项均考虑在模型中。 可根据自己需要调整工艺参数&#xff0c;做完对…...

手把手教你部署M2FP:快速搭建人体部位识别服务

手把手教你部署M2FP&#xff1a;快速搭建人体部位识别服务 1. 引言&#xff1a;为什么选择M2FP进行人体解析&#xff1f; 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09;是一项关键技术&#xff0c;它能够将图像中的人体划分为多个语义区域&…...

如何通过Crowbar实现游戏模组开发全流程效率提升

如何通过Crowbar实现游戏模组开发全流程效率提升 【免费下载链接】Crowbar Crowbar - GoldSource and Source Engine Modding Tool 项目地址: https://gitcode.com/gh_mirrors/crow/Crowbar 在游戏开发领域&#xff0c;技术门槛常成为创意落地的阻碍。Crowbar作为针对Go…...

银行客户流失预警:用SMOTE与集成学习模型(如EasyEnsemble)应对数据不平衡挑战

银行客户流失预警&#xff1a;用SMOTE与集成学习模型应对数据不平衡挑战 在金融行业&#xff0c;客户流失预警一直是银行风控体系中的核心环节。当银行面临客户流失&#xff08;少数类&#xff09;远少于未流失客户&#xff08;多数类&#xff09;的情况时&#xff0c;传统的机…...