📄 20106.htm
字号:
<link href="./dzs_cs.css" rel="stylesheet" type="text/css" /><table width="96%" border="0" align="center" cellpadding="0" cellspacing="0"> <tr> <td> </td> </tr> <tr> <td height="24" align="center" valign="bottom" class="d_font3">SQL:JOIN之完全用法</td> </tr> <tr> <td height="3" bgcolor="#E3E3E3"></td> </tr> <tr> <td> </td> </tr> <tr> <td class="d_font4"><P><STRONG>外联接</STRONG></P>
<P>外联接可以是左向外联接、右向外联接或完整外部联接。在 FROM 子句中指定外联接时,可以由下列几组关键字中的一组指定:LEFT JOIN 或 LEFT OUTER JOIN。</P>
<P>左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。</P>
<P>RIGHT JOIN 或 RIGHT OUTER JOIN。 <BR>右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。</P>
<P>FULL JOIN 或 FULL OUTER JOIN。 <BR>完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。</P>
<P>仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行。内联接消除与另一个表中的任何行不匹配的行。而外联接会返回 FROM 子句中提到的至少一个表或视图的所有行,只要这些行符合任何 WHERE 或 HAVING 搜索条件。将检索通过左向外联接引用的左表的所有行,以及通过右向外联接引用的右表的所有行。完整外部联接中两个表的所有行都将返回。</P>
<P>Microsoft® SQL Server™ 2000 对在 FROM 子句中指定的外联接使用以下 SQL-92 关键字: </P>
<P>LEFT OUTER JOIN 或 LEFT JOIN<BR>RIGHT OUTER JOIN 或 RIGHT JOIN</P>
<P>FULL OUTER JOIN 或 FULL JOIN <BR>SQL Server 支持 SQL-92 外联接语法,以及在 WHERE 子句中使用 *= 和 =* 运算符指定外联接的旧式语法。由于 SQL-92 语法不容易产生歧义,而旧式 Transact-SQL 外联接有时会产生歧义,因此建议使用 SQL-92 语法。</P>
<P><STRONG>使用左向外联接</STRONG></P>
<P>假设在 city 列上联接 authors 表和 publishers 表。结果只显示在出版商所在城市居住的作者(本例中为 Abraham Bennet 和 Cheryl Carson)。</P>
<P>若要在结果中包括所有的作者,而不管出版商是否住在同一个城市,请使用 SQL-92 左向外联接。下面是 Transact-SQL 左向外联接的查询和结果:</P>
<P>USE pubs<BR>SELECT a.au_fname, a.au_lname, p.pub_name<BR>FROM authors a LEFT OUTER JOIN publishers p<BR>ON a.city = p.city<BR>ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC</P>
<P>下面是结果集:</P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE>au_fname au_lname pub_name<BR>
Reginald Blotchet-Halls NULL<BR>Michel DeFrance NULL<BR>Innes del Castillo NULL<BR>Ann Dull NULL<BR>Marjorie Green NULL<BR>Morningstar Greene NULL<BR>Burt Gringlesby NULL<BR>Sheryl Hunter NULL<BR>Livia Karsen NULL<BR>Charlene Locksley NULL<BR>Stearns MacFeather NULL<BR>Heather McBadden NULL<BR>Michael OLeary NULL<BR>Sylvia Panteley NULL<BR>Albert Ringer NULL<BR>Anne Ringer NULL<BR>Meander Smith NULL<BR>Dean Straight NULL<BR>Dirk Stringer NULL<BR>Johnson White NULL<BR>Akiko Yokomoto NULL<BR>Abraham Bennet Algodata Infosystems<BR>Cheryl Carson Algodata Infosystems
<P>(23 row(s) affected)</P></PRE></TD></TR></TBODY></TABLE>
<P>不管是否与 publishers 表中的 city 列匹配,LEFT OUTER JOIN 均会在结果中包含 authors 表的所有行。注意:结果中所列的大多数作者都没有相匹配的数据,因此,这些行的 pub_name 列包含空值。</P>
<P>使用右向外联接<BR>假设在 city 列上联接 authors 表和 publishers 表。结果只显示在出版商所在城市居住的作者(本例中为 Abraham Bennet 和 Cheryl Carson)。SQL-92 右向外联接运算符 RIGHT OUTER JOIN 指明:不管第一个表中是否有匹配的数据,结果将包含第二个表中的所有行。</P>
<P>若要在结果中包括所有的出版商,而不管城市中是否还有出版商居住,请使用 SQL-92 右向外联接。下面是 Transact-SQL 右向外联接的查询和结果:</P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE>USE pubs<BR>SELECT a.au_fname, a.au_lname, p.pub_name<BR>FROM authors AS a RIGHT OUTER JOIN publishers AS p<BR>ON a.city = p.city<BR>ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC<P></P></PRE></TD></TR></TBODY></TABLE>
<P>下面是结果集:</P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE>au_fname au_lname pub_name <BR>Abraham Bennet Algodata Infosystems<BR>Cheryl Carson Algodata Infosystems<BR>NULL NULL Binnet & Hardley<BR>NULL NULL Five Lakes Publishing<BR>NULL NULL GGG&G<BR>NULL NULL Lucerne Publishing<BR>NULL NULL New Moon Books<BR>NULL NULL Ramona Publishers<BR>NULL NULL Scootney Books
<P>(9 row(s) affected)</P></PRE></TD></TR></TBODY></TABLE>
<P>使用谓词(如将联接与常量比较)可以进一步限制外联接。下例包含相同的右向外联接,但消除销售量低于 50 本的书籍的书名:</P>
<P>USE pubs<BR>SELECT s.stor_id, s.qty, t.title<BR>FROM sales s RIGHT OUTER JOIN titles t<BR>ON s.title_id = t.title_id<BR>AND s.qty > 50<BR>ORDER BY s.stor_id ASC</P>
<P>下面是结果集:</P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE>stor_id qty title <BR><BR>(null) (null) But Is It User Friendly? <BR>(null) (null) Computer Phobic AND Non-Phobic Individuals: Behavior <BR>Variations <BR>(null) (null) Cooking with Computers: Surreptitious Balance Sheets <BR>(null) (null) Emotional Security: A New Algorithm <BR>(null) (null) Fifty Years in Buckingham Palace Kitchens <BR>7066 75 Is Anger the Enemy? <BR>(null) (null) Life Without Fear <BR>(null) (null) Net Etiquette <BR>(null) (null) Onions, Leeks, and Garlic: Cooking Secrets of the <BR>Mediterranean <BR>(null) (null) Prolonged Data Deprivation: Four Case Studies <BR>(null) (null) Secrets of Silicon Valley <BR>(null) (null) Silicon Valley Gastronomic Treats <BR>(null) (null) Straight Talk About Computers <BR>(null) (null) Sushi, Anyone? <BR>(null) (null) The Busy Executives Database Guide <BR>(null) (null) The Gourmet Microwave <BR>(null) (null) The Psychology of Computer Cooking <BR>(null) (null) You Can Combat Computer Stress!
<P>(18 row(s) affected)</P></PRE></TD></TR></TBODY></TABLE>
<P>有关谓词的更多信息,请参见 WHERE。 </P>
<P><STRONG>使用完整外部联接</STRONG></P>
<P>若要通过在联接结果中包括不匹配的行保留不匹配信息,请使用完整外部联接。Microsoft® SQL Server™ 2000 提供完整外部联接运算符 FULL OUTER JOIN,不管另一个表是否有匹配的值,此运算符都包括两个表中的所有行。</P>
<P>假设在 city 列上联接 authors 表和 publishers 表。结果只显示在出版商所在城市居住的作者(本例中为 Abraham Bennet 和 Cheryl Carson)。SQL-92 FULL OUTER JOIN 运算符指明:不管表中是否有匹配的数据,结果将包括两个表中的所有行。</P>
<P>若要在结果中包括所有作者和出版商,而不管城市中是否有出版商或者出版商是否住在同一个城市,请使用完整外部联接。下面是 Transact-SQL 完整外部联接的查询和结果:</P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE>USE pubs<BR>SELECT a.au_fname, a.au_lname, p.pub_name<BR>FROM authors a FULL OUTER JOIN publishers p<BR>ON a.city = p.city<BR>ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC<P></P></PRE></TD></TR></TBODY></TABLE>
<P>下面是结果集:</P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>au_fname au_lname pub_name <BR>Reginald Blotchet-Halls NULL<BR>Michel DeFrance NULL<BR>Innes del Castillo NULL<BR>Ann Dull NULL<BR>Marjorie Green NULL<BR>Morningstar Greene NULL<BR>Burt Gringlesby NULL<BR>Sheryl Hunter NULL<BR>Livia Karsen NULL<BR>Charlene Locksley NULL<BR>Stearns MacFeather NULL<BR>Heather McBadden NULL<BR>Michael OLeary NULL<BR>Sylvia Panteley NULL<BR>Albert Ringer NULL<BR>Anne Ringer NULL<BR>Meander Smith NULL<BR>Dean Straight NULL<BR>Dirk Stringer NULL<BR>Johnson White NULL<BR>Akiko Yokomoto NULL<BR>Abraham Bennet Algodata Infosystems<BR>Cheryl Carson Algodata Infosystems<BR>NULL NULL Binnet & Hardley<BR>NULL NULL Five Lakes Publishing<BR>NULL NULL GGG&G<BR>NULL NULL Lucerne Publishing<BR>NULL NULL New Moon Books<BR>NULL NULL Ramona Publishers<BR>NULL NULL Scootney Books</P>
<P>(30 row(s) affected)</P></PRE></TD></TR></TBODY></TABLE>(责任编辑:<A href="mailto: mingming_ky@126.com">铭铭</A>)</td> </tr> <tr> <td class="d_font4"> </td> </tr> </table>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -