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 指出鏈接類型,可分爲三種:內鏈接、外鏈接和交叉鏈接。內鏈接(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 html

轉自:http://topic.csdn.net/t/20060809/09/4936637.html sql

12 樓aw511(點點星燈)回覆於 2006-08-22 09:13:42 得分 0 --查詢分析器中執行:   數據庫

 
  --建表table1,table2:   
  create   table   table1(id   int,name   varchar(10))   
  create   table   table2(id   int,score   int)   
  insert   into   table1   select   1,'lee'   
  insert   into   table1   select   2,'zhang'   
  insert   into   table1   select   4,'wang'   
  insert   into   table2   select   1,90   
  insert   into   table2   select   2,100   
  insert   into   table2   select   3,70   
  如表   
  -------------------------------------------------   
  table1|table2|   
  -------------------------------------------------   
  idname|idscore|   
  1lee|190|   
  2zhang|2100|   
  4wang|370|   
  -------------------------------------------------   
    
  如下均在查詢分析器中執行   
    
  1、外鏈接   
  1.概念:包括左向外聯接、右向外聯接或完整外部聯接   
    
  2.左鏈接:left   join   或   left   outer   join   
  (1)左向外聯接的結果集包括   LEFT   OUTER   子句中指定的左表的全部行,而不單單是聯接列所匹配的行。若是左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的全部選擇列表列均爲空值(null)。   
  (2)sql語句   
  select   *   from   table1   left   join   table2   on   table1.id=table2.id   
  -------------結果-------------   
  idnameidscore   
  ------------------------------   
  1lee190   
  2zhang2100   
  4wangNULLNULL   
  ------------------------------   
  註釋:包含table1的全部子句,根據指定條件返回table2相應的字段,不符合的以null顯示   
    
  3.右鏈接:right   join   或   right   outer   join   
  (1)右向外聯接是左向外聯接的反向聯接。將返回右表的全部行。若是右表的某行在左表中沒有匹配行,則將爲左表返回空值。   
  (2)sql語句   
  select   *   from   table1   right   join   table2   on   table1.id=table2.id   
  -------------結果-------------   
  idnameidscore   
  ------------------------------   
  1lee190   
  2zhang2100   
  NULLNULL370   
  ------------------------------   
  註釋:包含table2的全部子句,根據指定條件返回table1相應的字段,不符合的以null顯示   
    
  4.完整外部聯接:full   join   或   full   outer   join     
  (1)完整外部聯接返回左表和右表中的全部行。當某行在另外一個表中沒有匹配行時,則另外一個表的選擇列表列包含空值。若是表之間有匹配行,則整個結果集行包含基表的數據值。   
  (2)sql語句   
  select   *   from   table1   full   join   table2   on   table1.id=table2.id   
  -------------結果-------------   
  idnameidscore   
  ------------------------------   
  1lee190   
  2zhang2100   
  4wangNULLNULL   
  NULLNULL370   
  ------------------------------   
  註釋:返回左右鏈接的和(見上左、右鏈接)   
    
  2、內鏈接   
  1.概念:內聯接是用比較運算符比較要聯接列的值的聯接   
    
  2.內鏈接:join   或   inner   join     
    
  3.sql語句   
  select   *   from   table1   join   table2   on   table1.id=table2.id   
  -------------結果-------------   
  idnameidscore   
  ------------------------------   
  1lee190   
  2zhang2100   
  ------------------------------   
  註釋:只返回符合條件的table1和table2的列   
    
  4.等價(與下列執行效果相同)   
  A:select   a.*,b.*   from   table1   a,table2   b   where   a.id=b.id   
  B:select   *   from   table1   cross   join   table2   where   table1.id=table2.id     (注:cross   join後加條件只能用where,不能用on)   
    
  3、交叉鏈接(徹底)   
    
  1.概念:沒有   WHERE   子句的交叉聯接將產生聯接所涉及的表的笛卡爾積。第一個表的行數乘以第二個表的行數等於笛卡爾積結果集的大小。(table1和table2交叉鏈接產生3*3=9條記錄)   
    
  2.交叉鏈接:cross   join   (不帶條件where...)   
    
  3.sql語句   
  select   *   from   table1   cross   join   table2   
  -------------結果-------------   
  idnameidscore   
  ------------------------------   
  1lee190   
  2zhang190   
  4wang190   
  1lee2100   
  2zhang2100   
  4wang2100   
  1lee370   
  2zhang370   
  4wang370   
  ------------------------------   
  註釋:返回3*3=9條記錄,即笛卡爾積   
    
  4.等價(與下列執行效果相同)   
  A:select   *   from   table1,table2    .net

相關文章
相關標籤/搜索