zoukankan      html  css  js  c++  java
  • SqlServer之连接

    在sql server中,我们经常能用到连接,今天总结一下连接的基础知识。
    连接的分类:

    • 交叉连接CROSS JOIN
    • 内连接INNER JOIN
    • 外连接{左外连接LEFT [OUTER] JOIN ;右外连接RIGHT [OUTER] JOIN;全外连接full [outer] join}
    • 自连接

    以下通过例子来了解各个连接的异同点:

    有两张表Teacher表和Course表:


    交叉连接:

    1.如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积;

    select * from Course cross join Teacher

    结果为:


    由此结果可知,它的结果与 SELECT * FROM Course,Teacher 的结果相同。

    2.如果有WHERE子句的话,往往会先生成两个表行数乘积的数据表然后才根据WHERE条件从中选择。

    1. select * from Course,Teacher where Course.T#=Teacher.T#
    2. select * from Course cross join Teacher where Course.T#=Teacher.T#  (注:cross join后加条件只能用where,不能用on)
    3. select * from Course inner join Teacher on Course.T#=Teacher.T#

    结果为:


    一般情况下,在效率上,Where可能具有和Inner join一样的效率,但是,在多表连接时,我们并不推荐使用where语句。
    所以如果可以选择,我们最好使用语句3,有时使用Join语句可以帮助检查语句中的无效或者误写的关联条件。

    内连接

    内连接表示两边表同时符合条件的组合,就相当于普通的CROSS JOIN,只是格式不一样,
    INNER JOIN在后面有一个ON子句(相当于WHERE)的搜索条件,用于过滤返回的行。
    内连接没有笛卡尔积那么复杂要先生成行数乘积的数据表,所以内连接的效率要高于笛卡尔积的交叉连接。

    外连接

    指定条件的内连接,仅仅返回符合连接条件的条目。
    外连接则不同,返回的结果不仅包含符合连接条件的行,而且包括左表(左外连接时), 右表(右连接时)或者两边连接(全外连接时)的所有数据行。

    1)左外连接LEFT [OUTER] JOIN
    显示符合条件的数据行,同时显示左边数据表不符合条件的数据行,右边没有对应的条目显示NULL

    select * from Course left outer join Teacher on Course.T#=Teacher.T#

    结果为:


    2)右外连接RIGHT [OUTER] JOIN
    显示符合条件的数据行,同时显示右边数据表不符合条件的数据行,左边没有对应的条目显示NULL

    select * from Course right outer join Teacher on Course.T#=Teacher.T#
    结果为:




    3)全外连接full [outer] join

    显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL,即显示左连接、右连接和内连接的并集。

    select * from Course full outer join Teacher on Course.T#=Teacher.T#

    结果为:


    自连接

    其实,在Sql Server中,我们还经常用到一种连接——自连接。
    通过以下的例子,来了解自连接:
    表树形结构表tb_TestTreeView


    解决问题: 树形层次结构显示
    /*
     这是一个地区表,里面存放了地区名及其所属上级地区,假设现在需要查询出各地区及其所属上级地区。
    */

    自连接的方法1:

    select [Name] as '地区名',
      (select [Name] from tb_TestTreeView as a
        where a.ID = b.Parent ) as '上级地区名'
    from tb_TestTreeView as b

    自连接的方法2:

    select a.[Name] as '地区名',
           b.[Name] as '上级地区名'
    from tb_TestTreeView as a
    left join tb_TestTreeView as b
         on a.Parent = b.ID

    结果为:


    自连接三级(左联接):

    复制代码
    select a.[Name] as '地区名',
           b.[Name] as '上级地区名',
           c.[Name] as '上上级地区名'
    from tb_TestTreeView as a
    left join tb_TestTreeView as b
         on a.Parent = b.ID 
    left join tb_TestTreeView as c
         on b.parent=c.id
    复制代码

    结果为:


    自连接三级(内联接):

    复制代码
    select a.[Name] as '地区名',
           b.[Name] as '上级地区名',
           c.[Name] as '上上级地区名'
    from tb_TestTreeView as a
    inner join tb_TestTreeView as b
         on a.Parent = b.ID 
    inner join tb_TestTreeView as c
         on b.parent=c.id
    复制代码

    结果为:

    自连接四级(左链接):

    复制代码
    select a.[Name] as '地区名',
           b.[Name] as '上级地区名',
           c.[Name] as '上上级地区名',
           d.[Name] as '上上上级地区名'
    from tb_TestTreeView as a
    left join tb_TestTreeView as b
         on a.Parent = b.ID 
    left join tb_TestTreeView as c
         on b.parent=c.id
    left join tb_TestTreeView as d
         on c.parent=d.id
    复制代码

    结果为:





    自连接四级(内链接):

    复制代码
    select a.[Name] as '地区名',
           b.[Name] as '上级地区名',
           c.[Name] as '上上级地区名',
           d.[Name] as '上上上级地区名'
    from tb_TestTreeView as a
    inner join tb_TestTreeView as b
         on a.Parent = b.ID
    inner join tb_TestTreeView as c
         on b.Parent = c.ID
    inner join tb_TestTreeView as d
         on c.Parent = d.ID
    复制代码

    结果为:

    本文转载自http://www.cnblogs.com/jiajiayuan/archive/2012/01/16/2321385.html


  • 相关阅读:
    优先队列
    Problem W UVA 662 二十三 Fast Food
    UVA 607 二十二 Scheduling Lectures
    UVA 590 二十一 Always on the run
    UVA 442 二十 Matrix Chain Multiplication
    UVA 437 十九 The Tower of Babylon
    UVA 10254 十八 The Priest Mathematician
    UVA 10453 十七 Make Palindrome
    UVA 10163 十六 Storage Keepers
    UVA 1252 十五 Twenty Questions
  • 原文地址:https://www.cnblogs.com/chenpan/p/3661842.html
Copyright © 2011-2022 走看看