MySQL從刪庫到跑路(7):連接查詢,用聯繫的觀點看女神與渣男

 "有爲,能陪我說說話麼?”

 望着梨花帶雨的女神,一時間李有爲陷入了恍惚之中,儘管心裏已經千萬次告誡自己要遠離面前的女人,可是當她真的出現在面前時,李有爲的大腦早已一片空白。

 "難道他又欺負你了嗎?"李有爲吞吞吐吐道。

 “不!“女神的眼淚突然決堤而出,”他沒有欺負我,是我自己太任性了,明知道他那麼愛打遊戲,還讓他在遊戲和我之間做一個選擇……”

 "你……不要難過了好麼?“李有爲溫言道,“你的痛就是我的痛,你的微笑就是我倆的歡樂”話畢,他難處手機,打開微信,找到了女神的男朋友,胸中懷着滿腔怒火,咬牙切齒髮了一句消息:“哥們兒,求你和她說句話吧,這樣她就不會那麼難過了!”

 過了好一會兒,對面纔回了一句消息,“你是誰?你說的“她”是哪個她?”

 李有爲擡頭望天,清空萬里的天空忽然烏雲密佈,一陣驚雷自九天而下,大雨滂沱而來,學校裏的人們都匆忙往宿舍趕,唯有李有爲獨自一人走進了大雨中,淚水順着臉頰而下,混合着雨水流入了蒼茫大地……

 暴雨如注,打得人人睜不開眼睛,大雨之中,一人手持雨傘,信步走來,一邊走,一邊高聲觸唱道:滾滾紅塵裏,舔狗何其多。我曾狂舔誰?誰來狂舔我?

 “前輩,打人不打臉,你這傷口上撒鹽就有點過分了。”

 “你心痛嗎?”

 “悲痛莫名!”

 “那好,那就化悲憤爲力量,開始學習吧!學完今天的課程,這個學校有多少渣男,你將一目瞭然。

 讓我們來先看一下列子,這裏有一張表human_relation_info,表裏面有三個字段,id,id_card1,id_card2,其中id_card1是腳踏多隻船的渣男,id_card2是被渣男欺騙的純真少女。

 請問,該怎樣迅速的找出渣男和被渣男欺騙的純真少女的信息。
在這裏插入圖片描述
 李有心想,這有何難,渣男的id_card都在哪裏,直接拿到human_base_info表去查就可以了。

SELECT
	* 
FROM
	human_base_info 
WHERE
	id_card = 'hx362425199801265945'

在這裏插入圖片描述
 朱三衡,沒想到表面風度翩翩,溫文爾雅的班長朱三衡竟然是這樣的一個渣男,李有爲的女神陶齊郡對她愛的死去活來,沒想到他竟然在外面沾花惹草,瞎幾把搞。想着,李有爲不禁握緊的拳頭,他要看一看究竟朱三衡,究竟騙了那些女孩。

 那些女孩的id_card都記錄在id_card2字段上,所以一個子查詢就可以搞定

SELECT
	* 
FROM
	human_base_info 
WHERE
	id_card in (
		SELECT
		id_card2 
	FROM
		human_relation_info
	)

在這裏插入圖片描述
 芽兒喲,你個朱三衡,面帶豬像,心頭嘹亮。泡得全是學校的班花、系花、院花、校花,這也太過分了,又高、又富、又帥就可以爲所欲爲嗎?

抱歉,高富帥就是可以爲所欲爲。出來混,捱打要認,捱罵要立正,是個屌絲你就要承認。連MySQL的連接查詢都不會用,你怎麼和高富帥鬥?你憑什麼追女神?

今天,我就好好的給你講一講,什麼叫連接查詢!

 連接查詢是幾乎所有數SQL最強大的功能之一,它能夠在數據查詢的時候,執行聯表查詢。我們通常說MySQL是關係型數據庫,關係型數據庫的內涵是什麼?可能一千個人會有一千種會說,但是在我這裏,對不起,你只需要知道,關係型數據庫設計的基礎是關係表,存在着一定的關聯關係,通過某些共同的值相互關聯的表就是關係表。

 human_relation_info和human_base_info這兩張表其實就是關係表,它們通過id_card這個字段產生關聯關係。

 爲什麼要讓不同的表有關聯關係?

 就拿human_base_info表和human_relation_info表來說

首先,節省空間,如果把兩張表放到一起,我既要知道男生的信息,又要知道女生的信息整合這兩張表的信息就成了個難題。

