天天看點

MySQL(七)聯結表

一、聯結表基礎知識

1、關系表

把資訊分解成多個表,一類資料一個表,各表通過某些常用值(即關系設計中的關系(relational))互相關聯;

2、外鍵(foreign key):外鍵為某個表中的一列,它包含另一個表的主鍵值,定義了兩個表之間的關系

3、聯結表的優點:

①資料資訊不重複,進而不浪費時間和空間

②如果某個資料資訊變動,可以隻更新該表中的某個記錄,相關表資料不用變更

③資料無重複,可以更有效的存儲和友善的處理,伸縮性強(能夠适應不斷增加的工作量而不失敗,設計良好的資料庫或者應用程式稱為可伸縮性好(scale well))

PS:聯結是一種機制,用來在一條select語句中關聯表,是以稱之為聯結(聯結在運作時關聯表中正确的行)

二、建立聯結

例如:select A_name,B_name,B_mobile

    from A, B

    where A.A_id = B.B_id

    order by A_name, B_name;

該SQL語句中,select語句指定要檢索的列(因為是建立關聯,是以指定了3個列,差別在于A_name在A表中,B_name和B_mobile在另一個表);from語句列出了2個表分别是A和B,A和B表使用where子句正确聯結,

where子句訓示MySQL比對A表中的A_id和B表中的B_id相比對,要比對的兩列以A.A_id和B.B_id完全限定表名(當引用的列可能存在二義性,必須使用完全限定表名(用一個點分隔的表名和列名))

PS:where子句的重要性

在一條select語句中聯結幾個表時,相應的關系是在運作中構造的;在聯結兩個甚至多個表時,實際上是将第一個表中的每一行與第二個表中的每一行配對,where子句作為過濾條件,它隻包含比對的給定條件的行。

沒有where子句,第一個表中每個行将與第二個表中的每個行比對,而不管邏輯上是否可以配在一起。

1、笛卡爾積

由沒有聯結條件的表關系傳回的結果稱為笛卡爾積(檢索出的行的數目将是第一個表中的行數乘以第二個表中的行數);

PS:應保證所有聯結都有where子句,否則MySQL将傳回比想要的資料多得多的資料,還應保證where子句的正确性。

2、内部聯結

等值聯結(equijoin):基于兩個表之間的相等測試,也稱為内部聯結

    from A inter join B

    on A_name = B_name;

這條SQL語句中,select語句與之前的相同,相較于上面的from,這裡使用了inter join指定(當使用inter join時,聯結條件用on子句而不是where子句,在這裡on等同于where)

3、聯結多個表

SQL對一條select語句中可以聯結的表的數目沒有限制,建立規則也基本相同(首先列出所有表,然後定義表之間的關系)

PS:MySQL在運作時關聯指定的每個表以處理聯結,這樣很耗費資源,是以使用中應注意,不要聯結不必要的表。

三、建立進階聯結

1、使用表别名

别名除了允許用于列名和計算字段外,SQL還允許給表名起列名,好處在于:

①縮短SQL語句;

②允許在單條select語句中多次使用相同的表;

例如:select a_name, a_mobile

         from A as a, B as b, C as c

         where A.a_id = B.b_id

         and C.c_num = B.b_num

         and birthday_id = '1992-10-26';

PS:表别名不僅可用于where子句,還可用于select清單,order by子句以及語句其他部分(表别名隻在查詢執行中使用,表别名不傳回到用戶端主機)

2、自聯結

自聯結:自聯結通常作為外部語句用來替代從相同表中檢索資料時使用的子查詢語句。

例如:select p1.user_id, p1.user_name

         from usertable as p1, usertable as p2

         where p1.user_id = p2.user_id

         and p2.user_id = '10086';

這條SQL語句中,usertable表第一次出現為别名p1,第二次為别名p2,在select語句中明确使用p1字首給出所需列名,否則MySQL将傳回錯誤,因為其無法正确區分想要的具體為哪一列;

3、自然聯結

無論何時對表進行聯結,應至少有一個列出現在不止一個表中(被聯結的列);标準的聯結傳回所有資料,自然聯結排除多次出現,隻傳回一次。

一般使用select *通配符,對其他表的列使用明确的自己來完成,通配符隻對第一個表使用,所有其他列明确列出。

4、外部聯結

用來檢索包含了在相關表中沒有關聯行的行,這種類型的聯結稱為外部聯結。

例如:select A.cust_id, B.mobile_num

         from A left outer join B

         on A.cust_id = B.mobile_num;

這條select語句使用關鍵字outer join來指定聯結的類型(不是在where子句中指定);在使用outer join文法時,必須使用left或right指定包括其他所有行的表(right指出右邊的表,left指出左邊的表)

外部聯結的類型:

分為左外部聯結和右外部聯結,唯一差别是關聯表的順序不同,左外部聯結可以通過颠倒from或where子句中的表順序轉換為右外部聯結,兩種類型可以互換使用(聚集函數也可和聯結一起使用)。

PS:聯結使用要點

①注意使用的聯結類型

②保證使用正确的聯結條件,否則将傳回不正确的資料

③應該總是提供聯結條件,否則會得到笛卡爾積

④同一個聯結下可包含多個表,甚至對每個聯結采用不同的聯結類型

轉載請注明出處,商用請征得作者本人同意,謝謝!!!