SQL中的 join 可以根據(jù)相應(yīng)條件把指定的表給結(jié)合起來并將數(shù)據(jù)返回。
十多年的閩侯網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整閩侯建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“閩侯網(wǎng)站設(shè)計(jì)”,“閩侯網(wǎng)站推廣”以來,每個客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
內(nèi)連接是基于連接謂詞將倆張表(如A和B)的列組合到一起產(chǎn)生新的結(jié)果表,在表中存在至少一個匹配時(shí),INNER JOIN 關(guān)鍵字返回行
左外連接Left join關(guān)鍵字會從左表那里返回所有的行,即使是在右表中沒有匹配到的行?
右外連接關(guān)鍵字Right join會從右表那里返回所有的行,即使是在左表中沒有匹配到的行?
全連接的關(guān)鍵字Full join,只要其中某個表中存在匹配,F(xiàn)ull join 就會返回行
交叉連接一般使用的比較少,交叉連接又稱笛卡爾連接或者叉乘連接,如果,A和B是倆個集合,他們的交叉連接就是A*B?
本文主要介紹 SQL 標(biāo)準(zhǔn)中定義的各種連接的意義和區(qū)別,例如,交叉連接( CROSS JOIN )、內(nèi)連接( INNER JOIN )、外連接( OUTER JOIN )、自然連接( NATURAL JOIN )等,并結(jié)合例子講解這些連接在 MySQL 中的語法和表現(xiàn)。
從網(wǎng)上的資料看, JOIN 更多翻譯為連接,本文中凡是出現(xiàn)中文“連接”的地方都是指 JOIN 。
本文中用到的所有例子涉及兩張表—— customers 用戶表和 orders 訂單表,其中訂單表中的 cust_id 字段表示用戶的唯一 ID,也就是用戶表的主鍵 cust_id 。兩張表的數(shù)據(jù)如下:
注:兩張表都經(jīng)過了簡化,實(shí)際業(yè)務(wù)中這兩張表肯定還包括其他字段。
英文維基百科 JOIN 詞條 對連接的定義如下:
翻譯過來就是,“連接可以根據(jù)一張(自連接)或多張表中的共同值將這些表的列數(shù)據(jù)合并為一個新的結(jié)果集,標(biāo)準(zhǔn) SQL 定義了五種連接:內(nèi)連接、左外連接、右外連接、全外連接和交叉連接?!?/p>
也就是說,連接是 SQL 標(biāo)準(zhǔn)中定義的一種組合多張表的方式,當(dāng)然一張表自身也可以和自身組合,稱為自連接。連接后得到的結(jié)果集的每一列其實(shí)都來自用于連接的多張表,不同的連接類型只是區(qū)分了這些列具體從哪張表里來,列里填充的是什么數(shù)據(jù)。
其實(shí)英文維基百科的 JOIN 詞條已經(jīng)把各種連接的類型解釋地非常清楚了,非常值得去看一下。
我們來看一下 SQL 標(biāo)準(zhǔn)中定義的各種連接類型,理解各種連接最好的方法就是把需要連接的表想象成集合,并畫出可以反映集合的交與并的情況的圖——韋恩圖,例如下圖就畫出了 SQL 中定義的幾種主要連接。
請先仔細(xì)查看一下圖中的內(nèi)容,你可以從中歸納出幾種連接類型呢?
雖然圖中畫了 7 種集合的交并情況,但是總結(jié)起來,主要是兩種連接類型在起作用——內(nèi)連接( INNER JOIN )和外連接( OUTER JOIN ),其中外連接又分為了左外連接( LEFT OUTER JOIN )、右外連接( RIGHT OUTER JOIN )和全外連接( FULL OUTER JOIN )。
下面先簡單介紹一下 SQL 標(biāo)準(zhǔn)中各種連接的定義,然后在「MySQL 中的連接」一節(jié)再用例子來演示 MySQL 中支持的各種連接。
連接既然是用來合并多張表的,那么要定義一個連接就必須指定需要連接的表,并指定可選的連接條件。例如,一個典型的 SQL 連接語句如下:
我們用表 A 和表 B 指代需要連接的兩張表,經(jīng)過 內(nèi)連接 后得到的結(jié)果集 僅 包含所有滿足 連接條件 的數(shù)據(jù);而經(jīng)過 外連接 后得到的數(shù)據(jù)集 不僅 包含滿足 連接條件 的數(shù)據(jù),還包含其他數(shù)據(jù),具體的差別是:
在上面「SQL 標(biāo)準(zhǔn)定義的主要連接」一圖中并沒有列出交叉連接,交叉連接會對連接的兩張表做笛卡爾積,也就是連接后的數(shù)據(jù)集中的行是由第一張表中的每一行與第二張表中的每一行配對而成的,而不管它們 邏輯上 是否可以搭配在一起。假設(shè)交叉連接的兩張表分別有 m 和 n 行數(shù)據(jù),那么交叉連接后的數(shù)據(jù)集就包含 m 乘以 n 行數(shù)據(jù)。
連接根據(jù)連接的條件不同,又可以區(qū)分為等值連接和非等值連接,「SQL 標(biāo)準(zhǔn)定義的主要連接」圖中畫出的連接的連接條件都是比較兩個字段是否相等,它們都是等值連接。
自然連接是等值連接的一種特殊形式,自然連接會自動選取需要連接的兩張表中字段名相同的 所有 列做相等比較,而不需要再指定連接條件了。
注:以下內(nèi)容全部基于 MySQL 5.7 版本,所有例子只保證在 MySQL 5.7 上是可以正確執(zhí)行的。
MySQL 中支持的連接類型和關(guān)鍵字如下:
上面的表示方法摘自 MySQL 5.7 版本 官方文檔 ,其中 | 表示兩者皆可出現(xiàn), [] 表示的是可選的, {} 表示的是必選的,例如 NATURAL LEFT JOIN 和 NATURAL JOIN 都是合法的。
可以看到,除了全外連接( FULL OUTER JOIN )以外, MySQL 基本支持了 SQL 標(biāo)準(zhǔn)中定義的各種連接。在 MySQL 中全外連接可以通過 UNION 合并的方式做到,當(dāng)然前提是你知道自己為什么需要這么做,具體參見: Full Out Join in MySQL 。
MySQL 語法中還支持一個并不在 SQL 標(biāo)準(zhǔn)中的 STRAIGHT_JOIN ,它在 表現(xiàn)上 和內(nèi)連接或者交叉連接并無區(qū)別,只是一種給 MySQL 優(yōu)化器的一個提示, STRAIGHT_JOIN 提示 MySQL 按照語句中表的順序加載表,只有在你明確清楚 MySQL 服務(wù)器對你的 JOIN 語句做了負(fù)優(yōu)化的時(shí)候才可能用到它。
還有一點(diǎn)需要說明的是,根據(jù) 官方文檔 ,在 MySQL 中, JOIN 、 CROSS JOIN 和 INNER JOIN 實(shí)現(xiàn)的功能是一致的,它們在語法上是等價(jià)的。從語義上來說, CROSS JOIN 特指無條件的連接(沒有指定 ON 條件的 JOIN 或者沒有指定 WHERE 連接條件的多表 SELECT ), INNER JOIN 特指有條件的連接(指定了 ON 條件的 JOIN 或者指定了 WHERE 連接條件的多表 SELECT )。當(dāng)然,如果你非要寫 ... CROSS JOIN ... ON ... 這樣的語法,也是可以執(zhí)行的,雖然寫著交叉連接,實(shí)際上執(zhí)行的是內(nèi)連接。
下面我們就用例子來看一看 MySQL 中支持的幾種連接的例子。
注:下面的例子都沒有指定 ORDER BY 子句,返回結(jié)果的順序可能會因?yàn)閿?shù)據(jù)插入順序的不同而略有不同。
MySQL 的交叉連接或內(nèi)連接有兩種寫法,一種是使用 JOIN 并用 ON 或者 USING 子句指定連接條件的寫法,一種是普通的 SELECT 多表,并且用 WHERE 子句指定連接的鍵的寫法。
下面的例子是一個交叉連接:
上面的寫法等價(jià)于:
當(dāng)然,第二種寫法中如果將 CROSS JOIN 替換成 JOIN 或者 INNER JOIN 也是可以正確執(zhí)行的。上面兩條語句的執(zhí)行結(jié)果如下:
可以看到共返回了 30 行結(jié)果,是兩張表的笛卡爾積。
一個內(nèi)連接的例子如下:
上面的寫法等價(jià)于:
在連接條件比較的字段相同的情況下,還可以改用 USING 關(guān)鍵字,上面的寫法等價(jià)于:
上面三條語句的返回結(jié)果如下:
可以看到只返回了符合連接條件 customers.cust_id = orders.cust_id 的 6 行結(jié)果,結(jié)果的含義是所有有訂單的用戶和他們的訂單。
左外連接和右外連接的例子如下,其中的 OUTER 關(guān)鍵字可以省略:
其中右外連接的返回與內(nèi)連接的返回是一致的(思考一下為什么),左外連接的返回結(jié)果如下:
可以看到一共返回了 8 行數(shù)據(jù),其中最后兩行數(shù)據(jù)對應(yīng)的 order_id 的值為 NULL ,結(jié)果的含義是所有用戶的訂單,不管這些用戶是否已經(jīng)有訂單存在了。
根據(jù)前面介紹的自然連接的定義,自然連接會自動用參與連接的兩張表中 字段名相同 的列做等值比較,由于例子中的 customers 和 orders 表只有一列名稱相同,我們可以用自然連接的語法寫一個與上面的內(nèi)連接的例子表現(xiàn)行為一樣的語句如下:
可以看到,使用自然連接就不能再用 ON 子句指定連接條件了,因?yàn)檫@完全是多余的。
當(dāng)然,自然連接同樣支持左外連接和右外連接。
下面用一個 customers 表自連接的例子再來說明一下自然連接,語句如下:
因?yàn)槭亲赃B接,因此必須使用 AS 指定別名,否則 MySQL 無法區(qū)分“兩個” customers 表,運(yùn)行的結(jié)果如下:
可以看到結(jié)果集和 customers 表完全一致,大家可以思考一下為什么結(jié)果是這樣的。
文章之前也提到了,MySQL 還支持一種 SQL 標(biāo)準(zhǔn)中沒有定義的“方言”, STRAIGHT_JOIN , STRAIGHT_JOIN 支持帶 ON 子句的內(nèi)連接和不帶 ON 子句的交叉連接,我們來看一個 STRAIGHT_JOIN 版本的內(nèi)連接的例子:
返回結(jié)果與前面內(nèi)連接的例子是一致的,如下:
STRAIGHT_JOIN 的表現(xiàn)和 JOIN 是完全一致的,它只是一種給 MySQL 優(yōu)化器的提示,使得 MySQL 始終按照語句中表的順序讀取表(上面的例子中,MySQL 在執(zhí)行時(shí)一定會先讀取 customers 表,再讀取 orders 表),而不會做改變讀取表的順序的優(yōu)化。關(guān)于 MySQL 優(yōu)化器的話題這里不做展開,需要說明的是除非你非常清楚你在做什么,否則不推薦直接使用 STRAIGHT_JOIN 。
你能理解上面的語句是在檢索什么數(shù)據(jù)嗎?
本文主要介紹了 SQL 標(biāo)準(zhǔn)里定義的各種連接的概念,以及 MySQL 中的實(shí)現(xiàn),并通過各種例子來介紹了這些連接的區(qū)別。這些連接不一定都能在實(shí)際開發(fā)中用到,但是做到心中有知識也還是很有必要的。
那么,現(xiàn)在再回憶一下,什么是內(nèi)連接、外連接、自連接、等值連接和自然連接?他們的區(qū)別是什么?
最后,給大家留一個思考題,為什么 MySQL 中沒有左外連接或者右外連接版本的 STRAIGHT_JOIN ?
主要是left join,inner join,right join,full join,分別是左連接,內(nèi)連接,右連接,還有全連接。
MySQL所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言。MySQL 軟件采用了雙授權(quán)政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點(diǎn),一般中小型網(wǎng)站的開發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫。
擴(kuò)展資料:
應(yīng)用環(huán)境:
與其他的大型數(shù)據(jù)庫例如?Oracle、DB2、SQL Server等相比,MySQL自有它的不足之處,但是這絲毫也沒有減少它受歡迎的程度。
對于一般的個人使用者和中小型企業(yè)來說,MySQL提供的功能已經(jīng)綽綽有余,而且由于 MySQL是開放源碼軟件,因此可以大大降低總體擁有成本。
Linux作為操作系統(tǒng),Apache?或Nginx作為?Web?服務(wù)器,MySQL 作為數(shù)據(jù)庫,PHP/Perl/Python作為服務(wù)器端腳本解釋器。
參考資料來源:百度百科-mySQL
select * from A full join B on a.col1=b.col1
left join C on a.col2=c.col2;
是不是你要的效果、C又是什么join呢,是在搞不清你可以把子查詢括號括起來再join你的C表
select * from (
select * from A full join B on a.col1=b.col1
) left join C on a.col2=c.col2;
當(dāng)前文章:mysql全連接怎么用 mysql數(shù)據(jù)庫怎么連接使用
網(wǎng)站路徑:http://jinyejixie.com/article26/hehecg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、企業(yè)建站、外貿(mào)建站、關(guān)鍵詞優(yōu)化、云服務(wù)器、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)