指定在 DELETE、SELECT 和 UPDATE 語句中使用的表、視圖、派生表和連接表。
[ FROM { < table_source > } [ ,...n ] ]
< table_source > ::=
table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]
| view_name [ [ AS ] table_alias ] [ WITH ( < view_hint > [ ,...n ] ) ]
| rowset_function [ [ AS ] table_alias ]
| user_defined_function [ [ AS ] table_alias ]
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
| < joined_table >
< joined_table > ::=
< table_source > < join_type > < table_source > ON < search_condition >
| < table_source > CROSS JOIN < table_source >
| [ ( ] < joined_table > [ ) ]
< join_type > ::=
[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]
[ < join_hint > ]
JOIN
< table_source >
指定要在 Transact-SQL 語句中使用的表或視圖(帶或不帶別名均可)。可在語句中使用多達(dá) 256 個表??蓪?table 變量指定為表源。
如果表或視圖存在于同一臺運(yùn)行 Microsoft® SQL Server™ 的計算機(jī)的其它數(shù)據(jù)庫中,應(yīng)按格式 database.owner.object_name 使用完全合法的名稱。如果表或視圖存在于本地服務(wù)器之外的一臺鏈接的服務(wù)器上,應(yīng)按以下格式使用由四部分組成的名稱:linked_server.catalog.schema.object。如果由四部分構(gòu)造的表(或視圖)名稱使用 OPENDATASOURCE 函數(shù)作為名稱中的服務(wù)器部分,則該名稱也可用于指定表源。有關(guān)該函數(shù)的更多信息,請參見 OPENDATASOURCE。
table_name
表名。FROM 關(guān)鍵字之后的表和視圖的順序并不影響返回的結(jié)果集。當(dāng) FROM 子句中出現(xiàn)重復(fù)名稱時將報告錯誤。
[AS] table_alias
table_name、view_name 或 rowset_function 的別名,為方便起見而使用,或用于區(qū)分自聯(lián)接或子查詢中的表或視圖。別名通常是一個縮短了的表名,用于在聯(lián)接中引用表中的特定列。如果聯(lián)接中的多個表中有相同名稱的列存在,SQL Server 要求必須使用表名或別名來限定列名。(如果定義了別名則不能使用表名)。
WITH ( < table_hint > )
指定表掃描、查詢優(yōu)化器要使用的一個或多個索引或查詢優(yōu)化器要對此表、此語句使用的鎖定方法。有關(guān)更多信息,請參見"表提示"。
view_name
是視圖名稱。視圖是一個"虛擬表",通常創(chuàng)建為一個或多個表中列的子集。
WITH ( < view_hint > )
指定索引視圖掃描。默認(rèn)情況下,視圖在查詢優(yōu)化器處理查詢之前展開。視圖提示只能用在 SELECT 語句中,而不能用于 UPDATE、DELETE 或 INSERT 語句。
rowset_function
指定一個行集函數(shù),該函數(shù)返回可替代表引用的對象。有關(guān)行集函數(shù)列表的更多信息,請參見行集函數(shù)。
user_defined_function
指定用戶定義的函數(shù),該函數(shù)返回一個表。如果用戶定義的函數(shù)是一個內(nèi)置的用戶定義函數(shù),則前面必須加兩個冒號,如:
FROM ::fn_listextendedproperty
derived_table
是從數(shù)據(jù)庫中檢索行的子查詢。derived_table 用作對外部查詢的輸入。
column_alias
替換結(jié)果集內(nèi)列名的可選別名。在選擇列表中放入每個列的一個別名,并將整個列別名列表用圓括號括起來。
<joined_table>
由兩個或更多表的積組成的結(jié)果集,例如:
SELECT *
FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3
RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4
ON tab3.c1 = tab4.c1
ON tab2.c3 = tab4.c3
對于多個 CROSS 聯(lián)接,請使用圓括號來更改聯(lián)接的自然順序。
<join_type>
指定聯(lián)接操作的類型。
INNER
指定返回每對匹配的行。廢棄兩個表中不匹配的行。如果未指定聯(lián)接類型,則這是默認(rèn)設(shè)置。
FULL [OUTER]
指定在結(jié)果集中包含左表或右表中不滿足聯(lián)接條件的行,并將對應(yīng)于另一個表的輸出列設(shè)為 NULL。這是對通常由 INNER JOIN 返回的所有行的補(bǔ)充。
說明 按此處指定的方法指定外聯(lián)接或在 WHERE 子句中使用舊式非標(biāo)準(zhǔn)的 *= 和 =* 運(yùn)算符都是可行的。不能在同一語句中同時使用這兩種方法。
LEFT [OUTER]
指定在結(jié)果集中包含左表中所有不滿足聯(lián)接條件的行,且在由內(nèi)聯(lián)接返回所有的行之外,將另外一個表的輸出列設(shè)為 NULL。
RIGHT [OUTER]
指定在結(jié)果集中包含右表中所有不滿足聯(lián)接條件的行,且在由內(nèi)聯(lián)接返回的所有行之外,將與另外一個表對應(yīng)的輸出列設(shè)為 NULL。
<join_hint>
指定 SQL Server 查詢優(yōu)化器為在查詢的 FROM 子句中指定的每個聯(lián)接使用一個聯(lián)接提示或執(zhí)行算法。有關(guān)更多信息,請參見本主題下面的"聯(lián)接提示"。
JOIN
指明所指定的聯(lián)接操作應(yīng)在給定的表或視圖之間執(zhí)行。
ON <search_condition>
指定聯(lián)接所基于的條件。盡管經(jīng)常使用列和比較運(yùn)算符,但此條件可指定任何謂詞,例如:
SELECT ProductID, Suppliers.SupplierID
FROM Suppliers JOIN Products
ON (Suppliers.SupplierID = Products.SupplierID)
當(dāng)條件指定列時,列不一定必須具有相同的名稱或數(shù)據(jù)類型;但是,如果數(shù)據(jù)類型不一致,則這些列要么必須相互兼容,要么是 Microsoft® SQL Server™ 能夠隱性轉(zhuǎn)換的類型。如果數(shù)據(jù)類型不能隱式轉(zhuǎn)換,則條件必須使用 CAST 函數(shù)顯式轉(zhuǎn)換數(shù)據(jù)類型。
在 ON 子句中可能有僅涉及一個聯(lián)接表的謂詞。這樣的謂詞也可能出現(xiàn)在查詢中的 WHERE 子句中。盡管這種謂詞的放置在 INNER 聯(lián)接中不會產(chǎn)生差別,但是在涉及 OUTER 聯(lián)接時可能會導(dǎo)致不同的結(jié)果。這是因?yàn)?ON 子句中的謂詞在應(yīng)用于聯(lián)接之前先應(yīng)用于表,而 WHERE 子句在語意上應(yīng)用于聯(lián)接結(jié)果。
有關(guān)搜索條件和謂詞的更多信息,請參見搜索條件。
CROSS JOIN
指定兩個表的矢量積。這將返回相同的行,就好像在舊式的非 SQL-92 式聯(lián)接中并沒有指定 WHERE 子句。
表提示指定一個表掃描、查詢優(yōu)化器要使用的一個或多個索引或查詢優(yōu)化器要在該表中為該 SELECT 語句使用的鎖定方法。雖然這是一個選項(xiàng),但查詢優(yōu)化器通常無須指定提示就能夠選擇最佳優(yōu)化方法。
注意 因?yàn)?SQL Server 查詢優(yōu)化器通常為查詢選擇最優(yōu)執(zhí)行計劃,所以建議只將 <join_hint>、<query_hint>、<table_hint> 和 <view_hint> 作為經(jīng)驗(yàn)豐富的開發(fā)人員和數(shù)據(jù)庫管理員的最終手段。
如果查詢計劃不訪問表,則忽略表提示。這可能是優(yōu)化器作出完全不訪問該表的選擇的結(jié)果,或改為訪問索引視圖。在后一種情況中,使用 OPTION (EXPAND VIEWS) 查詢提示可阻止使用索引視圖。
鼓勵在表提示之間使用逗號,盡管這是可選的。向后兼容性支持使用空格而不是逗號分隔提示。
鼓勵使用 WITH 關(guān)鍵字,盡管目前這還不是必須。在將來的 SQL Server 版本中,WITH 可能會成為必需的關(guān)鍵字。
在 SQL Server 2000 中,所有的鎖提示都傳播給視圖中引用的所有基表和視圖。另外,SQL Server 執(zhí)行相應(yīng)的鎖一致性檢查。
如果表(包括系統(tǒng)表)中包含計算列,而這些計算列由訪問其它表中的列的表達(dá)式或函數(shù)計算而得,則不在那些表上使用表提示(不傳播表提示)。例如,在查詢中的表上指定 NOLOCK 表提示。該表包含由訪問另一表中的列的表達(dá)式和函數(shù)組合計算到的計算列。這些由表達(dá)式和函數(shù)引用的表在被訪問時并不使用 NOLOCK 表提示。
對于 FROM 子句中的每個表,SQL Server 不允許有來自下列各組的多個表提示:
NOLOCK、READUNCOMMITTED 和 READPAST 表提示不能用于將進(jìn)行刪除、插入或更新操作的表。
< table_hint > ::=
{ INDEX ( index_val [ ,...n ] )
| FASTFIRSTROW
| HOLDLOCK
| NOLOCK
| PAGLOCK
| READCOMMITTED
| READPAST
| READUNCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
| XLOCK
}
INDEX ( index_val [ ,...n ] )
指定 SQL Server 在處理語句時使用的索引的名稱或 ID。只能為每個表指定一個索引提示。
如果存在聚集索引,則 INDEX(0) 強(qiáng)制聚集索引掃描,而 INDEX(1) 強(qiáng)制聚集索引掃描或查找。如果不存在聚集索引,則 INDEX(0) 強(qiáng)制表掃描,而 INDEX(1) 則被解釋為錯誤。
選擇性的 INDEX = 語法(用于指定單一索引提示)只受向后兼容性的支持。
如果在單一提示列表中使用了多個索引,則將忽略重復(fù)項(xiàng),所列出的其余索引將用于檢索表中的行。索引提示中的索引順序很重要。多索引提示還強(qiáng)制索引 ANDing,且 SQL Server 在所訪問的每個索引上應(yīng)用盡可能多的條件。如果帶提示的索引集合不是覆蓋性的,則在檢索全部索引列后執(zhí)行一次提取操作。
說明 如果在
表提示中的最大索引數(shù)為 250 個非聚集索引。
FASTFIRSTROW
等同于 OPTION (FAST 1)。有關(guān)更多信息,請參見 SELECT 中 OPTION 子句的 FAST。
HOLDLOCK
等同于 SERIALIZABLE。(有關(guān)更多信息,請參見本主題下面的 SERIALIZABLE。)HOLDLOCK 選項(xiàng)僅適用于指定了該選項(xiàng)的表或視圖,且僅限于由它所在語句所定義的事務(wù)的時間段內(nèi)。HOLDLOCK 不能用于包括 FOR BROWSE 選項(xiàng)的 SELECT 語句。
NOLOCK
等同于 READUNCOMMITTED。有關(guān)更多信息,請參見本主題后面的 READUNCOMMITTED。
PAGLOCK
在通常采取單個共享表鎖的地方采取共享頁鎖。
READCOMMITTED
指定用與運(yùn)行在 READ COMMITTED 隔離級別的事務(wù)相同的鎖定語義執(zhí)行掃描。有關(guān)隔離級別的更多信息,請參見 SET TRANSACTION ISOLATION LEVEL。
READPAST
指定跳過(越過讀?。╂i定的行。例如,假設(shè)表 T1 包含單個整數(shù)列,其值為 1、2、3、4 和 5。如果事務(wù) A 將值 3 更改為 8,但尚未提交,則 SELECT * FROM T1 (READPAST) 將生成值 1、2、4 和 5。READPAST 僅適用于在 READ COMMITTED 隔離級別操作的事務(wù),且只越過讀取行級鎖。該鎖提示主要用于在 SQL Server 表中實(shí)現(xiàn)工作隊列。
READUNCOMMITTED
指定允許臟讀。這表示不發(fā)放共享鎖,也不遵守排它鎖。允許臟讀會導(dǎo)致更高的并發(fā)性,但會降低一致性。如果指定了 READUNCOMMITTED,就有可能讀取未提交的事務(wù),或讀取在讀取過程中回滾的一套頁,因此可能出現(xiàn)錯誤信息。有關(guān)隔離級別的更多信息,請參見 SET TRANSACTION ISOLATION LEVEL。
說明 如果在指定了 READUNCOMMITTED 的情況下收到 601 號錯誤信息,則按解決死鎖錯誤 (1205) 的方法解決該錯誤,然后重試執(zhí)行語句。
REPEATABLEREAD
指定用與運(yùn)行在 REPEATABLE READ 隔離級別的事務(wù)相同的鎖定語義執(zhí)行掃描。有關(guān)隔離級別的更多信息,請參見 SET TRANSACTION ISOLATION LEVEL。
ROWLOCK
指定在通常采取單個共享頁或表鎖的情形下采取共享行鎖。
SERIALIZABLE
等同于 HOLDLOCK。通過將共享鎖保持到事務(wù)完成,使之更具有約束性(而不要不管事務(wù)是否完成,都在不再需要所需的表或數(shù)據(jù)頁時就立即釋放共享鎖)。用與運(yùn)行在 SERIALIZABLE 隔離級別的事務(wù)相同的語義執(zhí)行掃描。有關(guān)隔離級別的更多信息,請參見 SET TRANSACTION ISOLATION LEVEL。
TABLOCK
指定在表上采取的共享鎖一直保持到語句結(jié)束。如果同時指定 HOLDLOCK,那么在事務(wù)結(jié)束之前該共享表鎖將一直保持。
TABLOCKX
指定在表上采取的排它鎖一直保持到語句結(jié)束或事務(wù)結(jié)束。
UPDLOCK
指定讀取表時采取更新鎖而不是共享鎖,且將這些更新鎖保持到語句結(jié)束或事務(wù)結(jié)束。
XLOCK
指定應(yīng)采取排它鎖,且保持到由語句所處理的全部數(shù)據(jù)上的事務(wù)結(jié)束。如果與 PAGLOCK 或 TABLOCK 一同指定,則排它鎖適用于適當(dāng)?shù)牧6燃墑e。
視圖提示只能用于索引視圖。(索引視圖是創(chuàng)建了唯一聚集索引的視圖。)如果查詢包含對同時存在于索引視圖和基表中的列的引用,且 Microsoft SQL Server™ 查詢優(yōu)化器決定執(zhí)行查詢的最好方法是使用索引視圖,則優(yōu)化器使用視圖上的索引。該功能僅在 Microsoft SQL Server 2000 企業(yè)版和開發(fā)版上受支持。
但是,為了讓優(yōu)化器權(quán)衡各種索引視圖,必須將下列 SET 選項(xiàng)設(shè)為 ON:
ANSI_NULLS | ANSI_WARNINGS | CONCAT_NULL_YIELDS_NULL |
ANSI_PADDING | ARITHABORT | QUOTED_IDENTIFIERS |
此外,NUMERIC_ROUNDABORT 選項(xiàng)必須設(shè)為 OFF。
若要強(qiáng)制優(yōu)化器對索引視圖使用索引,請指定 NOEXPAND 選項(xiàng)??赡軆H當(dāng)在查詢中也命名視圖時才能使用該提示。對于不直接在 FROM 子句中命名視圖的查詢,SQL Server 2000 不提供強(qiáng)制在這類查詢中使用特定索引視圖的提示;然而,即使在查詢中不直接引用索引視圖,查詢優(yōu)化器也會考慮使用索引視圖。
視圖提示僅允許用于 SELECT 語句,而不能用于在 INSERT、UPDATE 和 DELETE 語句中作為表源的視圖中。
< view_hint > ::=
{ NOEXPAND [ , INDEX ( index_val [ ,...n ] ) ] }
NOEXPAND
指定當(dāng)查詢優(yōu)化器處理查詢時不擴(kuò)展索引視圖。查詢優(yōu)化器將視圖作為具有聚集索引的表。
INDEX ( index_val [ ,...n ] )
指定 SQL Server 在處理語句時要使用的索引名稱或 ID。只能為一個視圖指定一個索引提示。
INDEX(0) 強(qiáng)制執(zhí)行聚集索引掃描,而 INDEX(1) 強(qiáng)制執(zhí)行聚集索引掃描或查找。
如果在單個提示列表中使用了多個索引,將忽略重復(fù)項(xiàng),其余列出的索引將用于檢索索引視圖的行。索引提示中的索引順序很重要。多索引提示還強(qiáng)制索引 ANDing,且 SQL Server 在所訪問的每個索引上應(yīng)用盡可能多的條件。如果帶提示的索引的集合并不包含查詢中所引用的全部列,則在檢索全部索引列后執(zhí)行一次提取操作。
聯(lián)接提示在查詢的 FROM 子句中指定,可在兩個表之間強(qiáng)制聯(lián)接策略。如果為任意兩個表指定了聯(lián)接提示,查詢優(yōu)化器會根據(jù) ON 關(guān)鍵字的位置,自動為查詢中所有聯(lián)接的表強(qiáng)制聯(lián)接順序。在 CROSS JOINS 的情況下,如果沒有使用 ON 子句,可使用括號指明聯(lián)接順序。
注意 SQL Server 查詢優(yōu)化器通常為查詢選擇最優(yōu)執(zhí)行計劃,所以建議只把 <join_hint>、<query_hint> 和 <table_hint> 作為經(jīng)驗(yàn)豐富的數(shù)據(jù)庫管理員的最終手段。
< join_hint > ::=
{ LOOP | HASH | MERGE | REMOTE }
LOOP | HASH | MERGE
指定查詢中的聯(lián)接應(yīng)使用循環(huán)、哈?;蚝喜ⅰJ褂?LOOP | HASH | MERGE JOIN 將在兩個表之間強(qiáng)制一個特定聯(lián)接。
REMOTE
指定聯(lián)接操作在右表處執(zhí)行。這在左表是本地表而右表是遠(yuǎn)程表的情況下很有用。只在左表的行數(shù)少于右表行數(shù)時才能使用 REMOTE。
如果右表為本地表,則聯(lián)接在本地執(zhí)行。如果兩個表均為遠(yuǎn)程表但來自不同的數(shù)據(jù)源,REMOTE 將使聯(lián)接在右表處執(zhí)行。如果兩個表均為遠(yuǎn)程表且來自相同數(shù)據(jù)源,則不必使用 REMOTE。
當(dāng)使用 COLLATE 子句將聯(lián)接謂詞中正進(jìn)行比較的一個值投影到不同的排序規(guī)則時,不能使用 REMOTE。
REMOTE 只可用于 INNER JOIN 操作。
FROM 子句支持用于聯(lián)接表和派生表的 SQL-92-SQL 語法。SQL-92 語法提供 INNER、LEFT OUTER、RIGHT OUTER、FULL OUTER 和 CROSS 聯(lián)接運(yùn)算符。
雖然可以支持 SQL Server 較早版本中的外聯(lián)接運(yùn)算符,但不能在同一個 FROM 子句中同時使用外聯(lián)接運(yùn)算符和 SQL-92 樣式的聯(lián)接表。
FROM 子句內(nèi)的 UNION 和 JOIN 在視圖、派生表和子查詢中均受支持。
自聯(lián)接是與自身聯(lián)接的表。基于自聯(lián)接的插入和更新遵循 FROM 子句中的順序。
因?yàn)?Microsoft SQL Server™ 2000 會考慮來自提供列分發(fā)統(tǒng)計信息的鏈接服務(wù)器上的分發(fā)及基數(shù)統(tǒng)計信息,所以,不一定非得需要 REMOTE 聯(lián)接提示來強(qiáng)制遠(yuǎn)程評估聯(lián)接。SQL Server 查詢處理器將考慮遠(yuǎn)程統(tǒng)計信息并確定遠(yuǎn)程聯(lián)接策略是否適當(dāng)。REMOTE 聯(lián)接提示對不提供列分發(fā)統(tǒng)計信息的提供程序非常有用。有關(guān)更多信息,請參見 OLE DB 提供程序的分布統(tǒng)計要求。
FROM 的權(quán)限默認(rèn)為 DELETE、SELECT 或 UPDATE 語句的權(quán)限。
此示例從 publishers 表中檢索 pub_id 和 pub_name 列。
USE pubs
SELECT pub_id, pub_name
FROM publishers
ORDER BY pub_id
下面是結(jié)果集:
pub_id pub_name
------ ---------------------
0736 New Moon Books
0877 Binnet & Hardley
1389 Algodata Infosystems
1622 Five Lakes Publishing
1756 Ramona Publishers
9901 GGG&G
9952 Scootney Books
9999 Lucerne Publishing
(8 row(s) affected)
下面的部分事務(wù)顯示了如何在 authors 上放置一個顯式共享表鎖,以及如何讀取索引。該鎖在整個事務(wù)中均保持。
USE pubs
BEGIN TRAN
SELECT COUNT(*)
FROM authors WITH (TABLOCK, HOLDLOCK)
此示例返回 authors 和 publishers 兩個表的矢量積。所返回的列表包含 au_lname 行和所有 pub_name 行的所有可能的組合。
USE pubs
SELECT au_lname, pub_name
FROM authors CROSS JOIN publishers
ORDER BY au_lname ASC, pub_name ASC
下面是結(jié)果集:
au_lname pub_name
---------------------------------------- -------------------------------
Bennet Algodata Infosystems
Bennet Binnet & Hardley
Bennet Five Lakes Publishing
Bennet GGG&G
Bennet Lucerne Publishing
Bennet New Moon Books
Bennet Ramona Publishers
Bennet Scootney Books
Blotchet-Halls Algodata Infosystems
Blotchet-Halls Binnet & Hardley
Blotchet-Halls Five Lakes Publishing
Blotchet-Halls GGG&G
Blotchet-Halls Lucerne Publishing
Blotchet-Halls New Moon Books
Blotchet-Halls Ramona Publishers
Blotchet-Halls Scootney Books
Carson Algodata Infosystems
Carson Binnet & Hardley
Carson Five Lakes Publishing
...
Stringer Scootney Books
White Algodata Infosystems
White Binnet & Hardley
White Five Lakes Publishing
White GGG&G
White Lucerne Publishing
White New Moon Books
White Ramona Publishers
White Scootney Books
Yokomoto Algodata Infosystems
Yokomoto Binnet & Hardley
Yokomoto Five Lakes Publishing
Yokomoto GGG&G
Yokomoto Lucerne Publishing
Yokomoto New Moon Books
Yokomoto Ramona Publishers
Yokomoto Scootney Books
(184 row(s) affected)
此示例返回 titles 表中的書籍標(biāo)題及對應(yīng)的出版商。還返回未出版列在 titles 表中的書籍的出版商,以及不是由 publishers 表中所列的出版商出版的所有書籍標(biāo)題。
USE pubs
-- The OUTER keyword following the FULL keyword is optional.
SELECT SUBSTRING(titles.title, 1, 10) AS Title,
publishers.pub_name AS Publisher
FROM publishers FULL OUTER JOIN titles
ON titles.pub_id = publishers.pub_id
WHERE titles.pub_id IS NULL
OR publishers.pub_id IS NULL
ORDER BY publishers.pub_name
下面是結(jié)果集:
Title Publisher
---------- ----------------------------------------
NULL Five Lakes Publishing
NULL GGG&G
NULL Lucerne Publishing
NULL Ramona Publishers
NULL Scootney Books
(5 row(s) affected)
此示例在 au_id 上聯(lián)接兩個表,并保留左表中沒有匹配項(xiàng)的行。authors 表與 titleauthor 表在各表的 au_id 列上相匹配。無論作品出版或未出版,所有作者均出現(xiàn)在結(jié)果集中。
USE pubs
-- The OUTER keyword following the LEFT keyword is optional.
SELECT SUBSTRING(authors.au_lname, 1, 10) AS Last,
authors.au_fname AS First, titleauthor.title_id
FROM authors LEFT OUTER JOIN titleauthor
ON authors.au_id = titleauthor.au_id
下面是結(jié)果集:
Last First title_id
---------- -------------------- --------
White Johnson PS3333
Green Marjorie BU1032
Green Marjorie BU2075
Carson Cheryl PC1035
... ...
McBadden Heather NULL
Ringer Anne PS2091
Ringer Albert PS2091
Ringer Albert PS2106
(29 row(s) affected)
此示例返回所有出版商名稱以及相應(yīng)的所出版的書籍標(biāo)題。
USE pubs
-- By default, SQL Server performs an INNER JOIN if only the JOIN
-- keyword is specified.
SELECT SUBSTRING(titles.title, 1, 30) AS Title, publishers.pub_name
FROM publishers INNER JOIN titles
ON titles.pub_id = publishers.pub_id
ORDER BY publishers.pub_name
下面是結(jié)果集:
Title pub_name
------------------------------ ----------------------------------------
The Busy Executive's Database Algodata Infosystems
Cooking with Computers: Surrep Algodata Infosystems
Straight Talk About Computers Algodata Infosystems
But Is It User Friendly? Algodata Infosystems
Secrets of Silicon Valley Algodata Infosystems
Net Etiquette Algodata Infosystems
Silicon Valley Gastronomic Tre Binnet & Hardley
The Gourmet Microwave Binnet & Hardley
The Psychology of Computer Coo Binnet & Hardley
Computer Phobic AND Non-Phobic Binnet & Hardley
Onions, Leeks, and Garlic: Coo Binnet & Hardley
Fifty Years in Buckingham Pala Binnet & Hardley
Sushi, Anyone? Binnet & Hardley
You Can Combat Computer Stress New Moon Books
Is Anger the Enemy? New Moon Books
Life Without Fear New Moon Books
Prolonged Data Deprivation: Fo New Moon Books
Emotional Security: A New Algo New Moon Books
(18 row(s) affected)
此示例在 pub_id 上聯(lián)接兩個表,并保留右表中沒有匹配項(xiàng)的行。publishers 表與 titles 表在各表的 pub_id 上相匹配。無論是否已出版書籍,所有出版商均出現(xiàn)在結(jié)果集中。
USE pubs
SELECT SUBSTRING(titles.title, 1, 30) AS 'Title', publishers.pub_name
FROM titles RIGHT OUTER JOIN publishers
ON titles.pub_id = publishers.pub_id
ORDER BY publishers.pub_name
下面是結(jié)果集:
Title pub_name
------------------------------ ----------------------------------------
The Busy Executive's Database Algodata Infosystems
Cooking with Computers: Surrep Algodata Infosystems
Straight Talk About Computers Algodata Infosystems
But Is It User Friendly? Algodata Infosystems
Secrets of Silicon Valley Algodata Infosystems
Net Etiquette Algodata Infosystems
Silicon Valley Gastronomic Tre Binnet & Hardley
The Gourmet Microwave Binnet & Hardley
The Psychology of Computer Coo Binnet & Hardley
Computer Phobic AND Non-Phobic Binnet & Hardley
Onions, Leeks, and Garlic: Coo Binnet & Hardley
Fifty Years in Buckingham Pala Binnet & Hardley
Sushi, Anyone? Binnet & Hardley
NULL Five Lakes Publishing
NULL GGG&G
NULL Lucerne Publishing
You Can Combat Computer Stress New Moon Books
Is Anger the Enemy? New Moon Books
Life Without Fear New Moon Books
Prolonged Data Deprivation: Fo New Moon Books
Emotional Security: A New Algo New Moon Books
NULL Ramona Publishers
NULL Scootney Books
(23 row(s) affected)
此示例在 authors、titleauthors 和 titles 表之間建立三表聯(lián)接,以生成一個作者及其著作的列表。查詢優(yōu)化器使用 MERGE 聯(lián)接將 authors 和 titleauthors (A x TA) 聯(lián)接在一起。然后,將 authors 和 titleauthors MERGE 聯(lián)接 (A x TA) 的結(jié)果與 titles 表進(jìn)行 HASH 聯(lián)結(jié)以生成 (A x TA) x T。
重要 指定聯(lián)接提示后,要執(zhí)行 INNER JOIN 時 INNER 關(guān)鍵字不再為可選,而必須顯式說明。
USE pubs
SELECT SUBSTRING((RTRIM(a.au_fname) + ' ' + LTRIM(a.au_lname)), 1, 25)
AS Name, SUBSTRING(t.title, 1, 20) AS Title
FROM authors a INNER MERGE JOIN titleauthor ta
ON a.au_id = ta.au_id INNER HASH JOIN titles t
ON t.title_id = ta.title_id
ORDER BY au_lname ASC, au_fname ASC
下面是結(jié)果集:
Warning: The join order has been enforced because a local join hint is used.
Name Title
------------------------- --------------------
Abraham Bennet The Busy Executive's
Reginald Blotchet-Halls Fifty Years in Bucki
Cheryl Carson But Is It User Frien
Michel DeFrance The Gourmet Microwav
Innes del Castillo Silicon Valley Gastr
... ...
Johnson White Prolonged Data Depri
Akiko Yokomoto Sushi, Anyone?
(25 row(s) affected)
此示例使用派生表和緊跟 FROM 子句的 SELECT 語句,返回所有作者的姓名以及所著書的標(biāo)題的書號。
USE pubs
SELECT RTRIM(a.au_fname) + ' ' + LTRIM(a.au_lname) AS Name, d1.title_id
FROM authors a, (SELECT title_id, au_id FROM titleauthor) AS d1
WHERE a.au_id = d1.au_id
ORDER BY a.au_lname, a.au_fname
下面是結(jié)果集:
Name title_id相關(guān)文章
------------------------------------------------------------- --------
Abraham Bennet BU1032
Reginald Blotchet-Halls TC4203
Cheryl Carson PC1035
Michel DeFrance MC3021
Innes del Castillo MC2222
Ann Dull PC8888
Marjorie Green BU1032
Marjorie Green BU2075
Burt Gringlesby TC7777
Sheryl Hunter PC8888
Livia Karsen PS1372
Charlene Locksley PC9999
Charlene Locksley PS7777
Stearns MacFeather BU1111
Stearns MacFeather PS1372
Michael O'Leary BU1111
Michael O'Leary TC7777
Sylvia Panteley TC3218
Albert Ringer PS2091
Albert Ringer PS2106
Anne Ringer MC3021
Anne Ringer PS2091
Dean Straight BU7832
Johnson White PS3333
Akiko Yokomoto TC7777
(25 row(s) affected)