zoukankan      html  css  js  c++  java
  • 数据库: 左连接/右连接/全连接(详细) 复习一下

    数据库: 左连接/右连接/全连接(详细)



    原址;http://hi.baidu.com/xiaoqing2305/item/17cf9cd35d52cfe4b3f777c8

    从两个或更多个表中组合数据的过程称为连接表。数据库管理从指定的表中形成行的所有组合。对于每个组合,它都测试连接条件。连接条件是带有一些约束的搜索条件。有关约束的列表,参考 SQL Reference。 
      

      注意:连接条件涉及的列的数据类型不必相同;然而,这些数据类型必须相容。计算连接条件的与计算其他搜索条件的方式相同,并且使用相同的比较规则。 
      
      如果未指定连接条件,则返回在 FROM 子句中列出的表中行的所有组合,即使这些行可能完全不相关。该结果称为这两个表的交叉积。 
      
      本节中的示例基于下面两个表。这两个表只是样本数据库中表的简化形式,在样本数据库中并不存在。这两个表一般用来概述关于连接的重点。 SAMP_STAFF 列出未作为合同工雇用的雇员的姓名以及这些雇员的职务说明,而 SAMP_PROJECT 则列出雇员(合同工和全职人员)的姓名以及这些雇员所参与的项目。 
      
      这些表如下: 
      
      图 5. SAMP_PROJECT 表
      
       sql入门:连接(图一) 
      
      图 6. SAMP_STAFF 表
      
       sql入门:连接(图二) 
      
      下列示例产生两个表的交叉积。因未指定连接条件,所以给出了行的所有组合: 
      
       SELECT SAMP_PROJECT.NAME,
          SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB
        FROM SAMP_PROJECT, SAMP_STAFF
      
      此语句产生下列结果: 
      
       sql入门:连接(图三) 
      
      两个主要的连接类型是内连接和外连接。到目前为止,所有示例中使用的都是内连接。内连接只保留交叉积中满足连接条件的那些行。如果某行在一个表中存在,但在另一个表中不存在,则结果表中不包括该信息。 
      
      下列示例产生两个表的内连接。该内连接列出分配给某个项目的全职雇员信息: 
      
       SELECT SAMP_PROJECT.NAME,
          SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB
        FROM SAMP_PROJECT, SAMP_STAFF
        WHERE SAMP_STAFF.NAME = SAMP_PROJECT.NAME
      
      或者,也可以指定如下内连接: 
      
       SELECT SAMP_PROJECT.NAME,
          SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB
        FROM SAMP_PROJECT INNER JOIN SAMP_STAFF
         ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
      
      结果是: 
      
       sql入门:连接(图四)
      
      注意:该内连接的结果由右表和左表中姓名列的值匹配的行组成- 'Haas' 和 'Thompson' 都包括在列出所有全职雇员的 SAMP_STAFF 表中以及列出分配给某个项目的专职和合同雇员的 SAMP_PROJECT 表中。 
      
      外连接是内连接和左表和/或右表中未包括内连接中的那些行的并置。当对两个表执行外连接时,可任意将一个表指定为左表而将另一个表指定为右表。外连接有三种类型: 
      
      
      左外连接包括内连接和左表中未包括在内连接中的那些行。 
      
      右外连接包括内连接和右表中未包括在内连接中的那些行。 
      
      全外连接包括内连接以及左表和右表中未包括在内连接中的行。 
      使用 SELECT 语句来指定要显示的列。在 FROM 子句中,列出后跟关键字 LEFT OUTER JOIN、RIGHT OUTER JOIN 或 FULL OUTER JOIN 的第一个表的名称。接着需要指定后跟 ON 关键字的第二个表。在 ON 关键字后面,指定表示要连接的表之间关系的连接条件。 
      
      在下列示例中,将 SAMP_STAFF 指定为右表,而 SAMP_PROJECT 则被指定为左表。通过使用 LEFT OUTER JOIN,列出所有全职和合同雇员(在 SAMP_PROJECT 中列出)的姓名和项目编号,如果是全职雇员(在 SAMP_STAFF 中列出),还列出这些雇员的职位: 
      
       SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ,
          SAMP_STAFF.NAME, SAMP_STAFF.JOB
        FROM SAMP_PROJECT LEFT OUTER JOIN SAMP_STAFF
         ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
      
      此语句产生下列结果:
      
       sql入门:连接(图五) 
      
      所有列中都具有值的那些行是该内连接的结果。这些都是满足连接条件的行: 'Haas' 和 'Thompson' 既在 SAMP_PROJECT(左表)中列出又在 SAMP_STAFF(右表)中列出。对于不满足连接条件的行,右表的列上出现空值: 'Lutz' 和 'Walker' 都是在 SAMP_PROJECT 表中列出的合同雇员,因而未在 SAMP_STAFF 表中列出。注意:左表中的所有行都包括在结果集中。 
      
      在下一个示例中,将 SAMP_STAFF 指定为右表而 SAMP_PROJECT 则被指定为左表。通过使用 RIGHT OUTER JOIN 列出所有专职雇员(在 SAMP_STAFF 中列出)的姓名和职位,如果将这些雇员分配给了某个项目(在 SAMP_PROJECT 中列出),还列出他们的项目编号: 
      
       SELECT SAMP_PROJECT.NAME,
          SAMP_PROJECT.PROJ, SAMP_STAFF.NAME, SAMP_STAFF.JOB
        FROM SAMP_PROJECT RIGHT OUTER JOIN SAMP_STAFF
         ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
      
      结果为: 
      
       sql入门:连接(图六) 
      
      象在左外连接中一样,所有列中都具有值的那些行是内连接的结果。这些都是满足连接条件的行: 'Haas'和'Thompson'既在 SAMP_PROJECT(左表)中列出又在 SAMP_STAFF(右表)中列出。对于不满足连接条件的行,右表的列上出现空值: 'Lucchessi'和'Nicholls'都是未分配项目的专职雇员。虽然他们在 SAMP_STAFF 中列出,但未在 SAMP_PROJECT 中列出。注意:右表中的所有行都包括在结果集中。 
      
      下一个示例对 SAMP_PROJECT 表和 SAMP_STAFF 表使用 FULL OUTER JOIN。该示例列出所有专职雇员(包括未分配项目的雇员)和合同雇员的姓名: 
      
       SELECT SAMP_PROJECT.NAME, SAMP_PROJECT.PROJ,
          SAMP_STAFF.NAME, SAMP_STAFF.JOB
        FROM SAMP_PROJECT FULL OUTER JOIN SAMP_STAFF
         ON SAMP_STAFF.NAME = SAMP_PROJECT.NAME
      
      结果为:
      
      sql入门:连接(图七) 
      
      此结果包括左外连接、右外连接以及内连接。列出所有专职雇员和合同雇员。正如左外连接和右外连接一样,对于不满足连接条件的值,相应列中出现空值。 SAMP_STAFF 和 SAMP_PROJECT 中的每一行都包括在结果集中。

    SQL语句实例:
    (1) 右连接

         select * from ry_jbxx, ry_rxzp where ry_jbxx.gmsfhm(+) = ry_rxzp.gmsfhm

         等价

         select * from ry_jbxx right OUTER JOIN ry_rxzp on ry_jbxx.gmsfhm = ry_rxzp.gmsfhm

    (2) 左连接

          select * from ry_jbxx, ry_rxzp where ry_jbxx.gmsfhm = ry_rxzp.gmsfhm(+)

          等价

         select * from ry_jbxx LEFT OUTER JOIN ry_rxzp on ry_jbxx.gmsfhm = ry_rxzp.gmsfhm

  • 相关阅读:
    underscore utility
    underscore objects
    underscore functions
    underscore arrays
    underscore collections
    underscore概况
    in操作符
    类数组对象 实参对象arguments
    JAVA和C++的区别
    MySQL学习笔记(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)
  • 原文地址:https://www.cnblogs.com/catkins/p/5270769.html
Copyright © 2011-2022 走看看