SQL Server 中的联接查询

查询结果可包含来自多个表或表值对象的数据。若要组合来自多个表值对象的数据,可使用 SQL 的 JOIN 操作。

 

 

自动联接表

当将两个或多个表添加到查询中时,查询和视图设计器会尝试确定它们是否相关。如果相关,查询和视图设计器自动在表示表或表结构对象的矩形之间添加联接线。

如果满足下列条件,查询和视图设计器将表识别为联接的表:

  • 数据库包含指定该表是相关的信息。

  • 如果两个表中各自的一列具有相同的名称和数据类型。该列必须至少在一个表中是主键。例如,假设添加 employeejobs 表,如果 job_id 列是 jobs 表的主键,并且每个表中都有一个名为 job_id 的列,且具有相同的数据类型,那么查询和视图设计器将自动联接这两个表。

  • 查询和视图设计器检测到搜索条件(WHERE 子句)实际上就是联接条件。例如,可以添加表 employeejobs,然后创建一个搜索条件,搜索这两个表的 job_id 列中的相同值。当执行搜索时,查询和视图设计器检测到该搜索条件可导致联接,然后根据该搜索条件创建联接条件。

手动联接表

当向查询中添加两个或更多表时,查询和视图设计器将尝试根据公共数据或数据库中存储的关于这些表如何相关的信息来联接它们。有关详细信息,请参见如何:自动联接表。但是,如果查询和视图设计器未自动联接这些表,或者您希望在这些表之间创建其他联接条件,则可手动联接这些表。

除基于包含相同信息的列之外,还可以基于任意两列之间的比较创建联接。例如,如果数据库包含 titlesroysched 两个表,则可将 titles 表的 ytd_sales 列中的值与 roysched 表的 lorangehirange 列中的值相比较。创建该联接将使您得以查找特定的书名,这些书截止到目前的年销售额位于版税的最高和最低范围之内。

创建外部联接

默认情况下,查询和视图设计器在表之间创建内部联接。如果要在结果集中包含在联接表无匹配项的数据行,可创建外部联接。

当创建外部联接时,表在 SQL 语句中出现的顺序(在 SQL 窗格中反映)非常重要。添加的第一个表成为“左”表,而第二个表成为“右”表。(表在“关系图”窗格中实际出现的顺序并不重要。)当您指定左外部联接或右外部联接时,引用的顺序是将这些表添加到查询中的顺序,以及它们在“SQL”窗格中的 SQL 语句中出现的顺序。

创建外部联接

  1. 自动或手动创建外部联接。有关详细信息,请参见如何:自动联接表如何:手动联接表

  2. 在“关系图”窗格中选择联接线,然后从“查询设计器”菜单中选择“从 <tablename> 中选择所有行”,选择命令,以包括您要包括其中更多行的表。

    • 选择第一个表可创建左外部联接。

    • 选择第二个表可创建右外部联接。

    • 选择两个表可创建完全外部联接。

当您指定外部联接时,查询和视图设计器将修改联接线以指示外部联接。

此外,查询和视图设计器将修改“SQL”窗格中的 SQL 语句,以反映联接类型的变化,如下列语句所示:

 
SELECT employee.job_id, employee.emp_id,
   employee.fname, employee.minit, jobs.job_desc
FROM employee LEFT OUTER JOIN jobs ON 
    employee.job_id = jobs.job_id

因为外部联接包含不匹配的行,所以可使用它查找与外键约束冲突的行。为此,可创建一个外部联接,然后添加搜索条件以查找在最右侧表的主键列为空的行。例如,下列外部联接查找 employee 表中在 jobs 表中无相应行的那些行:

 
SELECT employee.emp_id, employee.job_id
FROM employee LEFT OUTER JOIN jobs 
   ON employee.job_id = jobs.job_id
WHERE (jobs.job_id IS NULL)
联接类型
      
      

当联接表时,创建的联接类型影响出现在结果集内的行。可以创建下列联接类型:

  • 内部联接   仅显示两个联接表中的匹配行的联接。(这是查询和视图设计器中的默认联接类型。)例如,可以联接 titles 表和 publishers 表以创建显示每个书名的出版商名称的结果集。在内部联接中,结果集内不包含没有出版商信息的书名,也不包含没有书名的出版商。这类联接所得到的 SQL 可能像下面这样:

     
    SELECT     title, pub_name
    FROM         titles INNER JOIN
    publishers ON titles.pub_id = publishers.pub_id
    说明:

    当创建内部联接时,包含 NULL 的列不与任何值匹配,因此不包括在结果集内。空值不与其他的空值匹配。

  • 外部联接   即使在联接表中没有相关行的行也可包括在内的联接。可以创建外部联接的三个变体来指定要包括的不匹配行:

    • 左外部联接   包括第一个命名表(“左”表,出现在 JOIN 子句的最左边)中的所有行。不包括右表中的不匹配行。例如,下面的 SQL 语句说明这样一个左外部联接,它在 titles 表和 publishers 表之间联接以包括所有的书名,甚至包括那些没有出版商信息的书名:

       
      SELECT titles.title_id, 
             titles.title, 
             publishers.pub_name
      FROM titles LEFT OUTER JOIN publishers 
                  ON titles.pub_id 
                   = publishers.pub_id
    • 右外部联接   包括第二个命名表(“右”表,出现在 JOIN 子句的最右边)中的所有行。不包括左表中的不匹配行。例如,在 titlespublishers 表之间的右外部联接将包括所有的出版商,甚至包括那些在 titles 表中没有书名的出版商。得到的 SQL 可能像下面这样:

       
      SELECT titles.title_id, 
             titles.title, 
             publishers.pub_name
      FROM titles RIGHT OUTER JOIN publishers 
                  ON titles.pub_id 
                   = publishers.pub_id
    • 完全外部联接   包括所有联接表中的所有行,不论它们是否匹配。例如,titlespublishers 之间的完全外部联接显示所有书名和所有出版商,甚至包括那些在另一个表中没有匹配值的行。

       
      SELECT titles.title_id, 
             titles.title, 
             publishers.pub_name
      FROM titles FULL OUTER JOIN publishers 
                  ON titles.pub_id 
                   = publishers.pub_id
      说明:

      有些数据库(如 Oracle)不支持完全外部联接。

  • 完全联接   在这类联接的结果集内,两个表中每对可能成对的行占一行。例如,在通过作者 CROSS JOIN(完全联接)出版商输出的结果集内,每个可能的作者/出版商组合占一行。得到的 SQL 可能像下面这样:

     
    SELECT *
    FROM authors CROSS JOIN publishers 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值