SQL表間關(guān)聯(lián)查詢(xún)實(shí)例詳解
簡(jiǎn)介
本文主要講解SQL語(yǔ)句中常用的表間關(guān)聯(lián)查詢(xún)方式,包括:左連接(left join)、右連接(right join)、全連接(full join)、內(nèi)連接(inner join)、交叉連接(cross join)、自然連接(natural join)。
樣例準(zhǔn)備
以oracle數(shù)據(jù)庫(kù)為例,現(xiàn)在有兩張表TESTTABLEONE(簡(jiǎn)稱(chēng)a表)和TESTTABLETWO(簡(jiǎn)稱(chēng)b表),兩張表分別有id和name兩個(gè)字段,兩張表數(shù)據(jù)如下兩圖所示。
兩張表各有4條數(shù)據(jù),其中,a表和b表都有id01和id02這兩條數(shù)據(jù),a表有id03和id04兩條數(shù)據(jù)但b表沒(méi)有,b表有id05和id06兩條數(shù)據(jù)但a表沒(méi)有。
左外連接
左外連接簡(jiǎn)稱(chēng)左連,語(yǔ)法為left join或left outer join,左表返回全部數(shù)據(jù),右表返回滿(mǎn)足連接條件的數(shù)據(jù),對(duì)于左表存在而右表不存在的數(shù)據(jù),右表對(duì)應(yīng)的字段返回NULL。
執(zhí)行以下語(yǔ)句:
--left join前面的a表就是左表,left join后面的b表就是右表,on的后面是連接條件,以下連接條件表示按id字段匹配。
select a.*,b.* from TESTTABLEONE a left join TESTTABLETWO b on a.id=b.id;
返回結(jié)果如下圖:
左表(a表)返回全部4條數(shù)據(jù),右表(b表)只返回了id01和id02,對(duì)于左表存在而右表不存在的id03和id04兩條數(shù)據(jù),左表返回全部數(shù)據(jù),而右表則返回NULL。
右外連接
右外連接簡(jiǎn)稱(chēng)右連,語(yǔ)法為right join或right outer join,右表返回全部數(shù)據(jù),左表返回滿(mǎn)足連接條件的數(shù)據(jù),對(duì)于右表存在而左表不存在的數(shù)據(jù),左表對(duì)應(yīng)的字段返回NULL。
執(zhí)行以下語(yǔ)句:
--right join前面的a表就是左表,right join后面的b表就是右表,on的后面是連接條件,以下連接條件表示按id字段匹配。
select a.*,b.* from TESTTABLEONE a right join TESTTABLETWO b on a.id=b.id;
返回結(jié)果如下圖:
右表(b表)返回全部4條數(shù)據(jù),左表(a表)只返回了id01和id02,對(duì)于右表存在而左表不存在的id05和id06兩條數(shù)據(jù),右表返回全部數(shù)據(jù),而左表則返回NULL。
全外連接
全外連接簡(jiǎn)稱(chēng)全連接,語(yǔ)法為full join或full outer join,返回左表和右表的全部數(shù)據(jù),對(duì)于左表存在而右表不存在的數(shù)據(jù),右表對(duì)應(yīng)的字段返回NULL,對(duì)于右表存在而左表不存在的數(shù)據(jù),左表對(duì)應(yīng)的字段返回NULL。
執(zhí)行以下語(yǔ)句:
--full join連接a表和b表,on的后面是連接條件,以下連接條件表示按id字段匹配。
select a.*,b.* from TESTTABLEONE a full join TESTTABLETWO b on a.id=b.id;
返回結(jié)果如下圖:
左表和右表都返回全部4條數(shù)據(jù),對(duì)于左表存在而右表不存在的id03和id04兩條數(shù)據(jù),右表則返回NULL,對(duì)于右表存在而左表不存在的id05和id06兩條數(shù)據(jù),左表則返回NULL。
內(nèi)連接
內(nèi)連接語(yǔ)法為inner join,只返回左表和右表滿(mǎn)足連接條件的數(shù)據(jù),對(duì)于左表存在而右表不存在的數(shù)據(jù)以及右表存在而左表不存在的數(shù)據(jù),都不返回。
執(zhí)行以下語(yǔ)句:
--inner join連接a表和b表,on的后面是連接條件,以下連接條件表示按id字段匹配。
select a.*,b.* from TESTTABLEONE a inner join TESTTABLETWO b on a.id=b.id;
以下寫(xiě)法的效果也相當(dāng)于內(nèi)連接:
--a表和b表直接用逗號(hào)隔開(kāi),把內(nèi)連接的條件寫(xiě)到where條件里面。
select a.*,b.* from TESTTABLEONE a,TESTTABLETWO b where a.id=b.id;
返回結(jié)果如下圖:
只返回左表和右表都存在的數(shù)據(jù):id01和id02。
交叉連接
交叉連接語(yǔ)法為cross join,不帶連接條件,即沒(méi)有on的部分,返回左表和右表的笛卡爾積,即左表所有數(shù)據(jù)與右表所有數(shù)據(jù)組合。
執(zhí)行以下語(yǔ)句:
--cross join連接a表和b表,不帶連接條件
select a.*,b.* from TESTTABLEONE a cross join TESTTABLETWO b;
返回結(jié)果如下圖:
總共返回16條數(shù)據(jù),即左表4條數(shù)據(jù)乘以右表4條數(shù)據(jù)。
交叉連接可以加where條件,可以起到內(nèi)連接的效果。
執(zhí)行以下語(yǔ)句:
--cross join加上where條件(a.id=b.id),相當(dāng)于inner join。
select a.*,b.* from TESTTABLEONE a cross join TESTTABLETWO b where a.id=b.id;
返回結(jié)果如下圖:
只返回左表和右表都存在的數(shù)據(jù):id01和id02。
自然連接
自然連接語(yǔ)法為natural join,不帶顯示連接條件,會(huì)自動(dòng)對(duì)左表和右表中名稱(chēng)相同的字段進(jìn)行連接,只返回左表和右表都存在的數(shù)據(jù),并且,對(duì)于兩張表中名稱(chēng)相同的連接字段,不會(huì)重復(fù)顯示。
執(zhí)行以下語(yǔ)句:
--natural join不需要帶上顯示的連接條件(即on后面的部分)。
select * from TESTTABLEONE a natural join TESTTABLETWO b;
返回結(jié)果如下圖:
只返回左表和右表都存在的數(shù)據(jù),并且,作為自然連接條件的ID和NAME字段沒(méi)有重復(fù)顯示。
到此這篇關(guān)于SQL表間關(guān)聯(lián)查詢(xún)?cè)斀獾奈恼戮徒榻B到這了,更多相關(guān)SQL關(guān)聯(lián)查詢(xún)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL多表關(guān)聯(lián)查詢(xún)方式及實(shí)際應(yīng)用
- mysql?使用join進(jìn)行多表關(guān)聯(lián)查詢(xún)的操作方法
- MySQL聯(lián)合查詢(xún)之輕松實(shí)現(xiàn)數(shù)據(jù)關(guān)聯(lián)詳解
- mysql之跨庫(kù)關(guān)聯(lián)查詢(xún)(dblink)問(wèn)題
- Mysql逗號(hào)拼接字符串的關(guān)聯(lián)查詢(xún)以及統(tǒng)計(jì)問(wèn)題
- MySQL詳細(xì)講解多表關(guān)聯(lián)查詢(xún)
- Mysql 如何實(shí)現(xiàn)多張無(wú)關(guān)聯(lián)表查詢(xún)數(shù)據(jù)并分頁(yè)
- MySQL 多表關(guān)聯(lián)一對(duì)多查詢(xún)實(shí)現(xiàn)取最新一條數(shù)據(jù)的方法示例
- mysql實(shí)現(xiàn)多表關(guān)聯(lián)統(tǒng)計(jì)(子查詢(xún)統(tǒng)計(jì))示例
- mysql一對(duì)多關(guān)聯(lián)查詢(xún)分頁(yè)錯(cuò)誤問(wèn)題的解決方法
- mysql中的跨庫(kù)關(guān)聯(lián)查詢(xún)方法
- 實(shí)例講解Java的MyBatis框架對(duì)MySQL中數(shù)據(jù)的關(guān)聯(lián)查詢(xún)
- mysql關(guān)聯(lián)子查詢(xún)的一種優(yōu)化方法分析
- MySQL中表子查詢(xún)與關(guān)聯(lián)子查詢(xún)的基礎(chǔ)學(xué)習(xí)教程
相關(guān)文章
sql server中千萬(wàn)數(shù)量級(jí)分頁(yè)存儲(chǔ)過(guò)程代碼
sql server中千萬(wàn)數(shù)量級(jí)分頁(yè)存儲(chǔ)過(guò)程代碼...2007-04-04SqlServer中模糊查詢(xún)對(duì)于特殊字符的處理方法
這篇文章主要介紹了SqlServer中模糊查詢(xún)對(duì)于特殊字符的處理方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02Windows系統(tǒng)徹底卸載SQL?Server通用方法(推薦!)
卸載SQL是一件很麻煩的事,只要是重裝過(guò)SQL的人都知道,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)徹底卸載SQL?Server通用方法的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01SQL實(shí)現(xiàn)遞歸及存儲(chǔ)過(guò)程中In()參數(shù)傳遞解決方案詳解
這篇文章詳細(xì)介紹了SQL實(shí)現(xiàn)遞歸及存儲(chǔ)過(guò)程中In()參數(shù)傳遞解決方案,有需要的朋友可以參考一下2013-09-09將MS SQL SERVER數(shù)據(jù)庫(kù)運(yùn)行在普通用戶(hù)(獨(dú)立用戶(hù))狀態(tài)下的設(shè)置方法終結(jié)篇
最近接手了一臺(tái)服務(wù)器,里面安裝了sqlserver,為了安全考慮,我們將sqlserver在普通權(quán)限下運(yùn)行,這樣就不會(huì)因?yàn)閟qlserver的自身安全問(wèn)題,導(dǎo)致服務(wù)器成為肉雞的危險(xiǎn)。2010-05-05大數(shù)據(jù)量分頁(yè)存儲(chǔ)過(guò)程效率測(cè)試附測(cè)試代碼與結(jié)果
在項(xiàng)目中,我們經(jīng)常遇到或用到分頁(yè),那么在大數(shù)據(jù)量(百萬(wàn)級(jí)以上)下,哪種分頁(yè)算法效率最優(yōu)呢?我們不妨用事實(shí)說(shuō)話(huà)。2010-07-07SQL?Server?異地?cái)?shù)據(jù)庫(kù)每日同步作業(yè)操作圖文詳解
最近因?yàn)榻?jīng)常有攻擊,所以考慮到網(wǎng)站的安全問(wèn)題,所以多弄了幾臺(tái)服務(wù)器并實(shí)現(xiàn)數(shù)據(jù)庫(kù)與文件每天同步,這里主要介紹了sqlserver數(shù)據(jù)的每天同步問(wèn)題2024-04-04