今天完成的事情:
修改excel,添加了一些遗漏的表,添加/修改了一些字段,调整了表结构,修改了部分bug
了解数据库三范式
明天计划的事情:
继续学习
遇到的问题:
把写好的excel表放入idea,想运行但是没成功,excel表看不出问题

收获:
数据库第三范式:
什么是范式?
范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所有遵循的规则和指导方法
目前一共有8种范式,其中最常用的是前三个范式,即第一,第二,第三范式
第一范式(1NF)
强调列的原子性,即列不能够再分成其他几列
例子:
一个表(联系人)里有姓名,性别,电话
假设一个联系人有家庭电话和公司电话,那么这个表结构设计就没有达到1NF,要符合的话把列(电话)拆分即可
最终结果为姓名,性别,家庭电话,公司电话
第二范式(2NF)
首先是1NF,另外包含两部分内容
一是表必须有一个主键
二是没有包含在主键中的列必须完全依赖主键,而不能只依赖主键的一部分
例子:
订单表:订单号,产品号,折扣,单价,数量,产品名称
因为知道在一个订单中可以订购多种产品,所以一个订单号是不足以称为主键,主键应该是订单号和产品号
而折扣和数量完全依赖订单号和产品号,而单价和产品名称只依赖于产品号,所以可以拆分为两个表
订单表:订单号,产品号,折扣,数量
产品表:产品号,数量,产品名称
用两个表来消除原有订单中数量,产品名称多次重复的情况
第三范式(3NF)
首先是2NF,另外非主键必须直接依赖于主键,不能存在传递依赖.
也就是不能存在:非主键列A依赖于非主键列B,非主键列B依赖于主键的情况
例子:
订单表:订单号,订单日期,客户号,客户名字,客户地址,客户城市
非主键完全依赖于主键订单号,所以符合2NF
但问题是客户名字,客户地址,客户城市完全依赖的是客户号(非主键类),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合3NF
解决方法:还是拆分成两个表:
订单表:订单号,订单日期,客户号
客户表:客户号,客户名字,客户地址,客户城市
从而达到3NF
第二范式和第三范式容易混淆,区别关键点在于
2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分.
3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列
查询排名:
思路:有点类似循环里的自增,设置一个变量并赋予初始值,循环一次自增加1,从而实现排序.
mysql里则需要先将数据查询出来并先行按照需要排序的字段做好降序desc,或升序asc,设置好排序的变量(初始值为0)
1:将已经排序好的数据从第一条一次取出来,取一条就自增加1,实现从1到最后的一个排名
2:当出现相同的数据时,排名保持不变,此时则需要再设置一个变量,用来记录上一条数据的值,跟当前数据的值进行对比,如果相同,则排名不变,不相同则排名自增加1
3:当出现相同的数据时,排名保持不变,但是保持不变的排名依旧会占用一个位置,也就是(1,2,2,2,5)这种排名就是属于中间的三个排名是一样的,但是第五个排名按照上面的情况是(1,2,2,2,3)现在则是排名相同也会占据排名的位置
例子:
首先,要建一个表

建成后,添加测试数据

之后表里是这样的

不管数据是否相同,排名按123456依次排序

可以看到,现在按照分数从1到9都排好序了,但是有些分数相同的用户排名却不一样,这就是接下来要说的第二种sql


这时候就新增加了一个变量,用于记录上一条数据的分数了,只要当前数据分数跟上一条数据的分数比较,相同分数的排名就不变,不相同分数的排名就加一,并且更新变量的分数值为该条数据的分数,依次比较
跟第一条sql的结果相对比,分数相同的排名也相同,并且最后一名的名次由第9名变成了第7名;
评论