【MySQL】:深入解析多表查询(上)
作者:mmseoamin日期:2024-04-27
【MySQL】:深入解析多表查询(上),个人头像,第1张
🎥 屿小夏 : 个人主页
🔥个人专栏 : MySQL从入门到进阶
🌄 莫道桑榆晚,为霞尚满天!

文章目录

  • 📑前言
  • 一. 多表关系
    • 1.1 一对多
    • 1.2 多对多
    • 1.3 一对一
    • 二. 多表查询概述
      • 2.1 概述
      • 2.2 分类
      • 三. 内外连接
        • 3.1 内连接
        • 3.2 外连接
        • 🌤️全篇总结

          📑前言

          数据库查询中,多表查询是一项重要的技能,尤其在处理复杂的业务逻辑和关联数据时尤为重要。多表查询涉及到不同表之间的关系,如一对多、多对多和一对一等,以及内连接和外连接等查询方式。本篇博客将深入探讨多表查询的相关概念、语法和实际案例,帮助读者掌握如何灵活运用多表查询来满足各种业务需求。

          一. 多表关系

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

          基本上分为三种:

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

            1.1 一对多

            案例: 部门 与 员工的关系

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

            实现: 在多的一方建立外键,指向一的一方的主键

            【MySQL】:深入解析多表查询(上),image-20231220143255246,第2张

            1.2 多对多

            案例: 学生 与 课程的关系

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

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

            【MySQL】:深入解析多表查询(上),image-20231220143321970,第3张

            1.3 一对一

            案例: 用户 与 用户详情的关系

            关系: 一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率

            实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

            【MySQL】:深入解析多表查询(上),image-20231220143355695,第4张

            二. 多表查询概述

            2.1 概述

            多表查询就是指从多张表中查询数据。

            原来查询单表数据,执行的SQL形式为:select * from emp;

            那么我们要执行多表查询,就只需要使用逗号分隔多张表即可,如: select * from emp , dept; 具体的执行结果如下:

            【MySQL】:深入解析多表查询(上),image-20231220143929761,第5张

            此时,我们看到查询结果中包含了大量的结果集,总共102条记录,而这其实就是员工表emp所有的记录(17) 与

            部门表dept所有记录(6) 的所有组合情况,这种现象称之为笛卡尔积。接下来,就来简单介绍下笛卡尔积。

            笛卡尔积: 笛卡尔乘积是指在数学中,两个集合A集合 和 B集合的所有组合情况。

            【MySQL】:深入解析多表查询(上),image-20231220144034636,第6张

            而在多表查询中,我们是需要消除无效的笛卡尔积的,只保留两张表关联部分的数据。

            【MySQL】:深入解析多表查询(上),image-20231220144046683,第7张

            【MySQL】:深入解析多表查询(上),image-20231220144057315,第8张

            在SQL语句中,如何来去除无效的笛卡尔积呢? 我们可以给多表查询加上连接查询的条件即可。

            select * from emp , dept where emp.dept_id = dept.id;
            

            2.2 分类

            连接查询

            • 内连接:相当于查询A、B交集部分数据
            • 外连接:
            • 左外连接:查询左表所有数据,以及两张表交集部分数据
            • 右外连接:查询右表所有数据,以及两张表交集部分数据
            • 自连接:当前表与自身的连接查询,自连接必须使用表别名

              子查询

              【MySQL】:深入解析多表查询(上),image-20231220144217548,第9张

              三. 内外连接

              3.1 内连接

              【MySQL】:深入解析多表查询(上),image-20231220144303092,第10张

              内连接查询的是两张表交集部分的数据。(也就是绿色部分的数据)

              内连接的语法分为两种: 隐式内连接、显式内连接。先来学习一下具体的语法结构。

              隐式内连接

              SELECT 字段列表 FROM 表1 , 表2 WHERE 条件 ... ;
              

              显式内连接

              SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ... ;
              

              案例:

              A. 查询每一个员工的姓名 , 及关联的部门的名称 (隐式内连接实现)

              表结构: emp , dept

              连接条件: emp.dept_id = dept.id

              select emp.name , dept.name from emp , dept where emp.dept_id = dept.id ;
              -- 为每一张表起别名,简化SQL编写
              select e.name,d.name from emp e , dept d where e.dept_id = d.id;
              

              B. 查询每一个员工的姓名 , 及关联的部门的名称 (显式内连接实现) — INNER JOIN … ON …

              表结构: emp , dept

              连接条件: emp.dept_id = dept.id

              select e.name, d.name from emp e inner join dept d on e.dept_id = d.id;
              -- 为每一张表起别名,简化SQL编写
              select e.name, d.name from emp e join dept d on e.dept_id = d.id;
              

              表的别名:

              ①. tablea as 别名1 , tableb as 别名2 ;

              ②. tablea 别名1 , tableb 别名2

              注意事项:

              一旦为表起了别名,就不能再使用表名来指定对应的字段了,此时只能够使用别名来指定字段。

              3.2 外连接

              【MySQL】:深入解析多表查询(上),image-20231220144551911,第11张

              外连接分为两种,分别是:左外连接 和 右外连接。具体的语法结构为:

              左外连接

              SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ... ;
              

              左外连接相当于查询表1(左表)的所有数据,当然也包含表1和表2交集部分的数据。

              右外连接

              SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ... ;
              

              右外连接相当于查询表2(右表)的所有数据,当然也包含表1和表2交集部分的数据。

              案例:

              A. 查询emp表的所有数据, 和对应的部门信息

              由于需求中提到,要查询emp的所有数据,所以是不能内连接查询的,需要考虑使用外连接查询。

              表结构: emp, dept

              连接条件: emp.dept_id = dept.id

              select e.*, d.name from emp e left outer join dept d on e.dept_id = d.id;
              select e.*, d.name from emp e left join dept d on e.dept_id = d.id;
              

              B. 查询dept表的所有数据, 和对应的员工信息(右外连接)

              由于需求中提到,要查询dept表的所有数据,所以是不能内连接查询的,需要考虑使用外连接查询。

              表结构: emp, dept

              连接条件: emp.dept_id = dept.id

              select d.*, e.* from emp e right outer join dept d on e.dept_id = d.id;
              select d.*, e.* from dept d left outer join emp e on e.dept_id = d.id;
              

              注意事项:

              左外连接和右外连接是可以相互替换的,只需要调整在连接查询时SQL中,表结构的先后顺序就可以了。而我们在日常开发使用时,更偏向于左外连接。

              🌤️全篇总结

              本文详细介绍了多表查询中的一对多、多对多和一对一关系,以及内连接和外连接的概念和语法结构,并通过具体案例演示了多表查询的实际应用。通过学习本文,读者可以掌握如何使用多表查询来获取关联数据,并了解如何消除无效的笛卡尔积,从而提高数据库查询的效率和准确性。

              【MySQL】:深入解析多表查询(上),image-20231220160021552,第12张