大家好,欢迎收看思路实验室出品的Python入门教程,我是室长。
可能大家在平时的工作生活中都经历过填表的情况,有时候办个事要填上厚厚一沓表格,虽然不同的表格用途各异,但总会免不了有相同的部分,比如姓名性别年龄民族手机号什么的,填多了也是手酸。明明是同一个人同样的信息,因为表格不同而不得不填很多遍,既浪费时间又浪费精力,外加浪费纸。
手写的表格只能这样,但数据库这么高科技的东西总不应该这样吧?我们总得想想办法减少这些浪费。之前的问题出在哪里?很多固定的信息需要重复写。比如张三,男,25岁,手机号13812345678,我们可以把这一条信息单独存入一个表格,再为这条数据取一个唯一的名字,毕竟张三太多了很可能重名。这个唯一的名字怎么取?可以按适用范围来。如果表格涉及全国范围那么用身份证号最为合适,如果是学校就可以用学号、教师号,单位就可以用工号,总之宗旨就是要唯一。这样的话我们在主表中就只需要填写这个唯一的名字,数据库就可以根据这个名字在存固定信息的表格中查找到这条数据,并和主表的其余信息一起送到我们眼前,就像是一对男女因为某个共同点而最终牵手成功。
这种利用两个表格中共同的字段将两个表格中的数据整合到一起的过程就叫做连接。
有的同学可能就说了,这不就是excel的vlookup函数的功能吗?没错,但是室长个人觉得excel的vlookup并没有数据库的连接这么好用,很容易失败,因为excel并不指定某列的数据类型,很容易匹配不上。而数据库的字段类型是预先定义的,只要两个表中的共同字段类型一致就不会出问题。
那么该如何进行连接呢?先别急,现在有个问题我们还没有解决。上边的图看起来如此的自然是因为每条数据都能够连接成功,但如果数据是这样的呢?
这样数据看起来就参差不齐了,无论哪个表格都有连接不上的。但我们可以选择展示或不展示这些连接不上的数据。比如我们就不想展示,希望结果是这样的:
这种连接方式被称为内连接(inner join),特点就是只有连接成功的才能出现在镜头里。
我们也可以展示所有数据,即便没有连接成功:
这种连接方式被称为全连接(full join),特点就是无论连接成功与否都能出镜。
当然,我们还可以选择展示一个表中的所有数据,而不展示另一个表中连接失败的数据:
上图的连接方式被称为左外连接(left outer join)或左连接(left join),是以外出记录为左表,基础信息为右表进行的连接,保留了左表的所有信息,而不展示右表连接失败的数据。如果左右表互换而又想得到上图的结果就需要使用右外连接(right outer join)又称右连接(rigth join)。
了解了这四种连接方式,连接的操作就没有多大问题了。不过并非所有的关系型数据库都支持这四种连接方式,比如我们之前所学的SQLite就只支持内连接和左外连接。不过左外连接也是非常通用的连接方式,能够支持我们完成大部分的数据库操作。
在数据库中,连接是为了查询所服务的,所以连接的语句从属于SELECT语句,只不过FROM引导的不再是数据库现有的表,而是连接后生成的新表,就像这样:
这里LEFT JOIN可以替换成任意的连接方式,只要数据库支持即可,在LEFT JOIN左边的是左表,在右边的则是右表,而ON引导的是一个判断语句,判定两个表的某个字段为共同字段。
我们继续以家庭小药箱为例。我们之前写的药名并不很严谨,但每条都写全称又很麻烦。所以我们把药品信息单独写入一个表中:
这样我们就有两个表了:
然后我们给Med_Info表添加一些数据:
现在来看我们Medicine表中的medicine_name字段名就不那么合适了。但SQLite不支持删除列,有一些迂回的方法比较麻烦,我们这里就不管这个字段了,直接添加一个字段,需要使用ALTER语句,大概是这样的:
然后根据Med_Info中的Id信息将数字填入medicine_id列中,回忆一下UPDATE语句:
一切的准备工作都做好了,现在就可以进行连接了:
连接的目的是尽量减少数据的冗余,减少重复性的工作,而这部分构思最好在数据库的设计时就完成。这一期我们花了不少时间去修改数据库的结构,是因为在一开始我们还不了解这样的功能。其实不管是数据库还是编程语言什么的,懒字都是核心,用最少的操作,最少的时间空间来完成复杂的事情。如果这篇文章对你有所帮助,希望能帮室长点个赞和在看,你的鼓励是室长进步的动力!
领取专属 10元无门槛券
私享最新 技术干货