数据库之多表联合查询

数据库之多表联合查询一、知识点名称多表联合查询(一对多数据显示、多对多数据展示)二、知识点业务场景一对多关联:学生和成绩的关系用户与订单的关系企业与员工的关系用户与银行卡的关系多对多关联:学生和选课的关系订单和商品的关系用…

大家好,又见面了,我是你们的朋友全栈君。

一、知识点名称

多表联合查询(一对多数据显示、多对多数据展示)

二、知识点业务场景

一对多关联:

           学生和成绩的关系

           用户与订单的关系

           企业与员工的关系

           用户与银行卡的关系

多对多关联:

           学生和选课的关系

           订单和商品的关系

           用户和角色的关系

           角色和权限的关系

三、知识点业务(原理)

a、多表联合查询的原理

        1、先确定数据要用到哪些表。

        2、将多个表先通过笛卡尔积变成一个表。

        3、然后去除不符合逻辑的数据。(根据两个表的关系去掉)

        4、最后当做是一个虚拟表一样来加上条件即可。

!笛卡尔积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X * Y,第一个对象是X的成员

而第二个对象是Y的所有可能有序对的其中一个成员。例如下面:

 

数据库之多表联合查询

数据库之多表联合查询

b、多表联合查询的不同方式

1、交叉连接

           交叉连接即是笛卡尔积,是指两个关系中所有元组的任意组合。一般情况下,交叉查询是没有实际意义的。

   例如:如果希望得到学生表和选课表两个关系模式的乘积,查询语句为:

   SELECT * FROM 学生表 CROSS JOIN 选课表;

2、内连接

           内连接是一种最常用的连接类型。内连接查询实际上是一种任意条件的查询。使用内连接时,如果两个表的相关字段满足

连接条件,就从这两个表中提取数据并组合成新的记录,也就是在内连接查询中,只有满足条件的元组才能出现在结果关系中。

例如:要查询每个已经选课的学生的情况,查询语句为:

SELECT * FROM 学生表 INNER JOIN 选课表 ON 学生表.学号 = 选课表.学号;

内连接分类:

         1、等值连接:

                     在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的

          重复列。

         2、不等连接:

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

         、!<和<>。

         3、自然连接:

                     在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出的查询结果集合中所包括的列,

         并删除连接表中的重复列。

3、自连接

           如果在一个连接查询中,涉及到的两个表都是同一个表,这种查询就称为自连接查询。同一张表在FROM字句中对多次

出现,为了区别该表的每一次出现,需要为表定义一个别名。自连接是一种特殊的内连接,它是指相互连接的表在物理上为同

一张表,但可以在逻辑上分为两张表。

例如:要求检索出学号为20210的学生的同班同学的信息,查询语句为:

SELECT 学生表.* FROM 学生表 JOIN 学生表 AS 学生表1 ON 学生表.班级 = 学生表1.班级 WHERE 学生表1.学号 = ‘20210’;

4、外连接

          外连接的查询结果都是满足连接条件的元组。但有时候我们也希望输出那些不满足连接条件的元组信息。比如,我们想

知道每个学生的选课情况,包括已经选课的学生(这部分学生的学号在学生表中有,但在选课表中没有,不满足连接条件),

这时就需要使用外连接。外连接是只限制一张表中的数据必须满足连接条件,而另一张表中的数据可以不满足连接条件的连接

方式。

外连接的三种方式:

          1、左外连接(LEFT OUTER JOIN)

               如果在连接查询中,连接管子左端的表中所有的元组都列出来,并且能在右端的表中找到匹配的元组,那么连接成功。

          如果在右端的表中,没能找到匹配的元组,那么对应的元组是空值(NULL)。这时,查询语句使用关键字LEFT OUTER

          JOIN,也就是说,左外连接的含义是限制连接关键字右端的表中的数据必须满足连接条件,而不关左端的表中的互数据

          是否满足连接条件,均输出左端表中的内容。

例如:要查询所有学生的选课情况,包括已经选课的和还没有选课的学生,查询语句为:

SELECT 学生表.学号,姓名,班级,课程号,成绩 FROM  学生表 LEFT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号;(左外连接查询中左端表中的所有元组的信息都得到了保留)

         2、右外连接(RIGHT OUTER JOIN)

               右外连接与左外连接类似,只是右端表中的所有元组都列出,限制左端表的数据必须满足连接条件,而不管右端表中的

         数据是否满足连接条件,均输出表中的内容。

例如:同上例内容,查询语句为:

SELECT 学生表.学号,姓名,班级,课程号,成绩 FROM 学生表 RIGHT OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号;(左外连接查询中右端表中的所有元组的信息都得到保留)

         3、全外连接(FULL OUTER JOIN)

               全外连接查询的特点是左、右两端表中的元组都输出,如果没能找到匹配的元组,就使用NULL来代替。

例如:同左外连接例子内容,查询语句为:

SELECT 学生表.学号,姓名,班级,课程号,成绩 FROM 学生表 FULL OUTER JOIN 选课表 ON 学生表.学号 = 选课表.学号;(全外连接查询中所有表中的元组信息都得到了保留)

四、功能实现步骤讲解

创建一张课程表

数据库之多表联合查询

创建一张老师表

数据库之多表联合查询

