1 .WHERE子句中使用的連接語句,在數據庫語言中,被稱爲隱性連接。
INNER JOIN……ON子句產生的連接稱爲顯性連接。(其他JOIN參數也是顯性連接)WHERE 和INNER JOIN產生的連接關係,沒有本質區別,結果也一樣。但是!隱性連接隨着數據庫語言的規範和發展,已經逐漸被淘汰,比較新的數據庫語言基本上已經拋棄了隱性連接,全部採用顯性連接了。
2.一般要使得數據庫查詢語句性能好點遵循一下原則:
在做表與表的連接查詢時,大表在前,小表在後
不使用表別名,通過字段前綴區分不同表中的字段
查詢條件中的限制條件要寫在表連接條件前
儘量使用索引的字段做爲查詢條件
在 SQL-92 標準中,內聯接可在 FROM 或 WHERE 子句中指定。這是 WHERE 子句中唯一一種 SQL-92 支持的聯接類型。WHERE 子句中指定的內聯接稱爲舊式內聯接。
下面的 Transact-SQL 查詢是內聯接的一個示例:
USE pubs
SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city = p.city
ORDER BY a.au_lname DESC
此內聯接稱爲相等聯接。它返回兩個表中的所有列,但只返回在聯接列中具有相等值的行。
下面是結果集:
au_id au_lname au_fname phone address city
----------- -------- -------- ------------ --------------- --------
238-95-7766 Carson Cheryl 415 548-7723 589 Darwin Ln. Berkeley
409-56-7008 Bennet Abraham 415 658-9932 6223 Bateman St. Berkeley
state zip contract pub_id pub_name city state country
----- ----- -------- ------ --------------------- -------- ----- -------
CA 94705 1 1389 Algodata Infosystems Berkeley CA USA
CA 94705 1 1389 Algodata Infosystems Berkeley CA USA
(2 row(s) affected)
在結果集中,city 列出現兩次。由於重複相同的信息沒有意義,因此可以通過更改選擇列表消除兩個相同列中的一個。其結果稱爲自然聯接。可以重新表述前面的 Transact-SQL 查詢以形成自然聯接。例如:
USE pubs
SELECT p.pub_id, p.pub_name, p.state, a.*
FROM publishers p INNER JOIN authors a
ON p.city = a.city
ORDER BY a.au_lname ASC, a.au_fname ASC
下面是結果集:
pub_id pub_name state au_id au_lname au_fname
------ --------------- -------- ----------- -------- -------- 1389 Algodata Infosystems CA 409-56-7008 Bennet Abraham
1389 Algodata Infosystems CA 238-95-7766 Carson Cheryl
phone address city state zip contract
--------------- ------------- -------- ----- ----- ---------
415 658-9932 6223 Bateman St. Berkeley CA 94705 1
415 548-7723 589 Darwin Ln. Berkeley CA 94705 1
(2 row(s) affected)
本示例中,publishers.city 沒有出現在結果中。
使用等號以外的運算符的聯接
也可以聯接兩個不相等的列中的值。用於內聯接的運算符和謂詞同樣也可用於不相等聯接。有關聯接中可用的運算符和謂詞的更多信息,請參見在表達式中使用運算符和 WHERE。
下面的 Transact-SQL 示例是一個大於 (>) 聯接,可用於查找住在 Massachusetts 之後(按字母順序排列)的州的 New Moon 作家,Massachusetts 是 New Moon Books 的所在地。
USE pubs
SELECT p.pub_name, p.state, a.au_lname, a.au_fname, a.state
FROM publishers p INNER JOIN authors a
ON a.state > p.state
WHERE p.pub_name = 'New Moon Books'
ORDER BY au_lname ASC, au_fname ASC
下面是結果集:
pub_name state au_lname au_fname state
---------------- ------- -------------------- -------------------- -----
New Moon Books MA Blotchet-Halls Reginald OR
New Moon Books MA del Castillo Innes MI
New Moon Books MA Greene Morningstar TN
New Moon Books MA Panteley Sylvia MD
New Moon Books MA Ringer Albert UT
New Moon Books MA Ringer Anne UT
(6 row(s) affected)
使用不等運算符的聯接
很少使用不等聯接 (< >)。通常不等聯接只有與自聯接同時使用纔有意義。例如,可以使用下面的不等 Transact-SQL 聯接和自聯接查找包含不同價格的兩本或多本廉價(低於 $15)書的類別:
USE pubs
SELECT DISTINCT t1.type, t1.price
FROM titles t1 INNER JOIN titles t2
ON t1.type = t2.type
AND t1.price <> t2.price
WHERE t1.price < $15 AND t2.price < $15
說明 表達式 NOT column_name = column_name 與表達式 column_name < > column_name 等效。
下面的 Transact-SQL 示例中,使用不等聯接和自聯接的組合查找 titleauthor 表中的所有行,在該表中有兩行或多行具有相同的 title_id 但 au_id 號不同(即一本書有多個作者):
USE pubs
SELECT DISTINCT t1.au_id, t1.title_id
FROM titleauthor t1 INNER JOIN titleauthor t2
ON t1.title_id = t2.title_id
WHERE t1.au_id <> t2.au_id
ORDER BY t1.au_id
下面是結果集:
au_id title_id
----------- --------
213-46-8915 BU1032
267-41-2394 BU1111
267-41-2394 TC7777
409-56-7008 BU1032
427-17-2319 PC8888
472-27-2349 TC7777
672-71-3249 TC7777
722-51-5454 MC3021
724-80-9391 BU1111
724-80-9391 PS1372
756-30-7391 PS1372
846-92-7186 PC8888
899-46-2035 MC3021
899-46-2035 PS2091
998-72-3567 PS2091