• 表的联结


    通过表的集合运算,就是以行方向为单位的操作。通过集合运算会导致最终结果表记录行数的增减。但是列数是不会改变的,

    作为表的集合运算的的前提就是 前后两表的列数必须相同,且数据类型对应一致。

    而表的联结运算 则与 表的集合运算 相对。就是将其他表中的列添加过来,记性“添加列”的运算。

    SQL的联结根据其用途可以分为很多种类。最常用的是内联结 和 外联结。

    1.内联结   ——  inner  join

    联结一般都涉及两张或两张以上的表 。区分一下,成为 A表 和 B表 。

    从A表中选取适当的列,在B表中选取适当的列,然后联结起来形成最终结果表。

    select   a.studentName   ,  a.studentSex   ,  b.className  , b.schoolName        -- a表中选取 学生名字 和 学生性别两列  b表中选取 班级名称 和 学校名称两列 
    from  tb_student  a  inner  join   tb_class  b                                   -- from子句中的两表 通过内联结 联结在一起
    on  a.classId  =  b.classId;                                                     --  联结条件是    a表的classId 等于 b表的classId   (两表通过外键关联)
                                                                                                       (此处 a表是从表 外键是classId 关联的是b表的classId  b表是主表)

    内联结注意点:

    注意点1: from子句 中涉及多张表

    注意点2: on子句指定联结条件 不可缺少。必须写在from子句和where子句(如果有的话)之间。

    注意点3: select子句中列需要按照 <列的别名>.<列名> 的格式进行书写。

    内联结可以结合 where子句 ,group  by子句等进行使用:

    这时候,可以理解成 通过内联结 生成了一张结果表 ,然后在这张结果表 上再使用where子句 进行筛选,group by子句进行分组,

    having 子句 进行聚合之后的筛选 ,order by 子句进行排序,最终形成最后的结果表。

    想象一种情况 :

    tb_student 表的 有一行学生记录 的classId的值 在tb_class表的classId列中并不存在这个值,那么如果使用内联结查询,这行学生的记录会出现在最终的结果表吗?

    如果不出现 ,为什么?如果出现,那么这个学生的 className,schoolName列 有应该是什么值?

    答案是:使用内联结,该行学生记录 不出现在最终的结果表中。

     通过内联结,在on子句指定的 外键关联条件下 ,同时存在于 主表 和 从表的记录 才会出现在最终结果表中 。

    2. 外联结  ——  outer join

    承接内联结中提出的问题: 虽然那行学生的记录的classId值 在 tb_class表中并不存在 ,但是我们还是希望 这行学生的记录 出现在最终的结果表中 。

    这时就要需要使用 :  外联结。

    select  a.studentName  ,  a.studentSex  ,  b.className  ,  b.schoolName  
    from   tb_student   a   left  outer  join   tb_class  b                             --  使用左外联结  ,最终的结果表 包含 tb_student表的所有记录行。   
    on  a.classId  =  b.classId ;

    外联结 又分为 左外联结 和 右外联结。

    左外联结 :  最终的结果表中 ,必须包含 左表的全部记录行。

    右外联结 :  最终的结果表中 ,必须包含 右表的全部记录行。         可见 调换两表的位置 ,左外联结 和 右外联结 可以相互转化。

    最终的结果表 中那行学生记录的 className 列 和 schoolName 列 就显示为 null.

    3.交叉联结   ——  cross  join

  • 相关阅读:
    Microsoft Word 段前距设置和页眉设置
    JavaScript 跨域小总结
    JavaScript 闭包系列二(匿名函数及函数的闭包)

    JavaScript 变量作用域
    JavaScript 闭包系列一
    JavaScript 继承
    JavaScript 对象的创建
    MySQL(2): 窗口函数备份与恢复性能优化权限管理
    组建LAN
  • 原文地址:https://www.cnblogs.com/wangliyue/p/4185059.html
Copyright © 2020-2023  润新知