1. 程式人生 > >SQL連線查詢總結和練習

SQL連線查詢總結和練習

    通過連線運算子可以實現多個表查詢。連線是關係資料庫模型的主要特點,是它區別於其它型別 資料庫管理系統的一個標誌。連線可以在SELECT 語句的FROM子句或WHERE子句中建立,在FROM子句中指出連線時有助於將連線操作與WHERE子句中的搜尋條件區分開來。一般來說,連線查詢比巢狀查詢的效率高一點。所以,在Transact-SQL中推薦使用這種方法。
   SQL-92標準所定義的FROM子句的連線語法格式為:
     FROM join_table join_type join_table [ON (join_condition)]
  其中join_table指出參與連線操作的表名,連線可以對同一個表操作,也可以對多表操作,對同一 個表操作的連線又稱做自連線。
join_type 指出連線型別,可分為內連線和外連線。練習資料表:表一:press(出版社) 表二:authors(作者)

一、內連線(INNER JOIN)

內連線是應用程式中用的普遍的"連線"操作,它一般都是預設連線型別。內連線基於連線謂詞將兩張表(如 A 和 B)的列組合在一起,產生新的結果表。查詢會將 A 表的每一行和 B 表的每一行進行比較,並找出滿足連線謂詞的組合。當連線謂詞被滿足,A 和 B 中匹配的行會按列組合(並排組合)成結果集中的一行。連線產生的結果集,可以定義為首先對兩張表做笛卡爾積(交叉連線) -- 將 A 中的每一行和 B 中的每一行組合,然後返回滿足連線謂詞的記錄。實際上 SQL 產品會盡可能用其他方式去實現連線,笛卡爾積運算是非常沒效率的.
內連線查詢操作列出與連線條件匹配的資料行,它使用比較運算子比較被連線列的列值。內連線分三種:

  1、相等連線

1)等值連線

表之間的連線是通過相等的欄位值連線起來的查詢稱為等值連線查詢。在連線條件中使用等於號(=)運算子比較被連線列的列值,其查詢結果中列出被連線表中的所有列,包括其中的重複列。特別注意連線依據的列可能包含 NULL 值,NULL 值不與任何值匹配(甚至和它本身)例如:列出authors和press表中位於同一城市的作者和出版社    SELECT * FROM press AS p INNER JOIN authors AS a ON p.city=a.city     等價於:SELECT
 * FROM press AS p ,authors AS a WHERE p.city=a.city
    查詢結果:

2)非等值連線

在等值查詢的連線條件中不使用等號,而使用其它比較運算子就構成了非等值連線查詢。可以使用的比較運算子有:> 、>、=、 <、 <=、 !=, 還可以使用BETWEEN…AND 之類的謂詞。    例如:SELECT * FROM press AS p INNER JOIN authors AS a ON p.id > a.press_id      查詢結果:

2、自然連線

自然連線(Natural join)是一種特殊的等值連線,它要求兩個關係中進行比較的分量必須是相同的屬性組,兩表中的所有名稱相同的列都將被比較,並且在結果中把重複的屬性列去掉,結果表中兩表中名稱相同的列只出現一次.。而等值連線並不去掉重複的屬性列。(sqlserver 不支援 自然連線)例如:SELECT * FROM authors  NATRUAL JOIN press查詢結果與等值連線一樣,只是去掉了重複的id那一列。

3、交叉連線

    交叉連線(cross join),又稱笛卡爾連線(cartesian join)或叉乘(Product),它是所有型別的內連線的基礎。把表視為行記錄的集合,交叉連線即返回這兩個集合的笛卡爾積返回到結果集合中的資料行數等於第一個表中符合查詢條件的資料行數乘以第二個表中符合查詢條件的資料行數。這其實等價於內連線的連結條件為"永真",或連線條件不存在.。

如果 A 和 B 是兩個集合,它們的交叉連線就記為: A × B.

    例如: SELECT * FROM press CROSS JOIN authors   

等價於:SELECT * FROM press,authors 

        查詢結果:

    

二、外連線

外連線並不要求連線的兩表的每一條記錄在對方表中都一條匹配的記錄. 連線表保留所有記錄 -- 甚至這條記錄沒有匹配的記錄也要保留. 外連線可依據連線表保留左表, 右表或全部表的行而進一步分為左外連線, 右外連線和全連線.在標準的 SQL 語言中, 外連線沒有隱式的連線符號.

1、左外連線

左外連線會返回左表的所有記錄和右表中匹配記錄的組合(如果右表中無匹配記錄, 來自於右表的所有列的值設為 NULL). 如果左表的一行在右表中存在多個匹配行, 那麼左表的行會複製和右表匹配行一樣的數量, 並進行組合生成連線結果.

    例如:SELECT *  FROM   press LEFT OUTER JOIN authors ON press.id = authors.press_id
    查詢結果:

2、右外連線

右外連線, 亦簡稱右連線, 它與左外連線完全類似, 只不過是作連線的表的順序相反而已.右連線操作返回右表的所有行和這些行在左表中匹配的行(沒有匹配的, 來源於左表的列值設為 NULL).
    例如:SELECT * FROM press RIGHT OUTER JOIN authors ON press.id= authors.press_id
        等價於:SELECT * FROM authors LEFT OUTER JOIN press ON press.id= authors.press_id
        查詢結果:
實際上顯式的右連線很少使用, 因為它總是可以被替換成左連線--換換表的位置就可以了,所以上面兩條語句是等價的。

3、全連線

全連線是左右外連線的並集. 連線表包含被連線的表的所有記錄, 如果缺少匹配的記錄, 即以 NULL 填充.。一些資料庫系統(如 MySQL)並不直接支援全連線, 但它們可以通過左右外連線的並集(參: union)來模擬實現
    例如:SELECT * FROM   press FULL OUTER JOIN authors ON press.id= authors.press_id
     查詢結果:

三、自連線

自身連線是指同一個表自己與自己進行連線。既可以用內連線,也可以用外連線。
 例如:SELECT * FROM   authors a1 LEFT JOIN authors a2 ON a2.press_id = a1.id
       查詢結果:
參考連結:http://www.cnblogs.com/worksguo/articles/1030214.html
	http://zh.wikipedia.org/wiki/連線_(SQL)