其次,便於管理,不管你這個渣男怎麼渣,不管你泡妞的數量增加了還是減少了,我只需修改human_relation_info,無論怎麼樣也不會對human_base_info表有影響。

(最後,安全,偷偷摸摸的渣遠比光明正大的渣要來的安全……………………)

 那麼我們該如何利用這種關聯關係呢?

 那就要有請今天的主角,連接查詢三巨頭,內連接查詢,左外連接查詢,右外連接查詢,閃亮登場!
(因爲工作使用評率以及劇情發展的關係,目前就講這三個。)

1、內連接查詢(inner join)

關鍵詞:inner join on
用法:select a.,b. from tablea as a inner join table b on a.xxx=b.xxx,(on表示篩選條件,取a表的xxx字段和b表的xxx字段相等的集合)
說明:內連接的靈魂其實可以看做兩個集合取交集。
在這裏插入圖片描述

 清楚了內連接查詢之後,現在我們想要一步到位知道高富帥朱三衡的幸福生活就一目瞭然了。

 用human_relation_info的id_card2字段和human_base_info的id_card字段做連接,那些被矇在鼓裏的妹子的信息就知道了。

SELECT
	b.name,
	b.age,
	b.height,
	b.looks
FROM
	human_relation_info AS a
	INNER JOIN human_base_info AS b 
	ON a.id_card2 = b.id_card

在這裏插入圖片描述
注意,我這裏用了個關鍵詞“as”,as的用法就是取別名,比如上面這裏,我給表human_base_info 和human_relation_info分別去了一個別名,這樣我SQL代碼裏面用他們的時候就不用寫全稱了。

 “爲了讓你更容易理解 as ,我給你舉一個很形象的例子,比方說你名字叫“舔狗舔狗舔到一無所有李有爲”,現在你覺得太繞口,給自己取了個小名叫“舔狗有爲”,原來想要讓你和我一起去看美女,我需要這樣叫——“舔狗舔狗舔到一無所有李有爲,走,我們去看美女”,現在我只需要這樣叫——“舔狗有爲,走,我們去看美女。”

舔狗舔狗舔到一無所有李有爲 as 舔狗有爲

 “是不是很形象?是不是很生動?是不是很容易理解?”

 “前輩,等一等!“李有爲被說的冷汗直流連忙轉移話題,“””你這不是也沒有一步到位麼?雖然我現在確實知道渣男是朱三衡,但是怎麼也的把朱三衡的名字展示出來才靠譜吧。”

 “我就知道你龜兒子要這樣刁難我,但是你覺得你能難得住我嗎?我且問你,A和B取交集後的結果,在和A取一下交集,是不是還是等於A和B取交集。”

 “是這麼個道理,那不就對了嘛!再取一次交集唄!”

 “我第一次是用human_relation_info的id_card2字段做關聯取交集,然後我再用id_card1做關聯取交集,最後select我想要的字段不就可以了麼

SELECT
	c.name AS boy_name,
	b.name AS girl_name,
	b.age,
	b.height,
	b.looks
FROM
	human_relation_info AS a
	INNER JOIN human_base_info AS b 
	ON a.id_card2 = b.id_card
	INNER JOIN human_base_info AS c
	ON a.id_card1=c.id_card
-- 這裏對字段也取了別名
-- 用id_card2關聯human_base_info,可以得到女生的信息,b.name
-- 用id_card1關聯human_base_info,可以得到男生的信息,c.name
-- 爲了不引起混淆,所以去一個別名

在這裏插入圖片描述
 看到這裏,李有爲翻開了朱三衡的朋友圈。他的朋友圈每天都會分享文藝到爆的一些句子,李有爲橫豎看不懂,仔細看了半夜,才從字縫裏看出字來,每天朋友圈都寫着兩個字都是‘渣男’!

2、左連接查詢(left join)

關鍵詞:left join on
用法:select a.,b. from tablea as a left join table b on a.xxx=b.xxx
說明:left join 是left outer join的簡寫,它的全稱是左外連接,左表(A)的記錄將會全部表示出來,而右表(B)只會顯示符合搜索條件的記錄。右表記錄不足的地方均爲NULL。
在這裏插入圖片描述
 爲了更好的理解左連接,我要給你講一個很振奮人心的例子你的那個班長朱三衡確實很帥,確實跑了很多妹子,但是你要換個角度想,他再帥,再有錢又有什麼用,難道還能渣盡全天下的妹子不成?當然不可能!那麼怎樣看還沒有被朱三衡渣過的妹子呢,這個時候,就需要使用做外鏈接查詢了。

 用human_base_info表爲左表,human_relation_info爲右表,左表是所有人的信息,右表是朱三衡泡到的妹子的id_card,只需要做一下left join,如果返回的結果在右表中時null,那麼就表示這個妹子沒有遭到渣男的魔爪。

