MySQL數(shù)據(jù)庫(kù)表的內(nèi)連接和外連接示例詳解
之前我們講解MySQL的查詢方法,今天我們來(lái)講解一下內(nèi)連接和外鏈接,話不多說(shuō),現(xiàn)在開始啦,對(duì)了,今天是五一的第一天,祝大家五一快樂(lè)!!
一、連接的本質(zhì)
在關(guān)系型數(shù)據(jù)庫(kù)中,數(shù)據(jù)往往分散在多個(gè)表中。為了在一次查詢中獲取完整的信息,就需要將這些表按照某種規(guī)則“連接”起來(lái)。連接的底層是笛卡爾積:即讓表A的每一行和表B的每一行兩兩組合,形成一張巨大的臨時(shí)表。然后,再通過(guò)連接條件從中篩選出真正有意義的行
二、內(nèi)連接
內(nèi)連接是最常用的連接方式,它只返回兩個(gè)表中完全滿足連接條件的行。不匹配的行會(huì)被直接丟棄。
傳統(tǒng)寫法:在
FROM中列出多個(gè)表,用WHERE子句指定連接條件。其實(shí)我們之前寫的等值連接多數(shù)就是內(nèi)連接。標(biāo)準(zhǔn)寫法:使用
INNER JOIN ... ON ...語(yǔ)法,語(yǔ)義更清晰。
特點(diǎn):結(jié)果集中絕不會(huì)出現(xiàn)因不匹配而產(chǎn)生的空值
select 字段 from 表1 inner join 表2 on 連接條件 and 其他條件;
注:前面學(xué)習(xí)的都是內(nèi)連接
例如查詢員工及其部門名,只會(huì)顯示有部門的員工;既沒(méi)有部門的員工,也沒(méi)有員工的部門,都不會(huì)出現(xiàn)
下面是一個(gè)樣例
顯示SMITH的名字和所在部門名稱


三、外連接
外連接會(huì)保留某個(gè)表中的全部記錄,即使它在另一張表中找不到匹配。缺失的字段用NULL填充。外連接分為左外連接和右外連接
為了更好的講解知識(shí)點(diǎn),下面是我們預(yù)先創(chuàng)建的database與tables;

1. 左外連接
使用LEFT JOIN,會(huì)完整顯示左側(cè)表的所有行,右表中無(wú)匹配的列置為NULL。
典型場(chǎng)景:你需要以左表為主體來(lái)查看信息。比如“列出所有學(xué)生,并顯示他們的成績(jī)”。即使某個(gè)學(xué)生從未參加過(guò)考試,他的個(gè)人信息也要保留,成績(jī)部分留空。
例子:查詢所有學(xué)生的成績(jī),如果這個(gè)學(xué)生沒(méi)有成績(jī),也要將學(xué)生的個(gè)人信息顯示出來(lái)

2. 右外連接
使用RIGHT JOIN,會(huì)完整顯示右側(cè)表的所有行,左表無(wú)匹配的列置為NULL。
典型場(chǎng)景:需要以右表為主體。比如“列出所有成績(jī),并顯示對(duì)應(yīng)的學(xué)生信息”。某個(gè)成績(jī)?nèi)绻也坏綄?duì)應(yīng)的學(xué)生(可能學(xué)生記錄已被刪除),成績(jī)記錄依然要呈現(xiàn),學(xué)生信息為空。
例子:對(duì)stu表和exam表聯(lián)合查詢,把所有的成績(jī)都顯示出來(lái),即使這個(gè)成績(jī)沒(méi)有學(xué)生與它對(duì)應(yīng),也要顯示出來(lái)

