zoukankan      html  css  js  c++  java
  • 表的联结

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

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

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

    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

  • 相关阅读:
    PAT 甲级 1132 Cut Integer (20 分)
    AcWing 7.混合背包问题
    AcWing 9. 分组背包问题
    AcWing 5. 多重背包问题 II
    AcWing 3. 完全背包问题
    AcWing 4. 多重背包问题
    AcWing 2. 01背包问题
    AcWing 875. 快速幂
    AcWing 874. 筛法求欧拉函数
    AcWing 873. 欧拉函数
  • 原文地址:https://www.cnblogs.com/wangliyue/p/4185059.html
Copyright © 2011-2022 走看看