MySQL(七)联结表
一、聯(lián)結(jié)表基礎(chǔ)知識
1、關(guān)系表
把信息分解成多個表,一類數(shù)據(jù)一個表,各表通過某些常用值(即關(guān)系設(shè)計中的關(guān)系(relational))互相關(guān)聯(lián);
2、外鍵(foreign key):外鍵為某個表中的一列,它包含另一個表的主鍵值,定義了兩個表之間的關(guān)系
3、聯(lián)結(jié)表的優(yōu)點:
①數(shù)據(jù)信息不重復(fù),從而不浪費時間和空間
②如果某個數(shù)據(jù)信息變動,可以只更新該表中的某個記錄,相關(guān)表數(shù)據(jù)不用變更
③數(shù)據(jù)無重復(fù),可以更有效的存儲和方便的處理,伸縮性強(qiáng)(能夠適應(yīng)不斷增加的工作量而不失敗,設(shè)計良好的數(shù)據(jù)庫或者應(yīng)用程序稱為可伸縮性好(scale well))
PS:聯(lián)結(jié)是一種機(jī)制,用來在一條select語句中關(guān)聯(lián)表,因此稱之為聯(lián)結(jié)(聯(lián)結(jié)在運行時關(guān)聯(lián)表中正確的行)
?
二、創(chuàng)建聯(lián)結(jié)
例如: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語句指定要檢索的列(因為是創(chuàng)建關(guān)聯(lián),所以指定了3個列,區(qū)別在于A_name在A表中,B_name和B_mobile在另一個表);from語句列出了2個表分別是A和B,A和B表使用where子句正確聯(lián)結(jié),
where子句指示MySQL匹配A表中的A_id和B表中的B_id相匹配,要匹配的兩列以A.A_id和B.B_id完全限定表名(當(dāng)引用的列可能存在二義性,必須使用完全限定表名(用一個點分隔的表名和列名))
PS:where子句的重要性
在一條select語句中聯(lián)結(jié)幾個表時,相應(yīng)的關(guān)系是在運行中構(gòu)造的;在聯(lián)結(jié)兩個甚至多個表時,實際上是將第一個表中的每一行與第二個表中的每一行配對,where子句作為過濾條件,它只包含匹配的給定條件的行。
沒有where子句,第一個表中每個行將與第二個表中的每個行匹配,而不管邏輯上是否可以配在一起。
1、笛卡爾積
由沒有聯(lián)結(jié)條件的表關(guān)系返回的結(jié)果稱為笛卡爾積(檢索出的行的數(shù)目將是第一個表中的行數(shù)乘以第二個表中的行數(shù));
例如:select A_name,B_name,B_mobile
? ? from A, B
? ? order by A_name, B_name;
PS:應(yīng)保證所有聯(lián)結(jié)都有where子句,否則MySQL將返回比想要的數(shù)據(jù)多得多的數(shù)據(jù),還應(yīng)保證where子句的正確性。
2、內(nèi)部聯(lián)結(jié)
等值聯(lián)結(jié)(equijoin):基于兩個表之間的相等測試,也稱為內(nèi)部聯(lián)結(jié)
例如:select A_name,B_name,B_mobile
? ? from A inter join B
? ? on?A_name = B_name;
這條SQL語句中,select語句與之前的相同,相較于上面的from,這里使用了inter join指定(當(dāng)使用inter join時,聯(lián)結(jié)條件用on子句而不是where子句,在這里on等同于where)
3、聯(lián)結(jié)多個表
SQL對一條select語句中可以聯(lián)結(jié)的表的數(shù)目沒有限制,創(chuàng)建規(guī)則也基本相同(首先列出所有表,然后定義表之間的關(guān)系)
PS:MySQL在運行時關(guān)聯(lián)指定的每個表以處理聯(lián)結(jié),這樣很耗費資源,因此使用中應(yīng)注意,不要聯(lián)結(jié)不必要的表。
?
三、創(chuàng)建高級聯(lián)結(jié)
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子句以及語句其他部分(表別名只在查詢執(zhí)行中使用,表別名不返回到客戶端主機(jī))
2、自聯(lián)結(jié)
自聯(lián)結(jié):自聯(lián)結(jié)通常作為外部語句用來替代從相同表中檢索數(shù)據(jù)時使用的子查詢語句。
例如: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表第一次出現(xiàn)為別名p1,第二次為別名p2,在select語句中明確使用p1前綴給出所需列名,否則MySQL將返回錯誤,因為其無法正確區(qū)分想要的具體為哪一列;
3、自然聯(lián)結(jié)
無論何時對表進(jìn)行聯(lián)結(jié),應(yīng)至少有一個列出現(xiàn)在不止一個表中(被聯(lián)結(jié)的列);標(biāo)準(zhǔn)的聯(lián)結(jié)返回所有數(shù)據(jù),自然聯(lián)結(jié)排除多次出現(xiàn),只返回一次。
一般使用select *通配符,對其他表的列使用明確的自己來完成,通配符只對第一個表使用,所有其他列明確列出。
4、外部聯(lián)結(jié)
用來檢索包含了在相關(guān)表中沒有關(guān)聯(lián)行的行,這種類型的聯(lián)結(jié)稱為外部聯(lián)結(jié)。
例如:select A.cust_id, B.mobile_num
? ? ? ? ?from A left outer join B
? ? ? ? ?on?A.cust_id = B.mobile_num;
這條select語句使用關(guān)鍵字outer join來指定聯(lián)結(jié)的類型(不是在where子句中指定);在使用outer join語法時,必須使用left或right指定包括其他所有行的表(right指出右邊的表,left指出左邊的表)
外部聯(lián)結(jié)的類型:
分為左外部聯(lián)結(jié)和右外部聯(lián)結(jié),唯一差別是關(guān)聯(lián)表的順序不同,左外部聯(lián)結(jié)可以通過顛倒from或where子句中的表順序轉(zhuǎn)換為右外部聯(lián)結(jié),兩種類型可以互換使用(聚集函數(shù)也可和聯(lián)結(jié)一起使用)。
PS:聯(lián)結(jié)使用要點
①注意使用的聯(lián)結(jié)類型
②保證使用正確的聯(lián)結(jié)條件,否則將返回不正確的數(shù)據(jù)
③應(yīng)該總是提供聯(lián)結(jié)條件,否則會得到笛卡爾積
④同一個聯(lián)結(jié)下可包含多個表,甚至對每個聯(lián)結(jié)采用不同的聯(lián)結(jié)類型
總結(jié)
以上是生活随笔為你收集整理的MySQL(七)联结表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL(六)常用语法和数据类型
- 下一篇: MySQL(八)子查询和分组查询