每日最新頭條.有趣資訊

趣談 JOIN 操作

作者 |趣談編程

責編 | Elle

在開發中我們有時需要跨表查詢某些東西

此時,我們就會使用數據庫表的連接

雙十二的戰爭

一天,慧能看著一塵愁眉苦臉的,便上前去問發生了什麽事情。

慧能

一塵

慧能:一塵,看你怎麽不高興鴨

一塵:現在實體店越來越不好做了,今年雙11銷量只有一兩台。

慧能:那當然,現在大家都習慣網購了

一塵:那該如何是好?

慧能:不如寫個交易平台網站吧,到時把咱們的商品放到網站上賣。

一塵:好呀好呀。

數據庫的設計

慧能:一塵,你來設計一下我們網站的數據庫表吧。

一塵:這個簡單,我們網站肯定有用戶吧。那我就先來個用戶表。

一塵隨手寫了個建表語句

一塵:看,我建了一個顧客表(CUSTOMER),裡面有兩個資料欄 : 顧客ID(C_ID)和顧客姓名(C_NAME)

這個顧客ID(C_ID)唯一標識了每一個顧客,就像身份證一樣,每個人都不一樣。

一塵話音剛落,又寫了一個建表語句

很快一塵就建好了另一張產品表,很顯然,產品表裡面可以存放自己想賣的手機(產品)。

同樣,產品ID(P_ID)是唯一的,標識一個產品。

師傅慧能一看,搖了搖頭

慧能:你這設計的也太簡單了吧,顧客只有姓名這個屬性嗎?性別,手機號等等呢?

罷了罷了,這個不提了,那我現在想要查詢哪位顧客買了哪件商品(產品)怎麽辦呢?

一塵:要不再加一個表保存顧客和產品的購買關係?

慧能:不用了,在產品表再加一個資料欄即可。

只見慧能給產品加了一個顧客ID(C_ID)資料欄。

慧能:通過產品表的顧客ID(C_ID)就可以建立起產品表和顧客表的關係了。

內連接的神奇功效

慧能:師傅師傅,我聽山下的李公子老說臨界區,這個臨界區是個什麽東西呀?

一塵:那現在怎麽查哪些用戶買了哪些產品了呢?

慧能:你想想

在一塵思考的過程中,慧能給兩張表插入了一些數據

一塵:咦,師傅,你把數據都準備好了。我想到了一種方法。

只見一塵隨手寫了一個SQL

慧能:嗯嗯,你這種方法也可以,但我們經常用的是 內連接

一塵:內連接?什麽鬼,沒聽過哎。

慧能清了清嗓子

所謂連接,就是兩張表根據關聯資料欄,組合成一個數據集。

上面兩張表的關聯資料欄就是顧客ID(C_ID).

組合的數據集就好像兩張表被粘(連接)在一塊,返回一個新的數據集合。

那返回的數據集合是兩張表的所有數據嗎?並不是,是有篩選條件的。

內連接指的是隻連接匹配上的行,也就是說隻返回兩張表匹配的記錄。

這裡的匹配指的是滿足篩選條件,下面會講。

內連接用關鍵字INNER JOIN(或者JOIN)表示。

慧能:舉個例子。

只見慧能隨手寫了一個SQL

可以看到這條SQL用內連接(INNER JOIN)把客戶表(CUSTOMER)和產品表(PRODUCT)連接起來了。

連接時的篩選條件是客戶表的ID(C.C_ID)和產品表的客戶ID(P.C_ID)相等。

篩選條件在關鍵字ON後面(ON C.C_ID=P.C_ID)

這個篩選條件就是篩選兩個表記錄的條件,滿足這個篩選條件就是兩張表的兩條記錄匹配上了。

內連接就是只有客戶表中的C_ID等於產品表中的C_ID,此時才會返回這兩張表中匹配的記錄。

所以很顯然,查詢的結果為:

隻顯示C_NAME 和 P_NAME 是因為當時 SELECT 的時候就隻選擇了這兩列。

這樣就通過內連接查出了誰買了你的手機了。除了內連接還有左連接,右連接,全連接。

其他的SQL連接

理解了內連接,其他三種連接就很好理解了。

其實用韋恩圖來表示SQL的各種連接時比較好理解的。上面說的內連接可以這樣表示:

圖片來自阮一峰的網絡日誌

可以看到,內連接(Inner Join)就是取兩個表相同的那一部分。

左連接

圖片來自阮一峰的網絡日誌

可以看到,左連接就是取左邊的表的所有記錄和右表中匹配的行。

還是用上面的表舉例。

如果讓顧客表當左邊的表(左表),產品表當右表。左表 LEFT JOIN 右表會發生什麽?

慧能隨手寫了個SQL

慧能在腦子裡運行了一下,只見他畫了兩幅圖。

可以看到:LEFT JOIN返回左表的全部記錄和右表滿足ON條件的記錄,如果左表的記錄在右表中沒有匹配,那麽這一條記錄在右表中對應數據用NULL代替

右連接

圖片來自阮一峰的網絡日誌

可以看到,右連接就是取右邊的表的所有記錄和左表中匹配的行。

同理寫一個SQL:

可以看到:RIGHT JOIN返回右表的全部記錄和左表滿足ON條件的記錄,如果右表的記錄在左表中沒有匹配,那麽這一條記錄在左表中對應數據用NULL代替。

全連接

圖片來自阮一峰的網絡日誌

可以看到,全連接(Full Join)返回兩個表中所有的記錄。

按照慣例寫個SQL:

可以看到:全連接(Full Join)返回兩個表中所有的記錄,如果其中一個表的記錄在另一個表中沒有匹配記錄,那麽對面的數據用NULL代替

注意:全連接(FULL JOIN)MySql 不支持,Oracle支持。

一塵:哇,原來SQL連接有這麽多玩法,漲知識了。我趕緊去寫網站去了,希望雙十二能夠大賣。

慧能:好好好,趕緊去吧

看著一塵高興的背影,慧能露出了欣慰的笑容。

聲明:本文為作者投稿,版權歸作者個人所有。

【End】

Python系列學習成長課來了!15年經驗專家、CSDN特級講師親自授課,還等什麽?立即掃碼報名學習:

熱 文推 薦文推 薦

獲得更多的PTT最新消息
按讚加入粉絲團