美文网首页程序员
SQL——连接表达式

SQL——连接表达式

作者: 薛定谔与猫的故事 | 来源:发表于2018-04-04 09:17 被阅读0次

    1、连接条件

    前面中提到了自然连接(natural join),且使用了join……using子句,join-using子句是一种自然连接的形式,只需要在指定的属性上的取值匹配,using里面的参数必须是被连接的两个表的共有属性。

    区别于using条件,on条件允许在参与连接的关系上设置通用的谓词。该谓词的写法于where子句中谓词写法相同,出现在连接表达式的后面。例如

    SELECT *
    FROM student JOIN takes ON student.id = takes.id;
    

    上面的连接表达式几乎与 student natural join takes一样,也与下面的书写是等价的,

    select * 
    from student,takes
    where student.id = takes.id;
    

    与natural join和join -using不同的是,join-on使用的是通用谓词,为了显示这种区别,我们对第一个做个改动:

    SELECT *
    FROM student JOIN takes 
        ON student.id = takes.id AND dept_name='computer science';
    

    很明显,join-on的谓词的域是包含natural join和join-using的域(取值空间)。

    2、外连接

    假设我们要显示一个所有学生的列表,以及他们选修的课程(尽管没有选修),我们可能会写:

    select * 
    from student natural join takes;
    

    但这样是达不到想要的效果的。因为对于没有选修课程的同学是不包括在结果集当中,而这里要求的是所有学生。如下图:


    takes表 student表 结果表
    那么我们应该怎么做,这个时候外连接就起到了作用。外连接会在结果在创建包含空值元组的方式,保留那些在连接中丢失的元组,外连接有三种形式:
    1)左外连接(left outer join) 只保留出现在左外连接运算之前的关系中的元组
    2)右外连接(right outer join) 只保留出现在右外连接运算之后的关系中的元组
    3)全外连接(full outer join) 保留出现在两个关系中的元组
    先比较之前使用的连接,不保留未匹配元组的连接运算称之为内连接运算。三种外连接。
    左外连接:
    SELECT * 
    FROM student NATURAL LEFT OUTER JOIN  takes;
    

    右外连接:

    SELECT *
     FROM student NATURAL RIGHT OUTER JOIN  takes;
    
    左外连接 右外连接

    有人可能会问,会什么右外连接结果跟内连接是一样的。这里的原因能是因为右外连接只保留之后的关系中的元组,也就是所谓在takes表中,被选修的课程总有对应的学生,就不会出现学生为空的情况。

    全外连接是左外连接与右外连接的组合。在内连接结果结果结算出来之后,左侧关系中不匹配右侧关系任何元组被添上空值并加到结果中。类似的,右侧关系中不匹配左侧关系任何元组也被添上空值并加到结果中。

    3、总结

    连接类型:外连接(<left,right,full>outer join)、内连接(inner join)
    连接条件:natural、on<predicate>、using(A1,A2)

    相关文章

      网友评论

        本文标题:SQL——连接表达式

        本文链接:https://www.haomeiwen.com/subject/yswhhftx.html