left join 和 left outer join 的区别_第1页
left join 和 left outer join 的区别_第2页
left join 和 left outer join 的区别_第3页
left join 和 left outer join 的区别_第4页
left join 和 left outer join 的区别_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、left join 是left outer join的简写,left join默认是outer属性的。Inner JoinInner Join 逻辑运算符返回满足第一个(顶端)输入与第二个(底端)输入联接的每一行。这个和用select查询多表是一样的效果,所以很少用到;outer join则会返回每个满足第一个(顶端)输入与第二个(底端)输入的联接的行。它还返回任何在第二个输入中没有匹配行的第一个输入中的行。关键就是后面那句,返回的多一些。所以通常意义上的left join就是left outer join详情如下:left join 和 left outer join 的区别 通俗的讲:&#

2、160;   A   left   join   B   的连接的记录数与A表的记录数同    A   right   join   B   的连接的记录数与B表的记录数同      A   left

3、   join   B   等价B   right   join   A          table   A:  Field_K,   Field_A    1   &

4、#160;                   a    3                       b  

5、0; 4                       c       table   B:    Field_K,   Field_B    1

6、60;                      x    2                       y

7、    4                       z       select   a.Field_K,   a.Field_A,   b.Field_K,

8、0;  b.Field_B    from   a   left   join   b   on   a.Field_K=b.Field_K       Field_K         Field_A

9、         Field_K         Field_B            -   -   -   -      1  

10、;                   a                     1         

11、60;           x                      3                &

12、#160;    b                     NULL               NULL    4   

13、60;                 c                     4           &

14、#160;         z                         select   a.Field_K,   a.Field_A,   b.Field_K,

15、   b.Field_B    from   a   right   join   b   on   a.Field_K=b.Field_K       Field_K         Fi

16、eld_A         Field_K         Field_B            -   -   -   -      1 

17、                    a                     1        

18、0;            x                      NULL               

19、;NULL               2                     y             

20、;         4                     c                   

21、60; 4                     z       -举个例子:    假设表和表的数据是这样的。    a         

22、0;               b      id     nameid     stock    1a            

23、 1         15    2         b             2         50   

24、0;3         c                      select   *   from   a   inner   joi

25、n   b   on   a.id=b.id    这个语法是连接查询中的内连接,它产生的结果是    两个表相匹配的记录出现在结果列表中。    根据上面的表,出现的结果是这样的    a.id     name     b.id 

26、60;   stock    1     a             1         15    2         

27、0;   b             2         50    -    select   *   from   a,b   where

28、0;  a.id=b.id    这个语法是内连接的另外一种写法,其执行结果与inner   join   一样       -         select   *   from   a   lef

29、t/right   join   b   on   a.id=b.id    这个是外连接语法中的左外连接或右外连接    如果是左外连接的话,它将显示表的所有记录,    select   a.*,b.*   from   a   lef

30、t   join   b   on   a.id=b.id    查询的结果是这样的:    a.id     name     b.id     stock    1   

31、60;   a         1             15    2               b    

32、60;    2             50    3               c       null     

33、    null    -    如果是右外连接的话,它将显示表的所有记录,    select   a.*,b.*   from   a   right   join   b   on   a.id

34、=b.id    查询的结果是这样的:    a.id     name     b.id     stock    1       a         1 &

35、#160;           15    2               b         2         &#

36、160;   50   - select   a.*,b.*   from   a   left   join   b   on   a.k   =   b.k      sele

37、ct   a.*,b.*   from   a   left   outer   join   b   on   a.k   =b.k    -上面两种一样left   join是left   out

38、er   join的简写    select   a.*,b.*   from   a   left   inner   join   b   on   a.k   =   b.k 

39、0;    没有这种写法,错误的语句.- 在你要使用多个left   join的时候    比如说10个    我们把10个全都写成left   join的形式    然后再SQL让他自动运行一下,它会把最后一次出现的left   join变成left   outer   join

40、0;   所以依此推理,最后一个left   join会以left   outer   join的形式存在    当然,不管变不变对结果的显示没有任何影响    希望我的实验能对你有所帮助   -使用关系代数合并数据1 关系代数合并数据集合的理论基础是关系代数,它是由E.F.Codd于1970年提出的。在关系代数的形式化语言中:r  &#

41、160;     用表、或者数据集合表示关系或者实体。r        用行表示元组。r        用列表示属性。关系代数包含以下8个关系运算符r        选取返回满足指定条件的行。r        投影从数据集合中返回

42、指定的列。r        笛卡尔积是关系的乘法,它将分别来自两个数据集合中的行以所有可能的方式进行组合。r        并关系的加法和减法,它可以在行的方向上合并两个表中的数据,就像把一个表垒在另一个表之上一样。r        交返回两个数据集合所共有的行。r        

43、;差返回只属于一个数据集合的行。r        连接在水平方向上合并两个表,其方法是:将两个表中在共同数据项上相互匹配的那些行合并起来。r        除返回两个数据集之间的精确匹配。此外,作为一种实现现代关系代数运算的方法,SQL还提供了:r        子查询类似于连接,但更灵活;在外部查询中,方式可以使用表达式、列表或者数据集合的地方都可以使用子

44、查询的结果。本章将主要讲述多种类型的连接、简单的和相关的子查询、几种类型的并、关系除以及其他的内容。2 使用连接2.1 连接类型在关系代数中,连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合(通常是表),并产生一个新的结果集合,其方法是将一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组。SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时

