鏈接查詢 經過鏈接運算符能夠實現多個表查詢。鏈接是關係數據庫模型的主要特色,也是它區別於其它類型數據庫管理系統的一個標誌。 在關係數據庫管理系統中,表創建時各數據之間的關係沒必要肯定,常把一個實體的全部信息存放在一個表中。當檢索數據時,經過鏈接操做查詢出存放在多個表中的 不一樣實體的信息。鏈接操做給用戶帶來很大的靈活性,他們能夠在任什麼時候候增長新的數據類型。爲不一樣實體建立新的表,爾後經過鏈接進行查詢。 鏈接能夠在SELECT 語句的FROM子句或WHERE子句中創建,似是而非在FROM子句中指出鏈接時有助於將鏈接操做與WHERE子句中的搜索條件區分開來。因此,在Transact-SQL中推薦使用這種方法。 SQL-92標準所定義的FROM子句的鏈接語法格式爲: FROM join_table join_type join_table [ON (join_condition)] 其中join_table指出參與鏈接操做的表名,鏈接能夠對同一個表操做,也能夠對多表操做,對同一個表操做的鏈接又稱作自鏈接。 join_type 指出鏈接類型,可分爲三種:內鏈接、外鏈接和交叉鏈接。內鏈接(INNER JOIN)使用比較運算符進行表間某(些)列數據的比較操做,並列出這些表中與鏈接條件相匹配的數據行。根據所使用的比較方式不一樣,內鏈接又分爲等值連 接、天然鏈接和不等鏈接三種。 外鏈接分爲左外鏈接(LEFT OUTER JOIN或LEFT JOIN)、右外鏈接(RIGHT OUTER JOIN或RIGHT JOIN)和全外鏈接(FULL OUTER JOIN或FULL JOIN)三種。與內鏈接不一樣的是,外鏈接不僅列出與鏈接條件相匹配的行,而是列出左表(左外鏈接時)、右表(右外鏈接時)或兩個表(全外鏈接時)中全部 符合搜索條件的數據行。 交叉鏈接(CROSS JOIN)沒有WHERE 子句,它返回鏈接表中全部數據行的笛卡爾積,其結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。 鏈接操做中的ON (join_condition) 子句指出鏈接條件,它由被鏈接表中的列和比較運算符、邏輯運算符等構成。 不管哪一種鏈接都不能對text、ntext和image數據類型列進行直接鏈接,但能夠對這三種列進行間接鏈接。例如: SELECT p1.pub_id,p2.pub_id,p1.pr_info FROM pub_info AS p1 INNER JOIN pub_info AS p2 ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info) (一)內鏈接 內鏈接查詢操做列出與鏈接條件匹配的數據行,它使用比較運算符比較被鏈接列的列值。內鏈接分三種: 一、等值鏈接:在鏈接條件中使用等於號(=)運算符比較被鏈接列的列值,其查詢結果中列出被鏈接表中的全部列,包括其中的重複列。 二、不等鏈接: 在鏈接條件使用除等於運算符之外的其它比較運算符比較被鏈接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。 三、天然鏈接:在鏈接條件中使用等於(=)運算符比較被鏈接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,並刪除鏈接表中的重複列。 例,下面使用等值鏈接列出authors和publishers表中位於同一城市的做者和出版社: SELECT * FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city 又如使用天然鏈接,在選擇列表中刪除authors 和publishers 表中重複列(city和state): SELECT a.*,p.pub_id,p.pub_name,p.country FROM authors AS a INNER JOIN publishers AS p ON a.city=p.city (二)外鏈接 內鏈接時,返回查詢結果集合中的僅是符合查詢條件( WHERE 搜索條件或 HAVING 條件)和鏈接條件的行。而採用外鏈接時,它返回到查詢結果集合中的不只包含符合鏈接條件的行,並且還包括左表(左外鏈接時)、右表(右外鏈接時)或兩個邊 接表(全外鏈接)中的全部數據行。 以下面使用左外鏈接將論壇內容和做者信息鏈接起來: SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b ON a.username=b.username 下面使用全外鏈接將city表中的全部做者以及user表中的全部做者,以及他們所在的城市: SELECT a.*,b.* FROM city as a FULL OUTER JOIN user as b ON a.username=b.username (三)交叉鏈接 交叉鏈接不帶WHERE 子句,它返回被鏈接的兩個表全部數據行的笛卡爾積,返回到結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。 例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉鏈接檢索到的記錄數將等 於6*8=48行。 SELECT type,pub_name FROM titles CROSS JOIN publishers ORDER BY type 兩個主要的鏈接類型是內連 接和外連 接。到目前爲止,全部示例中使用的都是內連 接。內連 接只保留交叉積中知足鏈接條件的那些行。若是某行在一個表中存在,但在另外一個表中不存在,則結果表中不包括該信息。 外連 接是內連 接和左表和/或右表中未包括內連 接中的那些行的並置。當對兩個表執行外連 接時,可任意將一個表指定爲左表而將另外一個表指定爲右表。外連 接有三種類型: 左外連 接包括內連 接和左表中未包括在內連 接中的那些行。 右外連 接包括內連 接和右表中未包括在內連 接中的那些行。 全外連 接包括內連 接以及左表和右表中未包括在內連 接中的行。 內連 接通常是檢索兩個表裏鏈接字段都存在的數據。 左鏈接的意思是,查詢左(語句前面)表裏的全部內容,不管右邊表裏有沒有。右邊表裏沒有的內容用NULL代替。 右鏈接和左鏈接相反。 數據表的鏈接有: 一、內連 接(天然鏈接): 只有兩個表相匹配的行才能在結果集中出現 二、外連 接: 包括 (1)左外連 接(左邊的表不加限制) (2)右外連 接(右邊的表不加限制) (3)全外連 接(左右兩表都不加限制) 三、自鏈接(鏈接發生在一張基表內)