zoukankan      html  css  js  c++  java
  • sql中的几种连接类型

    一、连接类型简介

    在sql中单表查询的几率相对来说比较少,随着数据库的日益复杂,多表关联的情况越来越多,在多表关联的情况下存在多种关联的类型,

    1、自关联(join或inner join)

    2、左外关联(left join或left outer join)

    3、右外关联(right join或right outer join)

    4、全关联(full join)

    二、各种关联的使用

    为了更形象的说明这几种连接类型的使用场景及用法,下面以学生表(student)和学生选课表(course)表来演示,其表结构及数据如下图,

    上面是两张表的结构及数据。

    1、自关联

    有时需要得到完整的数据,我们需要关联两个或两个以上的表,这时候便用到了自关联,其中自关联可以有下面两种写法,其一,

    select s.s_id,s_name,c.c_name from student s,course c where s.s_id=c.s_id

    运行上面的语句得到的结果如下,

    其二的sql语句写法如下,

    select s.s_id,s_name,c.c_name from student s join course c on s.s_id=c.s_id;

    运行上面的语句得到的结果如下,

    从上面的结果,可以看到两种写法的结果是一样的,同时也可以得出这样一个结论:自关联过滤出的数据必须满足在左表和右表都符合条件,这里的条件只的s.s_id=c.s_id,也就是说s_id必须同时存在于两个表中才会出现在结果中。

    那么针对上面的两种写法哪种更好,这里认为哪种最好,适合的就是最好的。

    对于自关联来说,有个重要的问题需要注意那就是笛卡尔积,自关联如果忘记写关联条件就会出现笛卡尔积的情况 ,关于笛卡尔积的情况,可以自查资料,这里以第二种sql写法演示笛卡儿积的出现,

    select s.s_id,s_name,c.c_name from student s   join course c ;

    结果如下,

    写法即未加过滤条件(未加on或where条件),这样出来的结果为两个表中的数据行数的乘积,即4X5=20行,这就是笛卡儿积。

    2、左外关联/右外关联

    左外关联和右外关联其实可以看作同一种写法,在使用上可以相互转化。左外关联即以左表为基本表,会展示所有的左表中的数据,如果在右表中没有匹配的数据便为null,右外关联刚好相反,

    左外关联,

    select s.s_id,s_name,c.c_name from student s left  join course c 
    on s.s_id=c.s_id;

    运行结果如下,

    可以看到结果数据集只有4行即为左表中的数据,但可以看到c_name列为null,这是因为在右表中没有匹配的s_id为1004的记录,所以此列为null。

    右关联

    select s.s_id,s_name,c.c_name,c.s_id as c_s_id from student s right  join course c 
    on s.s_id=c.s_id;

    运行的结果如下,

    可以看出结果集为5行数据,即为右表中的数据,以右表为基本表。结果中的为null的数据列是因为在左表中没有匹配的记录,所以为null。

    3、全关联

    全关联是只要其中某个表存在匹配的记录,便会返回行。

    这里是mysql的环境,暂无法给出实例。

    有不当之处请指正,感谢!

    由于这里的环境是mysql,mysql不支持full join的方式,这里暂不给出实例。

  • 相关阅读:
    【LeetCode】链表 linked list(共34题)
    Construct Binary Tree from Preorder and Inorder Traversal<leetcode>
    Triangle <leetcode>
    Jump Game <leetcode>
    C++学习笔记 <const限定词>
    Search for a Range <leetcode>
    Subsets <leetcode>
    各种排序算法总结
    Unique Paths II <leetcode>
    C++学习笔记 <hash_map> <散列映射>
  • 原文地址:https://www.cnblogs.com/teach/p/9790315.html
Copyright © 2011-2022 走看看