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

news2024/11/18 13:30:06

前言

欢迎来到小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/681836.html

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

相关文章

MySQL生产环境高可用架构详解

一、MySQL高可用集群介绍 1、数据库主从架构与分库分表 随着现在互联网的应用越来越大&#xff0c;数据库会频繁的成为整个应用的性能瓶颈。而 我们经常使用的MySQL数据库&#xff0c;也会不断面临数据量太大、数据访问太频繁、数据 读写速度太快等一系列的问题。所以&#xf…

记录分享在10年老的商务本Dell E6230上安装Debian 12的过程,遇到的问题和解决方法

原先在笔记本上安装的是Debian 9&#xff0c;最近发现无法更新了&#xff0c;查一下发现&#xff0c;所有的“源”只支持deb10&#xff0c;11 和 12&#xff0c;所以特意订了一块新的硬盘来安装新系统&#xff0c;前后倒腾了两天多。 在此记录这个过程中遇到的问题和解决的方法…

Mysql主从复制和读写分离(期望日子清静,抬头皆是温柔)

文章目录 一、读写分离1.什么是读写分离?2.为什么要读写分离呢?3.什么时候要读写分离?4.读写分离原理5.读写分离方式&#xff08;1&#xff09;基于程序代码内部实现&#xff08;2&#xff09;基于中间代理层实现 二、主从复制1.主从复制与读写分离的关系2.mysql支持的复制类…

langchain源码阅读系列(一)之LLM输入输出管理

原文首发于博客文章OpenAI 文档解读 LangChain 主体分为 6 个模块&#xff0c;分别是对&#xff08;大语言&#xff09;模型输入输出的管理、外部数据接入、链的概念、&#xff08;上下文记忆&#xff09;存储管理、智能代理以及回调系统&#xff0c;通过文档的组织结构&#x…

如何编写一个最简单的 udp 版本的 echo server 和 echo client(小白也懂!)

目录 目的 第一步 编写Server(服务器) 第二步 创建Server的各类参数 第三步 实现具体的Server内容 第四步 编写Client(客户端) 实现具体的Client内容 总流程 总代码 源码下载 目的 我们编写一个udp 版本的 echo server 和 echo client 实现在自己电脑上通过客户端…

open【部署、使用教程】

目录 【1】创建证书 【2】安装openVPN-Server端并配置 【3】将证书移动到相对路径 【4】开启内核转发功能&#xff0c;否则会无法启动openVPN 【5】启动服务&#xff0c;加入开机自启 【6】启动后服务端会生成一个tun0的虚拟网卡&#xff0c;用于不同网段之间相互通信 【…

VUE2.0集成 Markdown 编辑器

Markdown编辑器的使用 这是一款基于Vue的markdown编辑器。既可以用来编辑Markdown语法&#xff0c;又可以用来解析 效果图,mavonEditor实现了Markdown集成 Markdown是一种标记语言&#xff0c;相较于word文档更加清晰方便&#xff0c;适合进行笔记等。将Markdown集成进入自己项…

Matlab使用S函数

什么是S函数&#xff1f; S-函数是系统函数&#xff08;System Function&#xff09;的简称&#xff0c;在 Simulink 中用非图形化的方式来描述一个模块。一个完整的S-函数结构体系包含了描述一个动态系统所需要的全部能力。使用S-函数用户可以向 Simulink 模型中添加自己的模块…

【PCB专题】Allegro中设置泪滴

PCB绘制完成后有时按需要对PCB进行添加泪滴的操作是非常必要的。 添加泪滴的作用主要是: 信号传输时平滑阻抗,减少阻抗的急剧跳变,避免高频信号传输时由于线宽突然变小而造成反射。 焊接时可以保护焊盘,避免多次焊接时焊盘的脱落,生产时可以避免蚀刻不均,以及过孔偏位出…

一键安装和导出当前Python项目的依赖包总结

创建python环境&#xff0c;配置一个python运行项目。在项目可以运行的环境下&#xff0c;导出该项目所依赖包到一个requirements.txt文档中。在另一个纯净环境中&#xff0c;快速批量安装项目所依赖的包&#xff0c;便于快速进行项目迁移 一、导出当前Python项目的依赖包1、方…