45、所采用的方法不同。连接类型        定义内连接        只连接匹配的行左外连接        包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行右外连接        包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左

46、边表中全部匹配的行全外连接        包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。(H)(theta)连接        使用等值以外的条件来匹配左、右两个表中的行交叉连接        生成笛卡尔积它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配在INFORMIX中连接表的查询如果FR

47、OM子句指定了多于一个表引用,则查询会连接来自多个表的行。连接条件指定各列之间(每个表至少一列)进行连接的关系。因为正在比较连接条件中的列,所以它们必须具有一致的数据类型。SELECT语句的FROM子句可以指定以下几种类型的连接FROM子句关键字        相应的结果集CROSS JOIN        笛卡尔乘积(所有可能的行对)INNER JOIN     &

48、#160;  仅对满足连接条件的CROSS中的列LEFT OUTER JOIN        一个表满足条件的行,和另一个表的所有行RIGHT OUTER JOIN        与LEFT相同,但两个表的角色互换FULL OUTER JOIN        LEFT 

49、OUTER 和 RIGHT OUTER中所有行的超集2.2 内连接(Inner Join)内连接是最常见的一种连接,它页被称为普通连接,而E.FCodd最早称之为自然连接。下面是ANSI SQL92标准select *from  t_institution iinner join t_teller ton i.inst_no = t.inst_nowhere i.inst_no = "5801&q

50、uot;其中inner可以省略。等价于早期的连接语法select *from t_institution i, t_teller twhere i.inst_no = t.inst_noand i.inst_no = "5801"2.3 外连接2.3.1        左外连接(Left Outer Jion)select *from &

51、#160;t_institution ileft outer join t_teller ton i.inst_no = t.inst_no其中outer可以省略。2.3.2        右外连接(Rigt Outer Jion)select *from  t_institution iright outer join t_teller 

52、;ton i.inst_no = t.inst_no2.3.3        全外连接(Full Outer)全外连接返回参与连接的两个数据集合中的全部数据,无论它们是否具有与之相匹配的行。在功能上,它等价于对这两个数据集合分别进行左外连接和右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集。在现实生活中,参照完整性约束可以减少对于全外连接的使用,一般情况下左外连接就足够了。在数据库中没有利用清晰、规范的约束来防范错误数据情况下,全外连接就变得非常有用了,

53、你可以使用它来清理数据库中的数据。select *from  t_institution ifull outer join t_teller ton i.inst_no = t.inst_no2.3.4        外连接与条件配合使用当在内连接查询中加入条件是,无论是将它加入到join子句,还是加入到where子句,其效果是完全一样的,但对于外连接情况就不同了。当把条件加入到 join子句时,

54、SQL Server、Informix会返回外连接表的全部行,然后使用指定的条件返回第二个表的行。如果将条件放到where子句中,SQL Server将会首先进行连接操作,然后使用where子句对连接后的行进行筛选。下面的两个查询展示了条件放置位子对执行结果的影响:条件在join子句select *from  t_institution ileft outer join t_teller ton i.inst_no = t.inst_noand i.ins

55、t_no = “5801”结果是:inst_no    inst_name            inst_no    teller_no  teller_name5801       天河区        &

56、#160;      5801       0001       tom5801       天河区               5801   

57、60;   0002       david5802       越秀区5803       白云区条件在where子句select *from  t_institution ileft outer join t_teller ton i.inst_no =&

58、#160;t.inst_nowhere i.inst_no = “5801”结果是:inst_no    inst_name            inst_no    teller_no  teller_name5801       天河区   &

59、#160;           5801       0001       tom5801       天河区              &

60、#160;5801       0002       david2.4 自身连接自身连接是指同一个表自己与自己进行连接。这种一元连接通常用于从自反关系(也称作递归关系)中抽取数据。例如人力资源数据库中雇员与老板的关系。下面例子是在机构表中查找本机构和上级机构的信息。select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_n

61、o, i.inst_namefrom t_institution ijoin t_institution son i.superior_inst = s.inst_no结果是:superior_inst sup_inst_name        inst_no    inst_name800        &

62、#160;  广州市               5801       天河区800           广州市           

63、60;   5802       越秀区800           广州市               5803       白云区2.5 交叉(无限制)

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

65、oss join t_teller t在交叉连接中没有on条件子句3 APPENDIX3.1 A 参考资料与资源r        Microsoft SQL Server 2000 BilePaul Nielsenr        Paul Nielsen的Web站点url/url3.2 注文章所有SQL在I

66、BM Informix Dynamic Server Version 9.40.TC2E1测试通过- 表A记录如下:aID        aNum1           a200501112           a200501123 

67、60;         a200501134           a200501145           a20050115表B记录如下:bID        bName1   

68、         20060324012           20060324023           20060324034           20060324048

69、0;          2006032408实验如下:1.left joinsql语句如下:select * from Aleft join Bon A.aID = B.bID结果如下:aID        aNum         

70、60;         bID           bName1            a20050111         1     &#

71、160;         20060324012            a20050112         2              20060324023

72、            a20050113         3              20060324034           

73、60;a20050114         4              20060324045            a20050115         NUL

74、L       NULL(所影响的行数为 5 行)结果说明:        left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).B表记录不足的地方均为NULL.2.right joinsq

75、l语句如下:select * from Aright join Bon A.aID = B.bID结果如下:aID        aNum                   bID     

76、0;     bName1            a20050111         1               20060324012    &

77、#160;       a20050112         2              20060324023            a20050113         3              20060324034          &

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论