• SQL中Left Join 与Right Join 与 Inner Join 与 Full Join与交叉连接与自连接的区别


    首先看看Left Join 与Right Join 与 Inner Join 与 Full Join对表进行操作后得到的结果。

     


    插入数据得到的表:

    EMP表:

    SAL表:

      • 左连接
        [sql] view plain copy
         
        1. select  * from EMP Left join SAL on EMP.ENAME = SAL.ENAME;  

        左连接,表EMP是主表,因此查询结果是显示EMP(主表)的全部信息和SAL(附表)与EMP相关的信息。
      • 右连接
        [sql] view plain copy
         
        1. Select * from EMP Right join SAL on EMP.ENAME = SAL.ENAME;  

        右连接,表SAL是主表,因此查询结果显示SALT(主表)的全部信息和EMP(附表)与SAL想关的信息。
      • 内连接
        [sql] view plain copy
         
        1. SELECT * FROM EMP inner join SAL on EMP.ENAME = SAL.ENAME;  

        内连接,显示的是连个表相关的信息。
      • 全连接
        [sql] view plain copy
         
        1. SELECT * FROM EMP full join SAL on EMP.ENAME = SAL.ENAME;  

        全连接,显示两个表所有的信息。
      • 交叉连接:

        交叉连接将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积。

        不加条件返回两个表行数的乘积:

        首先准备了两个表 (Student 和 Course),其中 Student 表中的 C_S_Id 字段为外键列,关联的是 Course 表的 C_Id 主键列。

      • select * from Student s
        cross join Course c 
        1 select * from Student s
        2 cross join Course c 

        加上条件返回满足条件表达式的两个表的行:

        1 select * from Student s
        2 cross join Course c 
        3 where s.C_S_Id=c.C_Id

        PS:cross join后加条件只能用where,不能用on,这一点跟后面的自连接一样。

        自连接:自连接,连接的两个表都是同一个表,即自己连接自己。

        复制代码
        1 -- 查询出男生身高比女生身高矮的学生信息
        2 select s1.S_Name,s1.S_Sex,s1.S_Height,s2.S_Name,s2.S_Sex,s2.S_Height  
        3 from Student s1,
        4 Student s2 
        5 where s1.S_BirthDate=s2.S_BirthDate
        6 and s1.S_Height<s2.S_Height
        7 and s1.S_Sex='男' 
        8 and s2.S_Sex='女'
        复制代码

        1 --查询出学生身高一样但是学号不一样的学生信息
        2 select * from Student s1,Student s2
        3 where s1.S_Height=s2.S_Height
        4 and s1.S_StuNo<>s2.S_StuNo

        由于表的数据的原因,所以自连接的示例可能不太容易理解。可以看下面这个示例,根据表名查询出表的主外键约束名,示例如下:

        1 select a.Name as 表名,b.Xtype as 键类型,b.Name as 键名
        2 from sysobjects a,sysobjects b
        3 where a.ID=b.parent_obj and a.name='Student'
        4 and b.Xtype in('F','PK')

        内连接如果没有指定连接条件的话,和笛卡尔积的交叉连接结果一样,但是不同于笛卡尔积的地方是,没有笛卡尔积那么复杂要先生成行数乘积的数据表,内连接的效率要高于笛卡尔积的交叉连接。

        最后说明一下,交叉连接如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后再根据WHERE条件从中选择。 

        因此,如果两个表数据量太大,将会非常非常慢,不建议使用。

  • 相关阅读:
    GitHub超详细图文攻略
    HTML5本地存储——IndexedDB二:索引
    HTML5 indexedDb 数据库
    js 对象 浅拷贝 和 深拷贝
    《黑客大曝光》实践部分——sql注入(7/8)
    Linux内核设计第五周——扒开系统调用三层皮(下)
    读书笔记——《黑客大曝光》(6/8)
    《linux内核设计与实现》读书笔记第五章——系统调用
    Linux内核设计第四周——扒开系统调用三层皮
    《linux内核设计与实现》读书笔记第一、二章
  • 原文地址:https://www.cnblogs.com/hushzhang/p/5646398.html
Copyright © 2020-2023  润新知