SELECT
	a.id,
	a.NAME,
	a.height,
	a.age,
	a.looks,
	b.* 
FROM
	human_base_info AS a
	LEFT JOIN human_relation_info AS b ON a.id_card = b.id_card2 
WHERE
	a.sex = 'F' 

在這裏插入圖片描述

3、右外連接查詢(right join)

關鍵詞:right join on
用法:select a.,b. from tablea as a right join table b on a.xxx=b.xxx
說明:right join 是right outer join的簡寫,它的全稱是右外連接,右表(B)的記錄將會全部表示出來,而左表(A)只會顯示符合搜索條件的記錄。左表記錄不足的地方均爲NULL。
例子與left join 有異曲同工之妙,不做過多的講解。
在這裏插入圖片描述

4、on 和where的區別

 上面有段SQL我們同時用到了on和where,那麼我們就要講一下on和where 的區別,on和where都表示篩選條件,但是兩個的執行順行不一樣,on先執行,where後執行。

 區別:on是在兩個表連接時使用的篩選條件,而where是在表連接之後,對最終結果集進行篩選的條件

SELECT
	a.id,
	a.NAME,
	a.height,
	a.age,
	a.looks,
	b.* 
FROM
	human_base_info AS a
	LEFT JOIN human_relation_info AS b ON a.id_card = b.id_card2  and a.sex='F'
	
-- 這兩句SQL最終的結果都是一樣的,但是不同的點就在於
-- 一個是在表連接的時候就把sex當做條件做篩選
-- 一個是在表連接之後,對最後的結果集進行sex篩選

SELECT
	a.id,
	a.NAME,
	a.height,
	a.age,
	a.looks,
	b.* 
FROM
	human_base_info AS a
	LEFT JOIN human_relation_info AS b ON a.id_card = b.id_card2 
WHERE
	a.sex = 'F' 

 然後我們在看另外一個情況

SELECT
	a.id,
	a. NAME,
	a.height,
	a.age,
	a.looks,
	b.*
FROM
	human_base_info AS a
LEFT JOIN human_relation_info AS b ON a.id_card = b.id_card2
AND a.sex = 'F'
WHERE
	b.id IS NOT NULL
	
------------------------------

SELECT
	a.id,
	a.NAME,
	a.height,
	a.age,
	a.looks,
	b.* 
FROM
	human_base_info AS a
	LEFT JOIN human_relation_info AS b ON a.id_card = b.id_card2  
	and a.sex='F'  and b.id is not null 

第一句SQL執行結果
在這裏插入圖片描述
第二句SQL執行結果
在這裏插入圖片描述
第一句SQL在連接表後,對最後生成的結果集做篩選,篩選 id is not null的數據,所以最終的結果沒有空值

第二句SQL在連接表的時候篩選 b表中id is not null的數據,但是這個時候b表中沒有空值,所以表最終連接生成的結果中,依然會空值

 “咳咳咳”,講完這一大堆話後,大爺吐了一口老痰口水,端着泡有洞庭碧螺春的蓋完,悠然道,“今天的課程就到這裏了,聽完這些之後,對於你女神究竟有沒有把你但當備胎,以及你是你女神的第幾個備胎,你就應該有點避暑了。”

聽完大爺這一番醍醐灌頂的課程後,李有爲終於明白了關係型數據庫的精髓所在。不同的表因爲某些相同的字段而產生聯繫,這種感悟忽然從技術上升到了哲學層面,朦朦朧朧間,十六歲那年上哲學課的場景浮現在他眼前。

聯繫具有普遍性、客觀性、多樣性、條件性、可變性。我們應該用聯繫的觀點看問題……

 想着想着,他忍不住哼起了那首經典老歌《濤聲依舊》

月落烏啼總是千年的風霜,濤聲依舊不見當初的夜晚,今天的你我,怎樣重複昨天的故事。這一張舊船票,怎樣才能登上你的破船?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章