資料庫學習(四)連線查詢

小師兄.發表於2019-01-22

基本概念:

就是將兩個或兩個以上的表,“連線起來”,當做一個資料來源,並從中去取得所需要的資料;

 

到底怎麼連線?

將每一個表的每一行資料兩兩之間相互對接起來,每次對接的結果都是連線結果的“一行”資料;

示例:

先看原始資料:

 

然後,將他們進行“連線”:

他們其實這樣這樣的方式連線起來的結果資料:

這種沒有條件的連線,也可以寫成這樣:

select * from 表1, 表2;

select * from 表1 join 表2;

select * from 表1 cross join 表2;

其實他們都叫做“交叉連線”;其實i就是沒有條件的連線——全部連線起來了;

 

 連線基本形式:

在程式碼級別,連線的基本形式為:

表1 【連線形式】 join 表2 【on 連線條件】;

 

如果是3個表,則進一步擴充套件為:

表1 【連線形式】 join 表2 【on 連線條件】 【連線形式】 join 表3 【on 連線條件】

更多表,依次類推;

 

連線的分類

主要分為以下幾種:

 

交叉連線 cross join:

其實就是剛才講連線的基本概念的時候的連線形式(結果)——它沒有條件,只是按連線的基本概念,將所有資料行都連線起來的結果。它又叫做“笛卡爾積”;

對於表1(n1個欄位,n2行),表2,(m1個欄位,m2行),他們交叉連線的結果是:

有n1+m1個列;

有n2*m2個行;

形式有:

select * from 表1, 表2;

select * from 表1 join 表2;

select * from 表1 cross join 表2;

內連線 inner join:

形式:

select * from 表1 【inner】 join 表2 on 連線條件;

先來研究沒有條件的“內連線”(其實就是交叉連線)的結果:

結果:

其中框框內的“資料行”,是正確的,有意義的資料。而其他行就是錯誤的資料。

這些有意義的資料的一個特點,就是,所標示出的兩個欄位的值相等:

該兩個欄位,分別來源於兩個參與連線的表;

我們的內連線,就是要找出這樣的一些有意義的資料,如下所示:

結果為:

可見,這裡查詢的結果,都是前述查詢(交叉連線)中,有意義的那些資料!

其中 product.protype_id = product_type.protype_id 被稱為“連線條件”,它基本上就是我們之前所學的“外來鍵關係”的一個描述。

注意:

這種的表跟表之間的內連線查詢,雖然可以體現為表跟表之間的“關係”——通常就是外來鍵關係——但並不是有外來鍵關係才能使用這種連線。

 

另外的一些變通形式:

 

可見,資料表也可以使用“as 別名”的形式來取別名;

 

左(外)連線 left (outer) join:

形式:

表1(左表) left 【outer】 join 表2(右表) on 連線條件

含義:

其實就是將兩個表的內連線的結果,再加上左邊表的不符合內連線所設定的條件的那些資料的結果;

 

舉例:

結果:

可見,左連線的結果,左邊表的資料,一定都會“全部取出”;

 

右(外)連線 right (outer) join:

形式:

表1(左表) right 【outer】 join 表2(右表) on 連線條件

含義:

其實就是將兩個表的內連線的結果,再加上右邊表的不符合內連線所設定的條件的那些資料的結果;

 

舉例:

結果:

全(外)連線 full (outer) join:

形式:

沒有形式,因為mysql不支援全連線的語法;

 

含義:

其實就是將兩個表的內連線的結果,再加上左邊表的不符合內連線所設定的條件的那些資料的結果,以及再加上右邊表的不符合內連線所設定的條件的那些資料的結果;

 

 

連線查詢舉例:

例1:對商品表:

查出每個品種各有多少個商品:

結果為:

 

例2:對學生院系表:

(先要匯入相關資料,如下所示:)

語法如下:

結果為:

相關文章