zoukankan      html  css  js  c++  java
  • sql中的左右关联、全关联、自关联

    sql中的左右关联、全关联、自关联

    2018年09月06日 09:27:15 Y_Y_B_J_Y 阅读数 8110

    首先来个图例:

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 
    right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
    inner join(等值连接) 只返回两个表中联结字段相等的行

    举例如下: 
    --------------------------------------------
    表A记录如下:
    aID     aNum
    1     a20050111
    2     a20050112
    3     a20050113
    4     a20050114
    5     a20050115

    表B记录如下:
    bID     bName
    1     2006032401
    2     2006032402
    3     2006032403
    4     2006032404
    8     2006032408

    --------------------------------------------
    1.left join
    sql语句如下: 
    select * from A
    left join B 
    on A.aID = B.bID

    结果如下:
    aID     aNum     bID     bName
    1     a20050111    1     2006032401
    2     a20050112    2     2006032402
    3     a20050113    3     2006032403
    4     a20050114    4     2006032404
    5     a20050115    NULL     NULL

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

    结果如下:
    aID     aNum     bID     bName
    1     a20050111    1     2006032401
    2     a20050112    2     2006032402
    3     a20050113    3     2006032403
    4     a20050114    4     2006032404
    NULL     NULL     8     2006032408

    (所影响的行数为 5 行)
    结果说明:
    仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
    --------------------------------------------
    3.inner join
    sql语句如下: 
    select * from A
    innerjoin B 
    on A.aID = B.bID

    结果如下:
    aID     aNum     bID     bName
    1     a20050111    1     2006032401
    2     a20050112    2     2006032402
    3     a20050113    3     2006032403
    4     a20050114    4     2006032404

    结果说明:
    很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
    --------------------------------------------
    注: 
    LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。

    连接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件。WHERE和HAVING子句也可以包含搜索条件,以进一步筛选连接条件所选的行。   
       
          连接可分为以下几类:     
        
          内连接。(典型的连接运算,使用像   =   或   <>   之类的比较运算符)。包括相等连接和自然连接    
          内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索   students   和   courses   表中学生标识号相同的所有行。   
        
          外连接。外连接可以是左向外连接、右向外连接或完整外部连接    
          在FROM子句中指定外连接时,可以由下列几组关键字中的一组指定:   
          LEFT   JOIN   或   LEFT   OUTER   JOIN。     
          左向外连接的结果集包括LEFT  OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。    
          RIGHT  JOIN  或  RIGHT   OUTER   JOIN。    
          右向外连接是左向外连接的反向连接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。   
       
          FULL   JOIN   或   FULL   OUTER   JOIN。     
          完整外部连接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。   
       
          交叉连接。交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接也称作笛卡尔积。   
       
    例如,下面的内连接检索与某个出版商居住在相同州和城市的作者:  
       
      USE   pubs  
      SELECT   a.au_fname,   a.au_lname,   p.pub_name  
      FROM   authors   AS   a   INNER   JOIN   publishers   AS   p  
            ON   a.city   =   p.city  
            AND   a.state   =   p.state  
      ORDER   BY   a.au_lname   ASC,   a.au_fname   ASC   
       
          FROM   子句中的表或视图可通过内连接或完整外部连接按任意顺序指定;但是,用左或右向外连接指定表或视图时,表或视图的顺序很重要。有关使用左或右向外连接排列表的更多信息,请参见使用外连接。     
        
    例子:  
      a表       id   name     b表     id     job   parent_id  
                  1   张3                   1     23     1  
                  2   李四                  2     34     2  
                  3   王武                  3     34     4  
       
      a.id同parent_id   存在关系   
        
      内连接   
      select   a.*,b.*   from   a   inner   join   b     on   a.id=b.parent_id  
       
      结果是    
      1   张3                   1     23     1  
      2   李四                  2     34     2   
        
      左连接   
      select   a.*,b.*   from   a   left   join   b     on   a.id=b.parent_id  
       
      结果是    
      1   张3                    1     23     1  
      2   李四                  2     34     2  
      3   王武                  null   

      右连接   
      select   a.*,b.*   from   a   right   join   b     on   a.id=b.parent_id  
       
      结果是    
      1   张3                   1     23     1  
      2   李四                 2     34     2  
      null                       3     34     4   
        
      完全连接   
      select   a.*,b.*   from   a   full   join   b     on   a.id=b.parent_id   

      结果是    
      1   张3                   1     23     1  
      2   李四                 2     34     2  
      null                 3     34     4  
      3   王武                 null

  • 相关阅读:
    C# 中 KeyPress 、KeyDown 和KeyUp的区别(转载)
    DataBinding的大用
    C#中的非托管资源释放(Finalize&Dispose)(转载)
    如何实现控件从IDE拖放到窗体上的效果?
    怎么在DataGridView中动态添加DateTimePicker列?
    电子表格(SpreadSheet)主要属性、方法和事件 原文:http://blog.csdn.net/zhangting1987/article/details/2065871
    C#利用KeyValuePair实现Dictionary的遍历方法
    Winform 打印报表
    vs2008 此安装不支持该项目类型
    WinForm里面使用多线程修改主线程上的一个Label的值
  • 原文地址:https://www.cnblogs.com/grj001/p/12224663.html
Copyright © 2011-2022 走看看