概述篇
1.字段命名规范:
驼峰命名 | 第一个单词首字母小写,其余单词首字母大写,例如 studentName |
第二种 | 所有单词小写,单词之间"_"符号隔开, 例如 student_name |
1.1其他命名原则
函数名 | "_fun"后缀 |
存储过程 | “_proc”后缀 |
视图名 | “_view” 后缀 |
触发器名 | “_trig” 后缀 |
索引名 | “_index” 后缀 |
外键约束名 | "_fk"后缀 |
注意: 命名尽量避免使用关键字
其他:windows 中 数据库名 表名大小写不敏感。linux 中 就比较敏感
2.范式
第一范式(1NF):
同一张表内同类字段不重复出现
第二范式(2NF):
满足1NF基础上,每个 “非关键字” 字段仅仅函数依赖于主键。
举个反栗:不满足2NF (删除线标明,需要两个字段 共同确定唯一数据)
学号 | 姓名 | 性别 | 课程号 | 课程名 |
---|---|---|---|---|
2012001 | 张三 | 男 | 5 | 数学 |
2012002 | 李四 | 女 | 5 | 数学 |
2012003 | 王五 | 男 | 5 | 数学 |
2012004 | 周六 | 女 | 5 | 数学 |
张三 | 男 | 英语 | ||
李四 | 男 | 英语 |
该表主键为复合主键( 学号 课程号 )
解决:
分为 课程表 和 学生表
第三范式(3NF):
满足2NF基础上,不存在“非关键字”字段依赖于任何其他“非关键字”字段
举个栗反:不满足3NF
学号 | 姓名 | 性别 | 居住地 | 邮编 |
---|---|---|---|---|
2012001 | 张三 | 男 | 北京 | 10000 |
2012002 | 李四 | 女 | 上海 | 20000 |
2012003 | 王五 | 男 | 天津 | 30000 |
2012004 | 周六 | 女 | 南京 | 40000 |
原因:“非关键字” 字段 “邮编” 依赖于 “非关键字” 字段“居住地” (还有例如,生日可以从身份证号中推出)
为满足要求:分为两个表:
学生表
学号 | 姓名 | 性别 |
---|---|---|
2012001 | 张三 | 男 |
2012002 | 李四 | 女 |
2012003 | 王五 | 男 |
2012004 | 周六 | 女 |
居住地表
居住地 | 邮编 |
---|---|
北京 | 10000 |
上海 | 20000 |
天津 | 30000 |
南京 | 40000 |
3.约束条件
约束名称 | Explain |
---|---|
主键约束(primary key) | 唯一非空,一张表只有一个主键 |
外键约束(foreign key) | 保证外键字段与主键字段一致性 |
唯一性(unique) | 希望字段值不重复,可添加此约束(表中可有多个unique约束) |
非空(not NULL) | 字段不能取NULL |
检查约束(check) | 在已有集合中取值 |
默认值约束(default) | 指定默认值 |
4.存储引擎
MySQL 提供的是插件式(pluggable)存储引擎,存储引擎是基于表的,也就是说 同一数据库,不同的表,存储引擎可以不同,甚至
同一个数据库 在不同场合下可以应用不同的存储引擎。
其中 InnoDB 是默认的(default)存储引擎(5.5版本开始),5.6版本后 支持全文索引
对比 | InnoDB | MyISAM |
---|---|---|
事务 | 支持 | 不支持 |
外键 | 支持 | 不支持 |
索引 | 聚集索引 | 非聚集索引 |
全文索引 | 5.6以后支持 | 支持 |
表的具体行数 | 不保留 | 保留 |
锁 | 行锁 | 表锁 |
适用场景 | 事务考虑 | select多 |
InnoDB 特点:
- InnoDB是事物安全的,且支持外键
- 出于事务安全考虑,InnoDB是更好的选择**
- InnoDB影响速度的主要原因:
开启了自动提交 (autocommit) 选项,或者没有显示调用 begin transation(事务开始),commit(提交事务),导致每一条insert,delete,update 自动开始 和提交事务,影响了 效率,后面我们会使用多条语句 形成一个事务,提高操作性能。
MyISAM 特点:
- MyISAM 事务不安全 ,不支持 foreign key
- 建议1:MyIASM 表 可被压缩,若某张表要提供 OLAP支持,则建议使用此种引擎
- 建议2:需要执行大量 selete 语句,MyISAM 是更好的选择
基础篇
常见mySQL cmd命令
net start mysql; //启动 MySQL 服务
net stop mysql; //停止MySQL 服务
show character set; // 显示所有字符集
mysql -u root -p database_password; // 登录
create database database_name; // 创建数据库
use database_name; // 指定要操作的数据库
drop database database_name; // 删除数据库
rename database oldd_name TO new_name //更改数据库名 (此种办法可能会有数据丢失风险)
show create database database_name; //显示 create database 的代码段
show engines; //MySQL 支持的引擎
create table table_name( //创建表
);
表的操作:
show tables; //显示当前数据库中的表
desc table_name; //显示表结构
show create table table_name; //显示 create table 的代码段(我自己常用来查看一些约束,字符集...等)
insert into table_name values(); //插入数据
select * from table_name; //显示表中所有数据
drop table table_name; //删除表