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表中没有空值,所以表最终连接生成的结果中,依然会空值

 “咳咳咳”,讲完这一大堆话后,大爷吐了一口老痰口水,端着泡有洞庭碧螺春的盖完,悠然道,“今天的课程就到这里了,听完这些之后,对于你女神究竟有没有把你但当备胎,以及你是你女神的第几个备胎,你就应该有点避暑了。”

听完大爷这一番醍醐灌顶的课程后,李有为终于明白了关系型数据库的精髓所在。不同的表因为某些相同的字段而产生联系,这种感悟忽然从技术上升到了哲学层面,朦朦胧胧间,十六岁那年上哲学课的场景浮现在他眼前。

联系具有普遍性、客观性、多样性、条件性、可变性。我们应该用联系的观点看问题……

 想着想着,他忍不住哼起了那首经典老歌《涛声依旧》

月落乌啼总是千年的风霜,涛声依旧不见当初的夜晚,今天的你我,怎样重复昨天的故事。这一张旧船票,怎样才能登上你的破船?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值