Mysql資料庫表連線

Allen-Liu發表於2017-09-17

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

連線查詢方式有:

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


具體如下:

一、內連線

內連線查詢操作列出與連線條件匹配的資料行,它使用比較運算子比較被連線列的列值。內連線分三種:

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的右表無條件拼接過來。這樣依次執行,這樣這種記錄便為兩個表的記錄的笛卡爾積。

左連線和右連線的區別:

左連線以左表為基準進行查詢,左表資料會全部顯示出來,右表如果和左表匹配的資料則顯示相應欄位的資料,如果不匹配,則顯示為NULL;右連線剛好相反。

全連線就是先以左表進行左外連線,然後以右表進行右外連線。

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


相關文章