1. 程式人生 > >親自實驗讓你徹底理解表連接

親自實驗讓你徹底理解表連接

lec 一個人 相同 bsp 技術 指定 個人 add 冗余

1.表連接的根本條件是共同字段,也叫關聯字段也叫冗余字段,有關聯字段(冗余字段)才能將兩張表的記錄匹配起來嘛。

其中關聯字段,也即形成了表之間的關系,即1對1,還是1對多,還是多對多。

這些表之間的關系,就是通過關聯字段形成的1對1,還是1對多,還是多對多關系。

也正因為表通過關聯字段,聯系起來了。關聯字段所在的幾張表又形成了幾對幾的關系。也就造成了關聯結果表,即關聯後產生的表。會存在記錄(行冗余問題)。

即,想一想,為什麽將一對多拆成兩張表?因為怕冗余記錄太多嘛。

舉個例子:table(uid,age,address),一個人是有很多個地址的。所以就要把uid和address單獨隔離出來的。否則放在一張表裏,就會出現這樣的記錄:

張三,18,深圳南山區1路1號

張三,18,深圳福田區x路x號

發現張三,18這個字段無故出現了多次,白費。所以為了考慮數據庫容量,直接將uid addres字段拆出來。這就是見表第二範式。

結關系:表關聯->關聯字段->防止記錄和字段冗余

表關系,

1對多,是為了防止記錄的某些不相關字段冗余,所以字段出現1對多關系必須要建立兩張表。

1對1,是因為兩個不相關的領域,雖然放在一張表裏也可以,也不會出現記錄無關系字段額外冗余,但這樣會形成一張寬表。涉及insert,更改記錄操作時,會很麻煩。所以1對1也要建立兩張表。

多對多,

表關聯剛好對原來的表之間關系拆分進行了你想處理,所以表關聯的結果必然是

2.表連接冗余字段問題:

表連接就是將兩個表連起來,字段默認都會有。除非你select 指定你想要的字段。

查詢語句:select * from t_test t1 left join t_test2 t2 on t1.uid = t2.uid;

因為select *,所以默認倆表的全部字段會顯示出來。如下:

技術分享

此時就會發現,進行表關聯的字段(此處是uid),就會有兩個。因為兩張表能有聯系,全是靠共同字段嘛,select * 肯定會有兩列相同的字段出來,所以這時候,你就需要手動指定顯示哪個表的共同字段,否則迷惑性太強,倆字段顯示出來。太難看了。

改正後的sql:select t1.*,t2.id,t2.address from t_test t1 left join t_test2 t2 on t1.uid = t2.uid;

顯示某張表的全部字段:t1.*即可。

查詢結果如下:,你看,就沒有多余的公共字段了吧,因為你select 指定了顯示哪些字段。

技術分享

親自實驗讓你徹底理解表連接