博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

多表联接

Posted on 2011-08-27 13:51  枫之一刀  阅读(329)  评论(0编辑  收藏  举报

本章将介绍使用不同类型的联接查询多个表,使用union操作符组合结果集,使用select into 语句创建表。

1:使用表的别名

使用表的别名可以增强脚本的可读性,有利于编写复杂联接。同时简化Transact-SQL的维护。

2:命名列

当对单个表或视图进行操作时,对于列源并不会出现歧义,因为所有列的名称在一个表中必然是唯一的。然而,如果在查询中对多个表进行操作的时候,则必须准确指定列的名称。

对于所有数据库对象的完整性说明由四个标识符组成:服务器名称、数据库名称、所有者名称和对象名称,这些标识符用点号分开。

3:组合多个表中的数据

联接操作可以是你同时查询两个或多个表中的数据,所生成的结果集将多个表中的行和列合并在一起。可以在基于表中的列的表达式基础上或在两个表的列的组合表达式基础上,联接多个表。

有三种类型的联接:内联接,外联接和交叉联接。

联接表就是将匹配行的列组合在一起返回一个虚表。通常情况下,即使表没有明确声明键值,联接操作也是建立在所包含的表的主键和外键基础上的。

4:联接概述

联接多个表以生成一个单独的结果集,该结果集将合并两个或两个以上的表中的列于行。

语法:

SELECT column_name [,column_name ...]

FROM {<table_source>} [,....n]

<join_type> ::=

[INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]

[ <join_hint>]

JOIN

<joined_table> :: =

<table_source> <join_type> <table_source> ON <search_condition> | <table_source> CROSS JOIN <table_source> | <joined_table>

a:从多个表中选择指定的列

联接允许你通过扩展SELECT 语句的FROM子句,从多个表中选择列。在FROM子句中,增加了两个关键字  JOIN和ON:

JOIN:指定要联接的表以及这些表的联接方式;

ON:指定了这些表共同有用的列;

b:查询两个或多个表并生成单个结果集

使用联接能够使你查询两个或多个表中的数据并生成单个的结果集,使用联接时,应注意以下事项和原则:

尽可能以主键和外键为依据来指定联接条件,如果有必要,也可以使用其他任何列在指定联接条件;

如果你的表中包含组合主键,则在联接表的时候,必须在ON子句中引用整个键,以避免数据膨胀。通常通过联接所有唯一标识行的列来防止数据膨胀;

使用所指定表共同拥有的列来联接表,这些列的数据类型必须相同或者互相兼容;

如果所要联接的表的列名相同,则在引用这些列的时候,同时要引用表名,使用下面格式:table_name.column_name来指定列;

尽量在联接中限制表的个数,因为要联接的表越多,SQL Server处理查询的时间也越长;

在一个SELECT语句中,可以联接一个或多个表;

c:ANSI联接操作

以TableA和TableB这两个表为例,说明ANSI联接操作的五种类型

  • 内连接(默认)
    TableA INNER JOIN TableB on join_condition
    仅当一个表中的一些行在另一个表中也有相应的行时,内连接才会返回两表中任意一表中的这些行,换句话说,内连接会忽视所有不符合ON子句指定的联接条件的行。
  • 左外联接
    TableA LEFT OUTER JOIN TableB ON join_condition
    左外联接返回一个存在TableA和TableB之间连接的所有行,另外,如果TableB中没有相应的行,则返回TableA的所有行。换句话说,它将保留TableA中未匹配的行,TableA有时叫做保留表。在结果中包含了TableA中未包含的行,从TableB中选择的列都作为空值返回。
  • 右外联接
    TableA RIGHT OUTER JOIN TableB ON join_condition
    右外联接返回两个相联接的TableA和TableB中的所有行,另外,如果TableA中没有相应的行,则返回TableB中的所有行。换句话说,它将保留TableB中未匹配的行,这是,TableB作为保留表。在结果行中包含了TableB中未匹配的行,从TableA中选择的列都作为空值返回。
  • 完整外部联接
    TableA FULL OUTER JOIN TableB  ON join_condition
    完整外部联接返回两个想联接的TableA和TableB中的所有行。相当于是将左外联接和右外联接组合在一起的一种联接。
  • 交叉联接
    TableA CROSS JOIN TableB
    交叉联接返回TableA和TableB联接后的所有行,没有ON子句来指示两个表之间的任何联接的列,交叉联接返回的是两个表的笛卡尔积。