第四章 SQL查询 之连接{自然连接,内连接,外连接(左外连接,右外连接,完全连接)}

4.4 连接

  • 自然连接

    自然连接实际指定了搜寻条件。这里包括两部分的内容:首先,自然连接列必须同名,另外,所有同名列都将作为搜索条件。

    • 自然连接所使用的关键字为natural join 。其连接原则为,两个数据源的共有列,并且具有相同列值。

    • 结合与笛卡尔积的区别进行理解

      自然连接与笛卡尔积的区别在于,笛卡尔积无论何时,都将获得两个数据表中所有记录的两两结合。而当两个数据表中存在同名列时,Oracle将同名列作为搜寻条件。相当于强制添加条件——where t1.column = t2.column。但是,当两个表不存在同名列时,Oracle不会添加任何搜寻条件,其效果相当于笛卡尔积。

      • teachers 表

      • 在这里插入图片描述

      • student 表

      • 在这里插入图片描述

      • 自然连接teachers 和 student 表

        • select s.name,s.class,teacher_name,t.teacher_course from student s natural join teacher_couse t;

          • 在这里插入图片描述

          • 其中

            • s.name
            • s.class
            • t.teacher_course
            • teacher_name:不可以使用限定词,否则报错
          • 等同于

            • select s.name,s.class,t.teacher_name,t.teacher_course from student s,teachers t where s.teacher_name=t.teacher_name;

              -在这里插入图片描述

  • 内连接

    自然连接使用两个表之间的公共列作为搜寻条件;而且要求公共列的值必须相等。这带来了极大的限制,因此,自然连接并不常用。而内连接突破了这两种约束。内连接可以自行指定连接列和连接条件。内连接运算的关键字为inner join.

      • teachers 表

      在这里插入图片描述

      • student 表

      在这里插入图片描述

      • 内连接teachers表和student表

        select s.id,s.name,s.class,s.teacher_name ,t.teacher_course from student s inner join teachers t on s.teacher_name=t.teacher_name;

        内连接的inner join 中的inner 关键子可以省略
        select s.id,s.name,s.class,s.teacher_name ,t.teacher_course from student s join teachers t on s.teacher_name=t.teacher_name;

        • 在这里插入图片描述

        • 对于内连接,利用where 条件也可以实现相同的作用,但是:

          • 在多于两表关联查询时

            含有多个数据源时,例:A,B,C。此时使用where子句方式,from 子句中含有数据源:A,B,C;Oracle 在进行笛卡尔积运算时会进行优化,理想的笛卡尔积运算顺序为:AxBxC ,但是,使用where子句方式时,运算顺序可能会发生改变,得出不正确的结果。此时应使用内连接:
            select * from A join B on …join c on …;

  • 外连接

    内连接所指定的两个数据源,处于平等的地位。而外连接不同,外连接总是以一个数据源为基础,将另外一个数据源与之进行进行条件匹配。即使条件不匹配,基础数据源中的数据总是出现在结果集中。那么,依据哪个数据源作为i基础数据源,便出现了两种外连接的方式——左(外)连接和右(外)连接。因为内连接没有左右之分,所以习惯上,将左外连接和右外连接简称为左连接和右连接。

    • 左连接:left join

      左连接,以lfet join 左侧的表作为基础表来实现关联

        • class_one表

        • 在这里插入图片描述

        • teachers表

        • 在这里插入图片描述

        • 使用左连接,获取class_one表中所有学生对应的老师信息

          • select c.*,t.teacher_course from class_one c left join teachers t on c.teacher_name=t.teacher_name;
          • 在这里插入图片描述
    • 右连接:right join

      与左连接相反,右连接是以运算符右侧的表作为基础表来实现关联。

        • class_one表
          -在这里插入图片描述

        • teachers表

        • 在这里插入图片描述

        • 使用右连接,获取teachers表中所有老师对应的学生信息

          • select c.id,c.name,c.class,t.teacher_name,t.teacher_course from class_one c right join teachers t on c.teacher_name=t.teacher_name;
          • 在这里插入图片描述
    • 完全连接 full join

      完全连接实际是一个左连接和右连接的组合。也就是说,如果两个数据源使用了完全连接,那么将首先进行一个左连接,然后进行一次右连接,最后再删除其中的重复记录,即得到完全连接。完全连接,应该使用full join 关键字,并使用on关键字指定连接条件。

        • class_one表
          -在这里插入图片描述

        • teachers表
          -在这里插入图片描述

        • 使用full join获取class_one表 和 teachers表的完全连接。

          • select * from class_one c full join teachers t on c.teacher_name = t.teacher_name;

          • 在这里插入图片描述

          • 注意:full join 的执行结果与表的顺序无关,无论表在 full join 的前边还是右边,结果都一样!

            • select * from teachers t full join class_one c on c.teacher_name = t.teacher_name;
            • 在这里插入图片描述
  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大脑经常闹风暴@小猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值