数据库的三范式
第一范式(1NF)
- 第一范式是指数据库的每一列都是不可分割的基本数据项,而下面这样的就存在可分割的情况:
学生(姓名,电话号码)
- 电话号码实际上包括了
家用座机电话和移动电话,因此它可以被拆分为:
学生(姓名,座机号码,手机号码)
- 满足第一范式是关系型数据库最基本的要求!
第二范式(2NF)
第二范式要求表中必须存在主键,且其他的属性必须完全依赖于主键,比如:
学生(学号,姓名,性别)
- 学号是每个学生的唯一标识,每个学生都有着不同的学号,因此此表中存在一个主键,并且每个学生的所有属性都依赖于学号,学号发生改变就代表学生发生改变,姓名和性别都会因此发生改变,所有此表满足第二范式。
第三范式(3NF)
- 在满足第二范式的情况下,所有的属性都不传递依赖于主键,满足第三范式。
学生借书情况(借阅编号,学生学号,书籍编号,书籍名称,书籍作者)
- 实际上书籍编号依赖于借阅编号,而书籍名称和书籍作者依赖于书籍编号,因此存在传递依赖的情况,我们可以将书籍信息进行单独拆分为另一张表:
学生借书情况(借阅编号,学生学号,书籍编号)
书籍(书籍编号,书籍名称,书籍作者)
- 这样就消除了传递依赖,从而满足第三范式。
BCNF
- BCNF作为第三范式的补充,假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
- 所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
- 即存在关键字段决定关键字段的情况,如果修改管理员ID,那么就必须逐一进行修改,所以其不符合BCNF范式。
数据库 操作
库操作(查、建、删、用)
- 查看当前所有的数据库:
show databases; - 创建数据库:
create database [IF NOT EXISTS] 数据库名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; - 删除数据库:
drop database 数据库名; - 使用数据库:
use 数据库名;
表 操作
- 查看所有表:
show tables; - 建表:
create table 表名(
字段名 类型[列级约束条件],
....
) defalult charset=utf-8;
- 删除表:
drop table 表名; - 清空表
delete from 表名;或truncate table 表名;(速度快、无法回滚撤销等) - 清空表:
-
添加列
alter table 表名 add 列名 类型; alter table 表名 add 列名 类型 DEFAULT 默认值; alter table 表名 add 列名 类型 not null default 默认值; alter table 表名 add 列名 类型 not null primary key auto_increment; -
删除列
alter table 表名 drop column 列名; -
修改列 类型
alter table 表名 modify column 列名 类型; -
修改列 类型 + 名称
alter table 表名 change 原列名 新列名 新类型 额外的配置;alter table tb change id nid int not null; alter table tb change id id int not null default 5; alter table tb change id id int not null primary key auto_increment; alter table tb change id id int; -- 允许为空,删除默认值,删除自增。 -
修改列 默认值
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 1000; -
删除列 默认值
ALTER TABLE 表名 ALTER 列名 DROP DEFAULT; -
添加主键
alter table 表名 add primary key(列名); -
删除主键
alter table 表名 drop primary key;
-
列级约束条件
列级约束有六种:主键Primary key、外键foreign key 、唯一 unique、检查 check (MySQL不支持)、默认default 、非空/空值 not null/ null
数据类型
- char(n)可以存储任意字符串,但是是固定长度为n,如果插入的长度小于定义长度时,则用空格填充。
- varchar(n)也可以存储任意数量字符串,长度不固定,但不能超过n,不会用空格填充。
以下数据类型用于存储数字:
- smallint用于存储小的整数,范围在 (-32768,32767)
- int用于存储一般的整数,范围在 (-2147483648,2147483647)
- bigint用于存储大型整数,范围在 (-9,223,372,036,854,775,808,9,223,372,036,854,775,807)
- float用于存储单精度小数
- double用于存储双精度的小数
以下数据类型用于存储时间:
- date存储日期
- time存储时间
- year存储年份
- datetime用于混合存储日期+时间