四、如何選擇左連接還是右連接
實(shí)際上,左連接和右連接在功能上可以互相轉(zhuǎn)換,只需交換表的順序。例如:
“列出所有部門和員工,包括沒(méi)有員工的部門”
可以寫作:部門表 LEFT JOIN 員工表(左表是部門,完整保留)。
也可以寫作:員工表 RIGHT JOIN 部門表(右表是部門,完整保留)。
開發(fā)建議:通常固定使用LEFT JOIN會(huì)更好理解,把要全量保留的主表放在左邊。
五、總結(jié)
內(nèi)連接:結(jié)果集只包含匹配成功的行,兩表地位平等,無(wú)主次之分。
左外連接:左表為主,左表所有行一定出現(xiàn);右表有就顯示,沒(méi)有就為空。
右外連接:右表為主,右表所有行一定出現(xiàn);左表有就顯示,沒(méi)有就為空。
如果把內(nèi)連接想象成兩個(gè)圓取交集,那么左外連接就像是保留左邊整個(gè)圓,右邊只取與左邊相交的部分,未相交的右半部分留白
到此這篇關(guān)于MySQL數(shù)據(jù)庫(kù)表的內(nèi)連接和外連接的文章就介紹到這了,更多相關(guān)MySQL表內(nèi)連和外連內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解MySQL中Order By排序和filesort排序的原理及實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了MySQL的Order By排序的底層原理與filesort排序,以及排序優(yōu)化手段,文中的示例代碼講解詳細(xì),感興趣的小編可以跟隨小編一起學(xué)習(xí)一下2022-08-08
mysql數(shù)據(jù)庫(kù)入門第一步之創(chuàng)建表
關(guān)于mysql介紹網(wǎng)上一搜一大堆,這里就不再介紹了,我之后的mysql文章只講最簡(jiǎn)單基礎(chǔ)的用法,主要是為java程序服務(wù)的.文中有非常詳細(xì)的圖文示例,需要的朋友可以參考下2021-05-05
mysql制作外鍵出現(xiàn)duplicate?key?name錯(cuò)誤問(wèn)題及解決
這篇文章主要介紹了mysql制作外鍵出現(xiàn)duplicate?key?name錯(cuò)誤問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
SQL?ALTER?TABLE語(yǔ)句靈活修改表結(jié)構(gòu)和數(shù)據(jù)類型
這篇文章主要介紹了SQL?ALTER?TABLE語(yǔ)句靈活修改表結(jié)構(gòu)和數(shù)據(jù)類型,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
SQL數(shù)據(jù)處理之增刪改實(shí)現(xiàn)方式
本文介紹了SQL中INSERT、UPDATE和DELETE語(yǔ)句的使用方法,包括如何批量添加、修改和刪除數(shù)據(jù),強(qiáng)調(diào)了在插入數(shù)據(jù)時(shí)需要注意字段長(zhǎng)度,以及DML操作默認(rèn)自動(dòng)提交數(shù)據(jù),最后提到可以通過(guò)設(shè)置autocommit為FALSE來(lái)控制提交行為2026-05-05
mysql百萬(wàn)數(shù)據(jù)表加索引優(yōu)化的方法
在大數(shù)據(jù)時(shí)代,隨著數(shù)據(jù)量的快速增長(zhǎng),對(duì)數(shù)據(jù)庫(kù)的索引優(yōu)化變得尤為重要,本文主要介紹了mysql百萬(wàn)數(shù)據(jù)表加索引優(yōu)化的方法,感興趣的可以了解一下2024-02-02
MySQL中的引號(hào)和反引號(hào)的區(qū)別與用法詳解
這個(gè)問(wèn)題是我在學(xué)習(xí)數(shù)據(jù)庫(kù)的時(shí)候遇到的一個(gè)問(wèn)題,我當(dāng)時(shí)并不能理解下圖中的一些情況,后來(lái)我也請(qǐng)教了一位大佬給我解答,最后在大佬和度娘的幫助下我大概理解了這個(gè)反引號(hào)的東西2021-10-10
MySQL如何對(duì)數(shù)據(jù)進(jìn)行排序圖文詳解
我們知道從MySQL表中使用SQL SELECT語(yǔ)句來(lái)讀取數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于MySQL如何對(duì)數(shù)據(jù)進(jìn)行排序的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08

