數據庫表間的聯系


第一部分、查詢理論

連接查詢方式有:

內連接、外連接(左連接、右連接、全連接)、交叉連接

左連接和右連接的區別:

左連接以左表為基准進行查詢,左表數據會全部顯示出來,右表如果和左表匹配的數據則顯示相應字段的數據,如果不匹配,則顯示為NULL;右連接剛好相反。

全連接就是先以左表進行左外連接,然后以右表進行右外連接。

說明:所謂的基准,就是以某張表的限制條件查詢條件為准!

具體如下:

一、內連接

內連接查詢操作列出與連接條件匹配的數據行,它使用比較運算符比較被連接列的列值。內連接分三種:

1、等值連接:在連接條件中使用等於號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重復列。

2、不等連接:在連接條件使用除等於運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<、!=和<>。

3、自然連接:在連接條件中使用等於(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,並刪除連接表中的重復列。

二、外連接

返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接時)、右表(右外連接時)或兩個邊接表(全外連接)中的所有數據行。

三、交叉連接

交叉連接不帶WHERE 子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回到結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數將等於6*8=48行。

第二部分、實例說明

  • 實例

Book表:

數據庫表與表連接的方式(內連接、外連接[左連接、右連接、全連接]、交叉連接)

 Student表:

數據庫表與表連接的方式(內連接、外連接[左連接、右連接、全連接]、交叉連接)

一、內連接

select *

from [Book] as b,[Student] as s

where b.StudentId=s.StudentId

等價於如下(也可以不要關鍵字inner,此為系統默認),但這種方法不能再用left join等外連接了

select *

from [Book] as b inner join [Student] as s

ON b.StudentId=s.StudentId

這種方法還可以加and條件,並且后面可能接着用left join等外連接

         結果為:

數據庫表與表連接的方式(內連接、外連接[左連接、右連接、全連接]、交叉連接)

         執行過程

相當於內連接的向右連接。以from  [Book] inner join [Student]等式右邊為基准,即以Student表(等式右表,s表)的s.StudentId為基准,遍歷Book表(等式左表,Book表)中與之匹配的b.StudentId,然后拼接返回。結果含有重復的列,b.StudentId和s.StudentId。

說明

這與where b.StudentId=s.StudentId或者s.StudentId=b.StudentId位置沒有關系。它僅僅代表滿足條件而已,不判定誰為基准。以下外連接,交叉連接相同操作。

二、外連接

1、左外連接

代碼

select *

from [Book] as b left join [Student] as s

ON b.StudentId=s.StudentId

結果

數據庫表與表連接的方式(內連接、外連接[左連接、右連接、全連接]、交叉連接)

執行過程

即以from [Book] left join [Student]的Book表為基准,即以Book表(b表)的b.StudentId為基准。遍歷Student表(s表)中與之匹配的b.StudentId。若b.StudentId含有s.StudentId匹配項,則進行拼接,然后遍歷Student表的下一條s.StudentId,當查詢完畢則進入下一條b.StudentId。若b.StudentId沒有相應s.StudentId匹配項時,則顯示左表的項,拼接右表的項顯示為NULL。

2、右外連接

代碼

select *

from [Book] as b right join [Student] as s

ON b.StudentId=s.StudentId

結果

數據庫表與表連接的方式(內連接、外連接[左連接、右連接、全連接]、交叉連接)

執行過程

即以from [Book] right join [Student]的Student表為基准,即以Student表(s表)的s.StudentId為基准。遍歷Book表(b表)中與之匹配的s.StudentId。若s.StudentId含有b.StudentId匹配項,則進行拼接,然后遍歷Book表的下一條b.StudentId,當查詢完畢則進入下一條s.StudentId。若s.StudentId沒有相應b.StudentId匹配項時,則顯示右表的項,拼接左表的項顯示為NULL。

3、全外連接

代碼

select *

from [Book] as b full outer join [Student] as s

ON b.StudentId=s.StudentId

結果

數據庫表與表連接的方式(內連接、外連接[左連接、右連接、全連接]、交叉連接)

執行過程

即以from [Book] full outer join [Student]中先以Book表進行左外連接,然后以Student表進行右外連接。

三、交叉連接

代碼

select *

from [Book] as b CROSS Join [Student] as a

Order by b.BookId

結果

數據庫表與表連接的方式(內連接、外連接[左連接、右連接、全連接]、交叉連接)

執行過程

即是按照Order排序的Id,把要Join的右表無條件拼接過來。這樣依次執行,這樣這種記錄便為兩個表的記錄的笛卡爾積。

轉載:http://blog.sina.com.cn/s/blog_634c33eb01010tuw.html

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com