创建一张学生表

数据库之多表联合查询

创建学生成绩中间表

数据库之多表联合查询

1、一对多关联

将两个业务表关联查询,根据不同的需求,使用不同的连接方式,老师和课程表是一对多的关系。

             1、内连接

             两个表关联的时候,需要通过外键相等将两个表连接起来,如果有其他的条件,在where后面添加and + 条件即可。

             所有有关联的数据都会查询出来,没有关联的数据不会显示。

             SQL语句如下:

数据库之多表联合查询

           查询出来的结果:

数据库之多表联合查询

          2、左连接

          两个表左关联的时候,以左表为主,把右表中的相关的记录添加到左表,形成新的表数据,如果有其他条件,可在后面

          添加where语句。左表的数据都会查询出来,如果右表有对应的关联数据,则显示,如果没有对应的数据,则显示为null。

          SQL语句如下:

 

数据库之多表联合查询

          查询出来的结果:

数据库之多表联合查询

          3、右连接

         两个表右关联的时候,以右表为主,把左表中的相关的记录添加到左表,形成新的表数据。 如果有其他条件,可在后

         面添加where语句。右表的数据都会查询出来,如果左表有对应的关联数据,则显示,如果没有对应的数据,则显示

        为null。

       SQL语句如下:

     数据库之多表联合查询

      查询出来的结果

数据库之多表联合查询

二、多对多关联

将两个业务表和一个中间表,这三个表进行关丽娜查询,根据不同的需求,使用不同的连接方式。学生和成绩表是多对多的关系。

           1、内连接

           两个表多对多关联的时候,需要通过关联中间表,使中间表的两个外键分别与两个单表的主键相等,将两个表连接起

           来,如果有其他的条件,在where后面添加and+条件 即可。所有有关联的数据都会查询出来,没有关联的数据不会显示。

           SQL语句如下:

数据库之多表联合查询

           查询结果如下:

数据库之多表联合查询

          2、左连接

          三个表左关联的时候,以左表为主,把右表中的相关的记录添加到左表,形成新的表数据,再以新的表数据为主,把

          第三个表中的相关的记录添加进来,形成最终的表数据,如果有其他条件,可在后面添加where语句。左表的数据都

         会查询出来,如果右表有对应的关联数据,则显示,如果没有对应的数据,则显示为null,新形成的表和第三张表的

         关联同理。

         SQL语句如下:

数据库之多表联合查询

         查询出来的结果如下:

数据库之多表联合查询

         3、右连接

         三个表右关联的时候,以右表为主,把左表中的相关的记录添加到右表,形成新的表数据,再以第三个表为主,把新的

         表中的相关的记录添加进来,形成最终的表数据,如果有其他条件,可在后面添加where语句。右表的数据都会查询出

         来,如果左表有对应的关联数据,则显示,如果没有对应的数据,则显示为null,新形成的表和第三张表的关联同理。

         SQL语句如下:

数据库之多表联合查询

         查询结果如下:

数据库之多表联合查询

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145923.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月13日 下午5:40
下一篇 2022年5月13日 下午5:40


相关推荐

  • 让自己的网站或博客被百度收录的小技巧

    让自己的网站或博客被百度收录的小技巧

    2021年10月29日
    45
  • DDoS 攻击防御方法

    DDoS 攻击防御方法网络层 DDoS 防御限制单 IP 请求频率 网络架构上做好优化 采用负载均衡分流 防火墙等安全设备上设置禁止 ICMP 包等 通过 DDoS 硬件防火墙的数据包规则过滤 数据流指纹检测过滤 及数据包内容定制过滤等技术对异常流量进行清洗过滤 采用 ISP 近源清洗 使用电信运营商提供的近源清洗和流量压制 避免全站服务对所有用户彻底无法访问 这是对超过自身带宽储备和自身 DDoS 防御能力之外超大流量的补充性缓解措施 应用层 DDoS 防御优化操作系统的 TCP IP 栈 应用服务器严格限制单

    2026年3月18日
    2
  • leetcode归并排序_什么是区间

    leetcode归并排序_什么是区间以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例 1:输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入:intervals = [[1,4],[4,5

    2022年8月9日
    5
  • java数组和链表的区别_java中链表和数组的区别?

    java数组和链表的区别_java中链表和数组的区别?综述 数组是线性结构 可以直接索引 即要去第 i 个元素 a i 即可 链表也是线性结构 要取第 i 个元素 只需用指针往后遍历 i 次就可 貌似链表比数组还要麻烦些 而且效率低些 想到这些相同处中的一些细微的不同处 于是他们的真正不同处渐渐显现了 链表的效率为何比数组低些 先从两者的初始化开始 数组无需初始化 因为数组的元素在内存的栈区 系统自动申请空间 而链表的结点元素在内存的堆区 每个元素须手动申请空间

    2026年3月17日
    2
  • 周末web前端练习

    在CSS样式定义中,以下哪种RGB颜色值是Web安全色?A]#111111B]#222222C]#333333D]#444444答案:http://hovertree.com/tiku

    2021年12月22日
    50
  • Visual Studio 2010 and .NET Framework 4 Release Candidate发布

    Visual Studio 2010 and .NET Framework 4 Release Candidate发布

    2021年8月5日
    67

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号