• 多表查询


    目录

    • 笛卡尔积
    • 内连接
    • 外连接
      • 左外连接
      • 右外连接
      • 全外连接
    • 自然连接

      

    1. 笛卡尔积

    ​返回两表记录“相乘”的结果。若A表有m条记录,B表有n条记录,笛卡尔积会产生m*n条记录。其中,A表每一条记录,都对应一遍B表中的n条记录。
    笛卡尔积返回的结果时常包含无意义的记录,所以用处并不太大,但这也不能说明其完全无意义。
    试想场景:A表存放着一个班的学员信息,B表存放着学校所开设课程的信息。两者的笛卡尔积则具有该班学生选择课程结果的所有可能性。

    :当两表过大时,应当尽可能避免使用笛卡尔积。

    select * from A,B;

      

    2. 内连接

    ​通过两表相同的字段连接,选取两表共有的数据。
    ​如A表存放学员信息,并包含学号这一字段;B表存放成绩,并也包含学号这一字段。通过内连接可查询所有学生及其对应的课程成绩。

    mysql写法:

    写法一:
    select * from A inner join B on A.no=B.no;
    
    写法二:
    select * from A,B where A.no=B.no;
    
    

    1. 虽然写法一与写法二起到相同的作用,但前者的写法较为正规,偏向于内连接本身的意义。后者的写法偏向于在笛卡尔积的基础上,通过条件筛选结果。至于两者底层的实现,有待进一步钻研。

    2. 不加on,或不使用where的内连接退化成笛卡尔积,失去意义。

      

    3. 左外连接

    在内连接的基础上,加上左边有的数据。即,左边的表包含其全部的记录,右边的表若无与之对应的记录,则为null。

    写法如下:

    select * from A left join B on A.no=B.no

      

    4. 右外连接

    在内连接的基础上,加上右边有的数据。即,右边的表包含其全部的记录,左边的表若无与之对应的记录,则为null。

    写法如下:

    select * from A right join B on A.no=B.no

      

    5. 全外连接

    只要左表与右表其中一个表存在记录,则返回关联记录。相当于综合了左外连接与右外连接。

    写法如下:

    select * from A full join B on A.no=B.no

    1. mysql不能使用全外连接,但可以用 union 模拟。

      select * from A left join B on A.no=B.no
      UNION
      select * from A right join B on A.no = B.no;
      
    2. 全外连接是有条件的连接,不会产生错误记录;笛卡尔连接是无差别的连接,会产生错误记录

    3. 左外连接=左表全部记录+相关联结果
      右外连接=右表全部记录+相关联结果
      全外连接=左表全部记录+右表全部记录+相关联结果=左外连接+右外连接-相关联结果(即去重复)

    6. 自然连接

    自然连接是一种特殊的等值连接,其要求两个关系进行比较的分量必须是相同的属性组,并且在结果集中将重复属性列去掉。

  • 相关阅读:
    Optional的使用
    Spring Boot 传送门
    MP(MyBatis-Plus)实现乐观锁更新功能
    实现数据逻辑删除的一种方案
    凹凸技术揭秘 · 基础服务体系 · 构筑服务端技术中枢
    凹凸技术揭秘 · 夸克设计资产 · 打造全矩阵优质物料
    凹凸技术揭秘·羚珑页面可视化·成长蜕变之路
    90%的开发都没搞懂的CI和CD!
    Devops与敏捷二者能否结合?
    优质单元测试的十大标准,你有遵循吗?
  • 原文地址:https://www.cnblogs.com/juzhuxiaozhu/p/13375782.html
Copyright © 2020-2023  润新知