SQL語(yǔ)句中不同的連接JOIN及join的用法
為了從兩個(gè)表中獲取數(shù)據(jù),我們有時(shí)會(huì)用JOIN將兩個(gè)表連接起來(lái)。通常有以下幾種連接方式:
JOIN or INNER JOIN(內(nèi)連接) : 這兩個(gè)是相同的,要求兩邊表同時(shí)有對(duì)應(yīng)的數(shù)據(jù),返回行,任何一邊缺失數(shù)據(jù)就不顯示。
LEFT JOIN(左外連接):即使右邊的表中沒(méi)有匹配,也從左表返回所有的行。
RIGHT JOIN(右外連接):即使左邊的表中沒(méi)有匹配,也從右表返回所有的行。
FULL JOIN(全外連接):只要其中一個(gè)表中存在匹配就返回行。
如例,有g(shù)rade表(課程號(hào)sn,分?jǐn)?shù)scroe,學(xué)號(hào)id),student表(學(xué)號(hào)id,學(xué)生姓名name),要查詢學(xué)生的姓名和成績(jī)
當(dāng)JOIN或是INNER JOIN時(shí),
SELECT s.name,g.sn,g.score from student as s join grade as g on s.id = g.id
或者
SELECT s.name,g.sn,g.score from student as s inner join grade as g on s.id = g.id
結(jié)果集如下
當(dāng)LEFT JOIN時(shí),
SELECT s.name,g.sn,g.score from student as s left join grade as g on s.id = g.id
結(jié)果集如下
當(dāng)RIGHT JOIN時(shí),
SELECT s.name,g.sn,g.score from student as s right join grade as g on s.id = g.id
結(jié)果集如下
當(dāng)FULL JOIN時(shí),
SELECT s.name,g.sn,g.score from student as s full join grade as g on s.id = g.id
結(jié)果集如下
注意,兩個(gè)表連接時(shí)用on,在使用left join(right join或full join)時(shí),on與where的區(qū)別是:
on條件是在生成臨時(shí)表時(shí)使用的條件,它不管on中的條件是否為真,都會(huì)返回左邊表中的記錄
where條件是在臨時(shí)表生成好后再對(duì)臨時(shí)表進(jìn)行過(guò)濾的條件,這時(shí)已經(jīng)沒(méi)有l(wèi)eft join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過(guò)濾掉。如下圖,
on條件為黃色部分
SELECT s.name,g.sn,g.score from student as s left join grade as g on s.id = g.id and score =90
SELECT s.name,g.sn,g.score from student as s left join grade as g on s.id = g.id where score =90
下面看下SQL中join的各種用法
1.自然連接(natural join)
自然連接將表中具有相同名稱的列自動(dòng)進(jìn)行匹配,自然連接不必指定任何同等連接條件也不能認(rèn)為指定哪些列需要被匹配,自然連接得到的結(jié)果表中,兩表中名稱相同的列只出現(xiàn)一次。
select * from employee natural join department;
2.內(nèi)連接(inner join):產(chǎn)生的結(jié)果是A和B的交集(相同列里面的相同值)
內(nèi)連接查詢能將左表和右表中能關(guān)聯(lián)起來(lái)的數(shù)據(jù)連接后返回,返回的結(jié)果就是兩個(gè)表中所有相匹配的數(shù)據(jù)。
select * from TableA as A inner join TableB B on A.PK = B.PK; select * from TableA as A inner join TableB B on A.PK > B.PK;
3.外連接(outer join)
內(nèi)連接是要顯示兩張表的內(nèi)存,而外連接不要求如此,外連接可以依據(jù)連接表保留左表,右表或全部表的行為而分為左外連接右外連接和全連接。
select * from TableA as A left(right/full) join TableB as B on A.PA = B.PK;
Full Join:產(chǎn)生的結(jié)果是A和B的并集(如果沒(méi)有相同的值會(huì)用null作為值)
Left Join:產(chǎn)生表A的完全集,而B表中匹配的則有值(沒(méi)有匹配的則以null值取代)
Right Join:產(chǎn)生表B的完全集,而A表中匹配的則有值(沒(méi)有匹配的則以null值取代)
4.交叉連接(cross join)
又稱笛卡爾連接,交叉連接返回兩個(gè)集合的笛卡爾積。
select * from TableA cross join TableB;
參考鏈接:http://mazhuang.org/2017/09/11/joins-in-sql/
總結(jié)
以上所述是小編給大家介紹的SQL語(yǔ)句中不同的連接join及join的用法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
不同數(shù)據(jù)庫(kù)之間導(dǎo)入導(dǎo)出功能介紹
在SQL Server中使用最廣泛的就是通過(guò)SELECT INTO語(yǔ)句導(dǎo)出數(shù)據(jù),SELECT INTO語(yǔ)句同時(shí)具備兩個(gè)功能2010-12-12SQL為什么不建議執(zhí)行超過(guò)3表以上的多表關(guān)聯(lián)查詢
mysql是往簡(jiǎn)單化方向去設(shè)計(jì)的,如果多個(gè)表關(guān)聯(lián)查詢(超過(guò)3張表)效率上是比不上PG的,本文就詳細(xì)的介紹一下原因,感興趣的可以了解一下2022-03-03sql server創(chuàng)建復(fù)合主鍵的2種方法
sql server創(chuàng)建復(fù)合主鍵的2種方法,需要的朋友可以參考一下2013-02-02SQL(MSSQLSERVER)服務(wù)啟動(dòng)錯(cuò)誤代碼3414的解決方法
這篇文章主要介紹了SQL(MSSQLSERVER)服務(wù)啟動(dòng)錯(cuò)誤代碼3414的解決方法,需要的朋友可以參考下2016-03-03將表里的數(shù)據(jù)批量生成INSERT語(yǔ)句的存儲(chǔ)過(guò)程 增強(qiáng)版
這篇文章主要介紹了將表里的數(shù)據(jù)批量生成INSERT語(yǔ)句的存儲(chǔ)過(guò)程 增強(qiáng)版的相關(guān)資料,需要的朋友可以參考下2015-12-12SQL Server日期加減函數(shù)DATEDIFF與DATEADD用法分析
這篇文章主要介紹了SQL Server日期加減函數(shù)DATEDIFF與DATEADD用法,結(jié)合分析SQL Server使用DATEDIFF與DATEADD函數(shù)獲取常見的周、月、天等日期相關(guān)運(yùn)算技巧,需要的朋友可以參考下2017-03-03win7系統(tǒng)安裝SQLServer2000的詳細(xì)步驟(圖文)
這篇文章主要介紹了win7系統(tǒng)安裝SQLServer2000的詳細(xì)步驟,里面有一些需要注意的事項(xiàng),大家可以參考下2014-07-07MyBatis實(shí)踐之動(dòng)態(tài)SQL及關(guān)聯(lián)查詢
MyBatis,大家都知道,半自動(dòng)的ORM框架,原來(lái)叫ibatis,后來(lái)好像是10年apache軟件基金組織把它托管給了goole code,就重新命名了MyBatis,功能相對(duì)以前更強(qiáng)大了。本文給大家介紹MyBatis實(shí)踐之動(dòng)態(tài)SQL及關(guān)聯(lián)查詢,對(duì)mybatis動(dòng)態(tài)sql相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-03-03