【MySQL多表查询】:让你的数据检索更高效

news2025/1/16 18:44:12

前言

欢迎来到小K的MySQL专栏,本节将为大家带来MySQL中多表查询相关知识的讲解

目录

      • 前言
      • 一、多表关系
      • 二、多表查询
        • 1、交叉连接
        • 2、内连接
        • 3、外连接
      • 三、集合运算
      • 四、七种JOINS实现
      • 五、多表查询练习
      • 六、总结


一、多表关系

✨项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为以下三种

  • 一对多(多对一)
  • 多对多
  • 一对一

✨✨一对多(多对一)

案例:部门与员工的关系

关系:一个部门对应多个员工,一个员工对应一个部门

实现:在多的一方建立外键,关联另一方的主键

在这里插入图片描述

✨✨多对多

案例:学生与课程的关系

关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择

实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

在这里插入图片描述

✨✨一对一

案例:用户与用户详细的关系
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。
实现:在任意一方加入一个外键,关联另一方的主键,并且设置外键为唯一约束

在这里插入图片描述
在这里插入图片描述

二、多表查询

✨前面我们使用的查询,只是对单表进行查询,在具体的应用中,经常需要实现在一个查询语句中显示多张数据表的数据,这就是所谓的多表联合查询

在具体实现连接操作时,首先将两个或两个以上的表按照某个条件连接起来,然后再查询到所要求的数据记录

✨✨连接查询分为交叉连接,内连接,外连接查询三种方式。

1、交叉连接

✨交叉连接不带WHERE子句,它返回被连接的两个表所有数据行的笛卡尔积笛卡尔乘积公式 : A表中数据条数 * B表中数据条数 = 笛卡尔乘积

✨✨交叉连接语法:

SELECT <字段名> FROM <表1> CROSS JOIN <表2> 
SELECT <字段名> FROM <表1>, <表2> 

✨✨交叉连接练习:查询员工及员工所在部门信息

SELECT * FROM emp,dept; 
SELECT * FROM emp CROSS JOIN dept; 

结果有56条,员工有14人,部门有4个,但是这样就会产出很多无效记录,特别是两张表的数据量都很大,这时候就需要消除笛卡尔积的无效记录,我们需要使用关联字段

✨✨范例:利用等值条件来处理笛卡尔积

SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;

这样我们处理完之后就只有14条记录了,刚好一一对应

2、内连接

内连接又分为等值连接、非等值连接和自连接三种类型。其中,等值连接是指两个表中需要匹配的列具有相同的值;非等值连接是指两个表中需要匹配的列具有不同的值;自连接是指一个表与自身进行联接。在表关系的笛卡尔积数据记录中,保留表关系中所有匹配的数据记录,舍弃不匹配的数据记录。按匹配的条件可以分成等值连接和不等值连接。✨

✨✨有两种语法,显示的和隐式的,返回连接表中符合连接条件和查询条件的数据行(所谓的连接表就是数据库在做查询形成的中间表)

  • 隐式内连接

    SELECT * FROM 表1,表2 WHERE 条件;
    
  • 显示内连接(使用关键字INNER JOIN)

    SELECT * FROM 表1 [INNER] JOIN 表2 ON 条件; 
    

等值连接:

在连接条件中使用等于号(=)运算符比较被连接列的列值

  • 查询员工及部门信息

    #隐式连接
    SELECT * FROM emp e,dept d WHERE e.deptno=d.deptno;
    #显示连接
    SELECT * FROM emp e INNER JOIN dept d ON e.deptno=d.deptno;
    

    需要注意的是:如果指定了别名,原来的SQL表名就不可以使用了

  • 等值连接可以使用USING来自动关联两表中相同的列

    SELECT * FROM emp INNER JOIN dept USING(deptno);
    

    效果如下:

在这里插入图片描述

非等值连接:

在连接条件使用除等于运算符以外的其它比较运算符比较被连接的 列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>等

  • 查询员工工资级别

    #隐式连接
    SELECT * FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;
    #显示连接
    SELECT * FROM emp e INNER JOIN salgrade s ON  e.sal BETWEEN s.losal AND s.hisal;
    

    效果如下:

