一、聯結表基礎知識
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、笛卡爾積
由沒有聯結條件的表關系返回的結果稱為笛卡爾積(檢索出的行的數目將是第一個表中的行數乘以第二個表中的行數);
例如:select A_name,B_name,B_mobile
from A, B
order by A_name, B_name;
PS:應保證所有聯結都有where子句,否則MySQL將返回比想要的數據多得多的數據,還應保證where子句的正確性。
2、內部聯結
等值聯結(equijoin):基於兩個表之間的相等測試,也稱為內部聯結
例如:select A_name,B_name,B_mobile
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:聯結使用要點
①注意使用的聯結類型
②保證使用正確的聯結條件,否則將返回不正確的數據
③應該總是提供聯結條件,否則會得到笛卡爾積
④同一個聯結下可包含多個表,甚至對每個聯結采用不同的聯結類型