大家好,我是寧一。
今天講解SQL教程第11課:INNER JOIN 內(nèi)連接。
前面的課程我們主要講了SQL的基本語法,只涉及到單張表的增刪改查。
但在實(shí)際業(yè)務(wù)中,往往需要多張表聯(lián)合查詢,這個(gè)就是我們接下來幾節(jié)課的主要內(nèi)容。
1、JOIN連接
多張數(shù)據(jù)表聯(lián)合查詢,需要用到JOIN連接,JOIN連接分為好幾種,先來簡單介紹一下,看不懂也沒關(guān)系,后面課程我們會(huì)舉實(shí)例介紹的。
INNER JOIN:內(nèi)連接,也可以只寫JOIN。只有進(jìn)行連接的兩個(gè)表中,都存在與連接標(biāo)準(zhǔn)相匹配的數(shù)據(jù)才會(huì)被保留下來,相當(dāng)于兩個(gè)表的交集。如果前后連接同一張表,也叫自連接。
LEFT JOIN: 左連接,也稱左外連接。操作符左邊表中符合 WHERE 子句的所有記錄將會(huì)被返回,操作符右邊表中如果沒有符合 ON 后面連接條件的記錄時(shí),那么從右邊表指定選擇的列的值將會(huì)是 NULL。
RIGHT JOIN: 右連接,也稱右外連接。會(huì)返回右邊表所有符合 WHERE 語句的記錄。左表中匹配不上的宇段值用 NULL 代替。
FULL JOIN:全連接,返回所有表中符合 WHERE 語句條件的所有記錄。如果任一表的指定宇段沒有符合條件的值的話,那么就使用 NULL 替代。
2、INNER JOIN 內(nèi)連接
JOIN 語句就是告訴SQL,我們應(yīng)該將哪幾張表通過哪幾個(gè)列連接起來。INNER JOIN 可以省略掉INNER直接寫成JOIN,是一個(gè)意思。
基本語法:
SELECT FROM JOIN ON a. = b. ;
實(shí)例:將Students學(xué)生表和Teachers教師表通過教師編號Tid連接起來。
SELECT *FROM Students AS sJOIN Teachers AS tON s.Tid = t.Tid
查看輸出的結(jié)果,我們可以發(fā)現(xiàn),F(xiàn)ROM后面的Students表會(huì)作為基礎(chǔ)表放在前面,后面在根據(jù)關(guān)聯(lián)列Tid,拼接上JOIN后面的Teachers表。
如果兩個(gè)表調(diào)換一下位置,會(huì)輸出什么樣的結(jié)果呢?我們來看看。
SELECT *FROM Teachers AS tJOIN Students AS sON t.Tid = s.Tid
可以看到,Teachers表會(huì)作為基礎(chǔ)表放在前面。
但是Teachers表中,老師有張三、李四、王五 3人,現(xiàn)在只輸出了張三、李四 2人,這是因?yàn)橥跷鍥]有對應(yīng)的學(xué)生。
內(nèi)連接,只有輸出兩個(gè)表中相互匹配的數(shù)據(jù),相當(dāng)于兩個(gè)表的交集。
JOIN…ON 后面也可以跟多個(gè)連接條件,條件之間用AND連接就可以了。
3、多表內(nèi)連接
JOIN不僅僅可以連接兩個(gè)表,3個(gè)表,4個(gè)表都可以,真實(shí)業(yè)務(wù)中,連接十幾個(gè)表也是常有的事。
基本語法:
SELECT FROM JOIN ON a. = b.JOIN ON a. = c.
實(shí)例:Students學(xué)生表同時(shí)連接Teachers教師表和Courses課程表,通過教師字段Tid連接。
SELECT *FROM Students AS sJOIN Teachers AS tON s.Tid = t.TidJOIN Courses AS cON s.Tid = c.Tid
4、USING關(guān)鍵字
當(dāng)JOIN…ON后面作為合并條件的列名,在兩個(gè)表中相同時(shí),可以用USING (……, ……) 取代 ON …… AND ……。
如果列名不一樣,不能用USING關(guān)鍵字簡化。這個(gè)知識點(diǎn)大家了解就好了,看到USING能知道是什么意思。
比如:
JOIN Teachers AS tON s.Tid = t.Tid AND s.Sname = t.Sname
可以簡化成:
JOIN Teachers AS tUSING (Tid,Sname)
5、自連接
表格不僅可以跟其他表進(jìn)行連接,也可以跟自己連接,就叫自連接。
我們舉個(gè)非常經(jīng)典的實(shí)例,作為我們的作業(yè)。
這個(gè)題是大廠經(jīng)常出的連續(xù)登錄問題,其中一種解法就是用的自連接。
作業(yè):編寫一個(gè) SQL 查詢,查找所有至少連續(xù)出現(xiàn)三次的數(shù)字,表名為:Num,表結(jié)構(gòu)如下:
作業(yè)解析:通過id+1的方式查找id下一次出現(xiàn)的數(shù)字,通過id+2的方式查找下下次出現(xiàn)的數(shù)字,只要下一次及下下次出現(xiàn)的數(shù)字和當(dāng)前出現(xiàn)的數(shù)字相同,即為滿足連續(xù)出現(xiàn)至少三次的數(shù)字。
SELECT DISTINCT a.numFROM Num aJOIN Num bON a.id+1 = b.idJOIN Num cON a.id+2 = c.idwhere a.num = b.numAND a.num = c.num
下節(jié)課,我們來講講OUTER JOIN外連接。
點(diǎn)擊關(guān)注,更新課程第一時(shí)間通知哦~