日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL(七)联结表

發(fā)布時間:2024/2/28 数据库 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL(七)联结表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、聯(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。