SQL -- JOIN子句

      JOIN(联接)用来定义如何从多个表中选取数据并组合成一个结果集。JOIN子句有多种形式,这些形式改变着要进行联接的表之间相互作用的方式。有4种不同类型的JOIN,其共同点是:通过记录的联接列,把一条记录同一条或多条记录进行匹配,从而产生出是这些记录的超集的记录。例如,从名为Films的表中提取一条记录: 

FilmID    FilmName      YearMade

1           My Fair Lady  1964

      接下来,从名为Actors的表中提取记录:

FilmID    FirstName    LastName

1           Rex             Harrison

1           Audrey         Hepburn

      通过JOIN,就能从两条来自完全独立的表记录中生成一条记录:

FilmID    FilmName     YearMade    FirstName   LastName

1          My Fair Lady  1964            Rex            Harrison

1          My Fair Lady  1964            Audrey        Hepburn

      下面我们来具体看看各种不同的JOIN类型。
      1、INNER JOIN
      
Inner Join 是最常用的JOIN类型。虽然都是基于一个或多个公共字段来把记录匹配到一起,但Inner Join只返回进行联结的字段上匹配的记录。现在我们对表做些
Inner Join 会得到什么结果。下面是Films表:

FilmID    FilmName        YearMade

1           My Fair Lady    1964

2           Unforgiven      1992

      这是Actors表:

FilmID    FirstName    LastName

1           Rex             Harrison

1           Audrey         Hepburn

2           Clint            EastWood

5           Humphrey     Bogart

      使用Inner Join后,结果将会是这样:

FilmID    FilmName       YearMade    FirstName    LastName

1           My Fair Lady   1964            Rex             Harrison        

1           My Fair Lady   1964            Audrey         Hepburn

2           Unforgiven     1992            Clint            EastWood

      实际上,Inner Join是在做排除----即是说,如果任一行在两个表中不匹配,则注定将从最终的结果集中排除掉。

      2、OUTER JOIN
      先来看看 Outer Join 的语法

    Select <要查询的字段> From <Left 资料表>
        <Left | Right> [Outer] Join <Right 资料表> On <Join 规则>
      语法中的 Outer 是可以省略的, 例如你可以用 Left Join 或是 Right Join, 在本质上, Outer Join 是 inclusive, 叫它做包容性吧! 不同于 Inner Join 的排他性, 因此在 Left Outer Join 的查询结果会包含所有 Left 资料表的资料。对Films表和Actors表做Left Outer Join的结果如下:(以FilmID相等作为on的条件)

FilmID    FilmName        YearMade    FirstName   LastName

1           My Fair Lady    1964           Audrey Hepburn
1           My Fair Lady    1964           Rex Harrison
2           Unforgiven      1992           Clint EastWood
      颠倒过来讲, Right Outer Join 的查询就会包含所有 Right 资料表的资料。对Films表和Actors表做Right Outer Join的结果如下:(以FilmID相等作为on的条件)

FilmID    FilmName        YearMade    FirstName   LastName

1           My Fair Lady    1964           Audrey        Hepburn
1           My Fair Lady    1964           Rex            Harrison
2           Unforgiven      1992           Clint           EastWood
5           NULL              NULL           Humphrey   Bogart

      Full Outer Join (全外连接)则包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。

      3、CROSS JOIN
      Cross Join用于对两个源表进行纯关系代数的乘运算。它不使用连接条件来限制结果集合,而是将分别来自两个数据源中的行以所有可能的方式进行组合。数据集合中一的每个行都要与数据集合二中的每一个行分别组成一个新的行。例如,如果第一个数据源中有5个行,而第二个数据源中有4个行,那么在它们之间进行交叉连接就会产生20个行。人们将这种类型的结果集称为笛卡尔乘积。大多数交叉连接都是由于错误操作而造成的;但是它们却非常适合向数据库中填充例子数据,或者预先创建一些空行以便为程序执行期间所要填充的数据保留空间。在交叉连接中没有on条件子句。

 

转到博客首页查看更多随笔

posted on 2009-10-12 16:12  lantionzy  阅读(740)  评论(1编辑  收藏  举报