inner join和where區別

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

 

 

發佈了53 篇原創文章 · 獲贊 11 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章