【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问

目录 一、虚拟头节点二、数组的随机访问三、动态数组、链表复杂度分析四、动态数组 add(E element) 复杂度分析五、动态数组的缩容 一、虚拟头节点 &#x1f33c; 为了让代码更加精简&#xff0c;统一所有节点的处理逻辑&#xff0c;可以在最前面增加一个虚拟的头节点&#xf…

2023 年最佳 C++ IDE

文章目录 前言1. Visual Studio2. Code::Blocks3. CLion4. Eclipse CDT&#xff08;C/C 开发工具&#xff09;5. CodeLite6. Apache NetBeans7. Qt Creator8. Dev C9. C Builder10. Xcode11. GNAT Programming Studio12. Kite总结 前言 要跟踪极佳 IDE&#xff08;集成开发环境…

嵌入式系统复习要点

目录 1、嵌入式系统的核心部分主要由硬件和软件两部分组成&#xff1a; 2、嵌入式系统硬件&#xff1a; 3、嵌入式处理器从体系上分类&#xff0c;可以分为冯诺依曼结构和哈佛结构两种&#xff1a; 4、几类常见的嵌入式处理器类型&#xff1a; 5、MCU组成结构&#xff1a;…

chatgpt赋能python:介绍:Python经典小游戏合集

介绍&#xff1a;Python经典小游戏合集 作为一门简洁易学、受到广泛喜爱的编程语言&#xff0c;Python已经在各个领域中得到了广泛应用&#xff0c;包括游戏开发。在这篇文章中&#xff0c;我们将为您介绍一些Python编程中的经典小游戏&#xff0c;让您感受到Python的多功能性…

idea乱码的相关问题

idea控制台乱码&#xff08;即&#xff1a;tomacat等启动时的乱码&#xff09; 第一步&#xff1a; 控制台tomcat启动信息乱码解决&#xff08;红色字体&#xff09; 1 在本地 tomcat 的配置文件中找到 logging.properties 文件设置日志输出的编码为 UTF-8 追加的配置信息为…

【Android复习笔记】Handler机制(一)

从 Android 初学者常见的一个错误开始: 导致这个错误的代码通常长下面这样: new Thread(){@Overridepublic void run() {new Handler(); } }.

chatgpt赋能python:Python编程中常见的问题和解决方案

Python编程中常见的问题和解决方案 Python作为一门高级编程语言&#xff0c;广泛用于数据分析、人工智能、Web开发等领域&#xff0c;然而在实际应用中我们不可避免地会遇到许多问题。在本文中&#xff0c;我们将探讨一些常见的Python编程问题以及解决方案。 1. 编码问题 Py…

碰撞检测算法详述

算法的分类 目录 一、基于空间域的碰撞检测算法分类 1. 基于图像空间的碰撞算法 2.基于几何空间的碰撞检测算法 &#xff08;1&#xff09;基于空间剖分算法 &#xff08;2&#xff09;裁剪扫掠法 &#xff08;3&#xff09;基于距离场的算法 &#xff08;4&#xff09;…

ModaHub魔搭社区:向量数据库的工作原理

目录 1. 为什么需要向量数据库 1&#xff09;CPU 工作原理 2&#xff09;GPU 工作原理 3&#xff09;二者的差异 4&#xff09;总结 5&#xff09;大模型的工作原理 学习 推理 1. 为什么需要向量数据库 向量数据库这一概念随着黄仁勋的演讲火爆了之后&#xff0c;不少…

如何使用upupw搭建服务器,并映射外网访问

作为计算机行业从业人员&#xff0c;相信很多人都接触并使用过phpstudy等类似环境集成包&#xff0c;着对于upupw就比较好理解了。UPUPW绿色服务器平台是Windows下很有特色的一款免费服务器PHP套件&#xff0c;UPUPW PHP套件简化了PHP环境搭建步骤&#xff0c;一个压缩包解压到…