大家好!我是黄啊码,上一节的知识点你了解多少了,掌握了多少了,别偷懒哦,今天我们来将就爱你改数据定义语言,说得高级点就是Data Definition Language,简称DDL。
很多同学对DDL的了解都是在于数据库的增、删、改、查,那下边我们就具体来讲讲。
1、创建删除数据库
CREATE DATABASE user; // 创建一个名为 user的数据库
DROP DATABASE user; // 删除一个名为 user的数据库
2.对数据表进行定义
创建表结构的语法是这样的:
CREATE TABLE table_name
比如我们在用户数据库中创建user_info这个表
CREATE TABLE user_info (
user_id int(11) NOT NULL AUTO_INCREMENT,
user_name varchar(255) NOT NULL
);
如上,我们创建了一个叫做user_info的表, 里面有两个字段,一个是 user_id ,它是 int 类型,另一个 user_name 字段是varchar(255)类型。这两个字段都不为空,且 user_id 是递增的,而其中的not null表示非空,切记语句最后要加;【千万要记住】AUTO_INCREMENT代表主键自动增长。有刚入门的同学说什么是主键?>>文章后边我会单纯讲述,别着急。
然而在实际工作中,我们肯定很少写过DDL,这里啊码用Navicat代替,它是一个数据库管理和设计工具,跨平台,支持很多种数据库管理软件,比如 MySQL、Oracle、MariaDB 等,当然你有更好、更符合自己编码的工具也是可以的,不做强制。
我们还可对user_name字段进行索引,索引类型为Unique。使用 Navicat 设置如下:
相信这时候很多同学又会问我,什么是索引,额,这个如果展开出来会比较长,我们放在后边单独一节课讲就行,啊码只告诉你,索引是把双刃剑,用得好,查得爽,用不好,鱿鱼炒。
3、操作表结构
在创建表结构之后,我们还可以对表结构进行修改,虽然直接使用 Navicat进行操作,但对于刚入门的你,有必要了解如何使用 DDL 命令来完成表结构的修改。
1、添加字段,比如我在数据表中添加一个 age 字段,类型为int(11)
ALTER TABLE user_info ADD (age int(11));
2、修改字段名,将 age 字段改成user_age
ALTER TABLE user_info RENAME COLUMN age to user_age
3、修改字段的数据类型,将user_age的数据类型设置为float(3,1)
ALTER TABLE user_age MODIFY user_age float(3,1);
我看到不少教程写成这样
ALTER TABLE user_age MODIFY user_age (float(3,1));
然后执行起来就芭比Q了
4、 删除字段, 删除刚才添加的user_age字段
ALTER TABLE user_info DROP COLUMN user_age;
好了,到这里,我们就开始讲讲上边所说的数据库的常见约束:
主键约束
表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。
作用:
1)保证实体的完整性;
2)加快数据库的操作速度
3)在表中添加新记录时,DBMS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。
4)DBMS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。
外键约束
确保了表与表之间引用的完整性。一个表中的外键对应另一张表的主键。外键可以是重复的,也可以为空。比如 user_id 在 user_info 表中是主键,如果你想设置一个成绩表即 user_score,就可以在 user_score 中设置 user_id 为外键,关联到 user_info 表中。
唯一性约束
唯一性约束表明了字段在表中的数值是唯一的,即使我们已经有了主键,还可以对其他字段进行唯一性约束。需要注意的是,唯一性约束和普通索引(NORMAL INDEX)之间是有区别的。唯一性约束相当于创建了一个约束和普通索引,目的是保证字段的正确性,而普通索引只是提升数据检索的速度,并不对字段的唯一性进行约束。
NOT NULL 约束。对字段定义了 NOT NULL,即表明该字段不应为空,必须有取值。
DEFAULT,表明了字段的默认值。如果在插入数据的时候,这个字段没有取值,就设置为默认值。比如我们将user中的身高 height 字段的取值默认设置为 0.00,即DEFAULT 0.00。
CHECK 约束,用来检查特定字段取值范围的有效性,CHECK 约束的结果不能为 FALSE,比如我们可以对身高 height 的数值进行 CHECK 约束,必须≥0,且<300,但在常见的数据库操作中,我们很多时候都会把这类约束放在前后端一起结合验证
数据表设计原则及三范式
第一范式(1NF)
每一列属性都是不可再分的属性值,确保每一列的原子性
合理的根据实际业务数据需求来决定属性,合并相似或相同的列,避免冗余
比如你弄了一个用户表,但有个列叫做身体部位,可身体部位还能继续分,比如五官之类的。
第二范式(2NF)
需要确保数据库表中的每一列都和主键相关,如果是联合主键,则需要和所有主键均相关而不能只与主键和某一部分相关
在一个数据库表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中
这个就好理解了,在我们生活中,我们喜欢分类收纳,就跟垃圾分类一样,你总不能湿垃圾和干垃圾丢在一起吧【我们只说常规操作,不要杠哈】
第三范式(3NF)
确保数据表一个记录中的数据都和主键直接相关,而不是间接相关,不能存在传递关系
属性不依赖于其他非主属性
假设有个表叫做班级表,学号为主键,它存在 学号 --> 班级编号 --> 班级信息 这么一个主键学号与班级信息的传递关系,不符合第三范式
【解决办法】(1)提取学生表;(2)提取班级表;
学生肯定在某一个班级中,所以班级编号可以作为学号(主键)的一个直接关联属性,但班级的其他信息应该放在以班级编号为主键的表中,即可符合第三范式。
遵循范式的优缺点
通过以上的了解,可以发现,范式规则有如下特点
结构合理,表含义容易理解及区分
冗余较小
但性能有所降低,多表查询比单表效率低下
总结:数据库表的设计,可以借鉴三大范式的指导办法,同时也需要依赖于实际业务需求,良好的数据库结构不仅可以提高开发人员的开发效率,降低开发难度,还可以提高数据库查询效率,给程序增加可变弹性,当冗余的代价小于查询性能降低的代价时,就应该考虑冗余实现。
对于职场老鸟,三大范式我们早就滚瓜烂熟了吧,那啊码在这里整理了一套常见使用优化方法:
数据表应尽量简单可复用。怎么说呢:简单指的是用更少的表、更少的字段、更少的联合主键字段来完成数据表的设计。可复用则是通过主键、外键的使用来增强数据表之间的复用率。因为一个主键可以理解是一张表的代表。键设计得越多,证明它们之间的利用率越高。
好了,今天的课程稍微有一丢丢多,大家要好好消化一下,多举一反三,有问题的留个言,别忘了一键三连,下次我们还会再见!
我是黄啊码,码字的码,退。。。退。。。退。。。朝!