在这里插入图片描述

自连接:

自连接就是指表与其自身进行连接

在这里插入图片描述

我们可以看上面的员工表,如果我们现在要查询每个员工对应的领导姓名,需要通过自连接

SELECT e.ename,e.mgr,me.ename 领导 FROM emp e,emp me WHERE e.mgr=me.empno;

在这里插入图片描述

3、外连接

✨在表关系的笛卡尔积中,不仅保留表关系中所有匹配的数据记录,而且还保留部分不匹配的记录。按照保留不匹配条件数据记录来源可以分为左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。

语法:

SELECT * FROM 表1 LEFT|RIGHT|FULL [OUTER] JOIN 表2 ON 条件; 
  • 左外链接

    表关系的笛卡尔积中,出了选择相匹配的数据记录,还包含关联左边表中不匹配的数据记录。

    查询员工及对应的部门信息(没有部门的员工也显示出来,没有员工的部门不显示

    SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno;
    

    效果如下:

在这里插入图片描述

  • 右外连接

    在表关系的笛卡尔积中,出了选择相匹配的数据记录,还包含关联右边表中不匹配的数据记录。

    查询员工及对应的部门信息(没有部门的员工不显示,没有员工的部门显示

    SELECT * FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno;
    

    效果如下:

在这里插入图片描述

  • 全连接:

    在表关系的笛卡尔积中,出了选择相匹配的数据记录,还包含关联左右两边表中不匹配的数据记录。

    查询员工及对应的部门信息(没有部门的员工显示,没有员工的部门显示

    SELECT *
    FROM emp  LEFT JOIN dept
    ON emp.deptno=dept.deptno
    UNION
    SELECT *
    FROM emp  RIGHT JOIN dept
    ON emp.deptno=dept.deptno
    WHERE emp.deptno IS NULL;
    

    这个看不懂没关系,因为MySQL不支持全连接,所以我们这里用了集合运算实现的,下面会讲~

    效果如下:

在这里插入图片描述

三、集合运算

✨MySQL支持并集运算,并集即两个集合的所有部分
在这里插入图片描述

  • UNION DISTINCT

    • UNION ALL 不会删除重复行

    • 相同的行在结果中只出现一次

      SELECT * FROM emp
      UNION
      SELECT * FROM emp WHERE deptno=10;
      
  • UNION ALL:

    • UNION 会删除重复行

    • 相同的行在结果中可能出现多次

      SELECT * FROM emp
      UNION ALL
      SELECT * FROM emp WHERE deptno=10;
      

✨✨要求:

  • 输入的查询不能包含ORDER BY字句,可以为整个集合运算结果选择性地增加一个ORDER BY字句
  • 两个查询必须包含相同的列数
  • 相应列必须具有兼容的数据类型。兼容的数据类型:优先级较低的数据类型必须能隐式转换为较高级的数据类型。比如输入的查询1的第一列为int类型,输入的查询2的第一列为float类型,则较低的数据类型int类型可以隐式地转换为较高级float类型。如果输入的查询1的第一列为char类型,输入的查询2的第一列为datetime类型,则会提示转换失败:从字符串转换日期或字符串转时间时,转换失败;
  • 集合运算结果中列名由输入的查询1决定,如果要为结果分配结果列,应该在输入的查询1中分配相应的别名
  • 集合运算时,对行进行时,集合运算认为两个NULL相等

四、七种JOINS实现

在这里插入图片描述

图一就是左外连接:

SELECT *
FROM emp  LEFT JOIN dept
ON emp.deptno=dept.deptno; 

图二为右外连接:

SELECT * 
FROM emp RIGHT JOIN dept
ON emp.deptno=dept.deptno;

图三为左外连接去掉交集部分:

SELECT *
FROM emp  LEFT JOIN dept
ON emp.deptno=dept.deptno
WHERE emp.deptno IS NULL;

图四为等值连接,只要交集:

SELECT *
FROM emp e,dept d
WHERE e.deptno=d.deptno;

图五为右外连接去掉交集部分:

SELECT *
FROM emp  RIGHT JOIN dept
ON emp.deptno=dept.deptno
WHERE emp.deptno IS NULL;

图六可以可以为1,5或2,3或4,7的并集:

SELECT *
FROM emp  LEFT JOIN dept
ON emp.deptno=dept.deptno
UNION
SELECT *
FROM emp  RIGHT JOIN dept
ON emp.deptno=dept.deptno
WHERE emp.deptno IS NULL;

图七为3,5的并集:

SELECT *
FROM emp  LEFT JOIN dept
ON emp.deptno=dept.deptno
WHERE emp.deptno IS NULL
UNION
SELECT *
FROM emp  RIGHT JOIN dept
ON emp.deptno=dept.deptno
WHERE emp.deptno IS NULL;

效果如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、多表查询练习

题目:

✨✨查询出雇佣日期在1981年的所有员工的编号、姓名、雇佣日期、工作、领导姓名、雇佣月工资、雇佣年工资(基本工资+奖金),工资等级、部门编号、部门名称、部门位置,并且求这些员工的月基本工资在1500~3500之间,将最后的结果按照年工资的降序排列,如果年工资相等,则按照工作进行排序。

需求很多,逐步分析

  • 确定所需要的数据表
    • emp:编号、姓名、雇佣日期,工作、月工资、年薪
    • emp:领导姓名
    • dept:部门编号、名称、位置
    • salgrade:工资等级
  • 确定一致的关联字段
    • 员工和领导:e.mgr=e1.empno
    • 员工和部门:e.deptno=dept.deptno
    • 员工和工资等级:e.sal BETWEEN s.losal AND s.hisal

✨✨步骤一:查询出所有在1981年雇佣的雇员编号、姓名、御用日期、工作、月工资、年工资,并且月薪在1500~3500之间。只需要emp单张表即可。

SELECT e.empno,e.ename,e.hiredate,e.job,e.sal,(e.sal+IFNULL(e.comm,0))*12 年薪
FROM emp e
WHERE DATE_FORMAT(e.hiredate,'%Y')='1981' AND e.sal BETWEEN 1500 AND 3500;

✨✨步骤二:加入领导信息,使用自身关联。

SELECT e.empno,e.ename,e.hiredate,e.job,me.ename 领导,e.sal,(e.sal+IFNULL(e.comm,0))*12 年薪
FROM emp e,emp me
WHERE DATE_FORMAT(e.hiredate,'%Y')='1981' AND e.sal BETWEEN 1500 AND 3500
AND e.mgr=me.empno;

✨✨步骤三:加入工资等级和部门信息

SELECT e.empno,e.ename,e.hiredate,e.job,me.ename 领导,e.sal,(e.sal+IFNULL(e.comm,0))*12 年薪,s.grade,d.deptno,d.dname,d.loc
FROM emp e,emp me,salgrade s,dept d
WHERE DATE_FORMAT(e.hiredate,'%Y')='1981' AND e.sal BETWEEN 1500 AND 3500
AND e.mgr=me.empno
AND e.sal BETWEEN s.losal AND s.hisal
AND e.deptno=d.deptno;

✨✨步骤四:排序

SELECT e.empno,e.ename,e.hiredate,e.job,me.ename 领导,e.sal,(e.sal+IFNULL(e.comm,0))*12 年薪,s.grade,d.deptno,d.dname,d.loc
FROM emp e,emp me,salgrade s,dept d
WHERE DATE_FORMAT(e.hiredate,'%Y')='1981' AND e.sal BETWEEN 1500 AND 3500
AND e.mgr=me.empno
AND e.sal BETWEEN s.losal AND s.hisal
AND e.deptno=d.deptno
ORDER BY 年薪 DESC,job ASC;

效果如下:

在这里插入图片描述

六、总结

MySQL多表查询的优点有很多,例如可以减少数据冗余,提高查询效率,方便数据分析等等。

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

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

相关文章

6月人工智能论文推荐

Prompt Space Optimizing Few-shot Reasoning Success with Large Language Models https://arxiv.org/abs/2306.03799 Prompt engineering 是通过提供明确和具体的指令来增强大型语言模型(llm)能力的基本技术。它使LLM能够在各种任务中脱颖而出&#xff0c;例如算术推理、问…

列表、表格、表单

day02&#xff1a;列表、表格、表单 目标&#xff1a;掌握嵌套关系标签的写法&#xff0c;使用列表标签布局网页 01-列表 作用&#xff1a;布局内容排列整齐的区域。 列表分类&#xff1a;无序列表、有序列表、定义列表。 无序列表 作用&#xff1a;布局排列整齐的不需要规…

Bean 的生命周期

观前提示:本篇博客演示使用的 IDEA 版本为2021.3.3版本,使用的是Java8(又名jdk1.8) 电脑使用的操作系统版本为 Windows 10 目录 Spring 的执行流程 1. 启动容器 2. 根据配置完成 Bean 的初始化 3. 注册 Bean 对象到容器中 4. 装配 Bean 的属性 Bean 的生命周期 Bean 的…

掌握Python的X篇_2_Python的安装

掌握Python的X篇_2_Python的安装 1. 软件安装包下载1.1 Python版本的区别1.2 同一版本不同安装包的区别 2. 安装过程3. 验证是否安装成功 1. 软件安装包下载 下载地址&#xff1a;https://www.python.org/downloads/ 可以看到最新版本和历史版本 1.1 Python版本的区别 就像…

express的使用(五) 简单的使用mongodb

原文链接 express的使用(五) 简单的使用mongodb 不要脸的求关注&#xff0c;希望能让大家批评我的不足点&#xff0c;一键三连最好了 看前提示 本篇主要描述关于express中使用mongodb以及mongodb的简单介绍还有初步使用&#xff0c;不涉及任何常用的语法&#xff0c;不建议有…

算法刷题-双指针-反转链表

反转链表的写法很简单&#xff0c;一些同学甚至可以背下来但过一阵就忘了该咋写&#xff0c;主要是因为没有理解真正的反转过程。 206.反转链表 力扣题目链接 题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2-…

AMD CPU微架构分析

一、SoC架构 1.1 整体架构 Zeppelin 参考链接&#xff1a;wikichip: Zeppelin 通过infinity fabric总线将单die分成多die的SoC架构&#xff0c;每个Die包含两个CPU核&#xff08;CCX&#xff09;、2各DDR通道、USB、低功耗IO以及多个IFOP和IFIS serdes接口。 如下所述中&…

干翻Mybatis源码系列之第十篇:Mybatis Plugins基本概念与拦截概述

给自己的每日一句 不从恶人的计谋&#xff0c;不站罪人的道路&#xff0c;不坐亵慢人的座位&#xff0c;惟喜爱耶和华的律法&#xff0c;昼夜思想&#xff0c;这人便为有福&#xff01;他要像一棵树栽在溪水旁&#xff0c;按时候结果子&#xff0c;叶子也不枯干。凡他所做的尽…

vue jointjs 拓扑图 自定义shape 按需引入

只展示部分核心代码&#xff0c;完整代码见文章尾部连接 import jointjs/dist/joint.core.css;// 类库 包含: Paper Graph Cell CellView Element Link 等等 import { dia } from jointjs/src/core.mjs; // 样式库 包含多个分组(basic standard custom ...) import * as standa…

基于Hexo和Butterfly创建个人技术博客,(11) 使用插件增强博客站点能力

Butterfly官方网站&#xff0c;请 点击进入 本章目标&#xff1a; 掌握常用的plugin插件的用法&#xff0c;本文中是butterfly主题内置集成的第三方插件(部分插件需要再次安装)&#xff1b; 一、建议开启的三方插件 KaTeX-数学公式 katex:enable: true# true 表示每一页都加载…

C# NX二次开发:通过UFUN函数获取刀具描述,目录号,库号等信息

今天要将的是&#xff0c;在NX中对CAM模块进行二次开发的时候&#xff0c;往往需要获取一些关于刀具使用的信息&#xff0c;这些信息用NXOPEN的的方法录制也可以录制出来&#xff0c;但是录制出来的代码&#xff0c;往往都是一种刀具类型会出现一个Builder。这样在你不知道有多…

淘宝买家订单API

目录 下载安装与运行 支持的订单读取方式 请求数据格式一 请求头示例 数据格式说明 数据格式示例 返回数据格式一 返回头示例 数据格式说明 数据格式示例 请求数据格式二&#xff08;根据订单编号&#xff09; 请求头示例 返回数据格式二&#xff08;根据订单编号…

【随笔记】如何获得铁粉(仅供参考)

文章目录 一、前言二、秘籍2.1 良好的个人简介2.2 统一的文章格式2.3 详细的专栏划分2.4 有序的博客排版2.4.1 目录部分2.4.2 正文部分2.4.2.1 标题分级2.4.2.2 正文分段2.4.2.3 善用多级列表2.4.2.4 章节分割 三、总结 一、前言 在这篇随笔记的开始&#xff0c;我想声明一下&a…

ChatGPT将改变教育,而不是摧毁它

01 学校和大学的反应迅速而果断 就在 OpenAI 于 2022 年 11月下旬发布ChatGPT 的几天后&#xff0c;该聊天机器人被广泛谴责为一种免费的论文写作、应试工具&#xff0c;它很容易在作业中作弊。 美国第二大学区洛杉矶联合大学立即阻止了OpenAI网站从其学校网络访问。其他人很…

【Java】Java核心要点总结 67

文章目录 1. 浮点数运运算会有精度损失2. 构造方法特点 & 不能被重写3. 接口和抽象类的异同4. Object 类的常见方法5. hashCode() 有什么用 为什么要有 hashCode() 1. 浮点数运运算会有精度损失 这个和计算机保存浮点数的机制有很大关系。我们知道计算机是二进制的&#x…

面试时一定要确认该岗位的直属领导是否在场,如果不在,千万不要接offer,有坑!...

对于有心人来说&#xff0c;面试时可以看出许多隐形信息&#xff0c;比如下面这位网友的提醒&#xff1a; 面试时一定要确认这个岗位的直接汇报领导是否参与了面试&#xff0c;如果没有参与&#xff0c;千万不要接offer&#xff01; 该职位的直接领导不参与面试&#xff0c;只能…

NLP——Topic Modelling

文章目录 A Brief History of Topic ModelsLatent Dirichlet Allocation &#xff08;LDA&#xff09;潜在狄利克雷分布核心思想LDA inputLDA output LDA 如何学习Sampling-based mothods 基于采样的方法Infer Topics For New Documents超参数 Variational methods 变分方法 Ev…

java协同过滤算法的校园二手图书网站springboot vue

用户&#xff1a;&#xff08;商品推荐算法&#xff09; 1)首页主要由导航栏、图书展示页、分页所组成。访客能浏览网站上的待出售图书的信息&#xff0c;但是若要购买&#xff0c;收藏图书&#xff0c;查看卖家信息则会自动跳转到登录界面&#xff0c;已经登录的用户则可以浏…

WPS AI最全申请与使用手册;AIGC制作游戏音乐;便宜快捷使用完整版SD;人人都能看懂的ChatGPT原理课 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 面向虚拟世界的生成式AI市场全景图 作者在这篇文章中探讨了生成式AI在虚拟世界的应用&#xff0c;并绘制了 Market Map V3.0 (市场全景…

C++ 有用的资源||19道必须掌握的C++面试题

C 有用的资源 C 有用的资源 以下资源包含了 C 有关的网站、书籍和文章。请使用它们来进一步学习 C 的知识。 C 有用的网站 C Programming Language Tutorials − C 编程语言教程。C Programming − 这本书涵盖了 C 语言编程、软件交互设计、C 语言的现实生活应用。C FAQ −…