SQL Server数据库的外联接(Outer Join)
沉沙 2018-05-09 来源 : 阅读 2373 评论 0

摘要:外联接的意思不用多说,我们都懂,但是JOIN到底怎么用呢?本文主要讲解SQL Server数据库的外联接(Outer Join),帮助大家更好的掌握SQL Server数据库。

    一 使用外联接

  以前在Oracle中用=(+)和(+)=来进行左外联接和右外联接;后来用SQL Server时用*=和=*进行外连接左外联接和右外联接;
现在决定用SQL-92的标准方法:[OUTER] JOIN,OUTER是可以省略的。

  LEFT OUTER JOIN 或 LEFT JOIN        表示左外联接 

  RIGHT OUTER JOIN 或 RIGHT JOIN      表示左外联接 

  FULL OUTER JOIN 或 FULL JOIN        表示左外联接

  外联接的意思不用多说,我们都懂,但是JOIN到底怎么用呢?没有找到很好的资料,只能从例子中学习了:

  1、这个例子也许没有实际意义,只是为了说明问题:

  

   CREATE TABLE orders(order_id 
   int
   , firm_id 
   int
   , p_id 
   int
   ) CREATE TABLE firms (firm_id 
   int
   , f_name 
   int
   ) CREATE TABLE products(p_id 
   int
   , p_name 
   int
   ) select a.order_id, b.f_name, c.p_name from orders a left join firms b on a.firm_id 
   =
    b.firm_id left join products c on a.p_id 
   =
    c.p_id

  

  说明:orders表是主表,先和从表firms进行左联接,再和从表products进行左联接。

  判断是外联接中的主表还是从表主要看from从句中各个表在LEFT JOIN或RIGHT JOIN两边的位置:LEFT JOIN左边的表是主表,RIGHT JOIN右边的表是主表;

  ON表达了两个表连接的条件,一般外联接是等值联接,不等值联接意义不大;

  在多个表的连接中,一个表既可以做主表又同时可以做从表,为了说明这个问题,我们修改以上SQL为:

  

   select a.order_id, b.f_name, c.p_name from orders a left join firms b on a.firm_id 
   =
    b.firm_id right join products c on a.order_id 
   =
    c.p_id

 

   这个SQL没有什么意义,但从中可以看出a表既是b的主表又是c的从表;到底怎么用,还是要根据实际情况来决定是左联接还是右联接;


  举个例子:

  

   create table tab1 (c1 
   int
   , c2 
   int
   , c3 
   int
   ) create table tab2 (c1 
   int
   , c2 
   int
   , c3 
   int
   ) create table tab3 (c1 
   int
   , c2 
   int
   , c3 
   int
   ) create table tab4 (c1 
   int
   , c2 
   int
   , c3 
   int
   ) SELECT 
   *
    FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 
   =
    tab2.c3 left OUTER JOIN tab3 right OUTER JOIN tab4 ON tab3.c1 
   =
    tab4.c1 ON tab2.c3 
   =
    tab4.c3

 

  

  这种用法还真少见,具体怎么个意思,还在理解中...我把它改写成:

  

   SELECT 
   *
    FROM tab1 left JOIN tab2 ON tab1.c3 
   =
    tab2.c3 LEFT OUTER JOIN tab4 ON tab2.c3 
   =
    tab4.c3 RIGHT OUTER JOIN tab3  ON tab3.c1 
   =
    tab4.c1

 

  

  也许它们是一个意思。我发现加个括号,看的更清楚一些(它是个嵌套)

  

   SELECT 
   *
    FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 
   =
    tab2.c3 left OUTER JOIN (tab3 right OUTER JOIN tab4 ON tab3.c1 
   =
    tab4.c1) ON tab2.c3 
   =
    tab4.c3

 

  

  二 外联接中 "ON + AND" 与 "ON + WHERE" 的区别

  1、on条件是外联接时在生成临时表时使用的联结条件,不论从表是确定值还是NULL,主表所有的值都会出现;

  如果再加上and条件; 如果and条件引用的是主表的列,则对结果毫无影响,主表的所有纪录依然会全部出现;如果and条件引用的是从表的列,则不符合条件的从表纪录显示NULL;

  2、where条件是在临时表生成后,再对临时表进行过滤的条件。临时表中的所有纪录都受影响,不符合条件的纪录被过滤出结果集;

  3、示例:

  

   select a.module_id, a.name, b.module_name from fb_autocoding a left join fb_app_module b on a.module_id 
   =
    b.module_id and b.module_internal_label 
   <>
    
   '
   LO
   '
   ; select a.module_id, a.name, b.module_name from fb_autocoding a left join fb_app_module b on a.module_id 
   =
    b.module_id where b.module_internal_label 
   <>
    
   '
   LO
   '
    ;

  

  三 其他Join运算

  merge join:在处理其他联结之前,先把相关两个表联结在一起;

  hash join:把一个表join到已经被执行过join的结果上;

  用括号改变join的顺序:

  

   select catalog.item, catalog.item_color, product.item, color.color_name from catalog full outer join (product cross join color) on catalog.item 
   =
    product.item and catalog.item_color 
   =
    color.color_name;


    本文由职坐标整理并发布,了解更多内容,请关注职坐标数据库SQL Server频道!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程