您的位置:首页 > 数据库

SQL 语句时,查询的内联接,外联接,空值和联接

2007-06-04 17:44 211 查看

出自:msdn的帮助文档

联接类型

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

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

·
SELECTtitle,pub_name

·
FROMtitlesINNERJOIN

publishersONtitles.pub_id=publishers.pub_id

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

有关创建内联接的更多信息,请参见自动联接表。

外联接甚至包括在联接表中没有相关行的行的联接。可以创建外联接的三个变化形式来指定所包括的不匹配行:

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

·
SELECTtitles.title_id,

·[code]titles.title,

·
publishers.pub_name

·
FROMtitlesLEFTOUTERJOINpublishers

·
ONtitles.pub_id

=publishers.pub_id


右向外联接包括第二个命名表("右"表,出现在JOIN子句的最右边)中的所有行。不包括左表中的不匹配行。例如,在
titles
publishers
表之间的右向外联接将包括所有的出版商,甚至包括那些在
titles
表中没有书名的出版商。所得到的SQL可能象下面这样:

·
SELECTtitles.title_id,

·[code]titles.title,

·
publishers.pub_name

·
FROMtitlesRIGHTOUTERJOINpublishers

·
ONtitles.pub_id

=publishers.pub_id


完整外部联接包括所有联接表中的所有行,不论它们是否匹配。例如,
titles
表和
publishers
表之间的完整外部联接显示所有书名和所有出版商,甚至包括那些在另一个表中没有匹配值的书名和出版商。

·
SELECTtitles.title_id,

·[code]titles.title,

·
publishers.pub_name

·
FROMtitlesFULLOUTERJOINpublishers

·
ONtitles.pub_id

=publishers.pub_id

·有关创建外联接的更多信息,请参见创建外联接。

交叉联接在这类联接的结果集内,两个表中每两个可能成对的行占一行。例如,在通过作者CROSSJOIN出版商输出的结果集内,每个可能的作者/出版商组合占一行。所得到的SQL可能象下面这样:

·
SELECT*

FROMauthorsCROSSJOINpublishers

有关创建完全联接的更多信息,请参见删除联接。

请参见

创建外联接|创建自联接|查询设计器表示联接的方式|自动联接表|手工联接表|修改联接运算符|使用多个表进行查询|删除联接

©1988-2000MicrosoftCorporation。保留所有权利。



访问和更改关系数据

空值和联接

如果要联接的表的列中有空值,则这些空值互相不匹配。如果其中一个联接表的列中出现空值,只能通过外联接返回这些空值(除非WHERE子句不包括空值)。

下面的两个表中,每个表在要参与联接的列中均包含NULL值:

table1table2

abcd

--------------------------

1oneNULLtwo

NULLthree4four

4join4

将列a中的值与列c中的值进行比较的联接在包含NULL值的列上不能获得匹配结果:

SELECT*

FROMtable1t1JOINtable2t2

ONt1.a=t2.c

ORDERBYt1.a

只返回列ac值为4的一行:

abcd

----------------------------------

4join44four


(1row(s)affected)

从基表返回的空值和从外联接返回的空值也很难区分。例如,下面的SELECT语句对这两个表进行左向外联接:

SELECT*

FROMtable1t1LEFTOUTERJOINtable2t2

ONt1.a=t2.c

ORDERBYt1.a

下面是结果集:

abcd

----------------------------------

NULLthreeNULLNULL

1oneNULLNULL

4join44four


(3row(s)affected)

结果并不能使数据中的NULL值和表示联接失败的NULL值容易区分。如果要联接的数据出现空值,最好用常规联接将这些空值从结果中省略。

请参见
sp_dbcmptlevel

WHERE

©1988-2000MicrosoftCorporation。保留所有权利。

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: