操作数据库
一、关系型数据库的范式(设计标准)
关系型数据库是被使用地最广泛的
1NF(一个表) - 字段不可再分
纯纯key对应value 没有层级关系 - 例:一个系/老师 会对应不同的学生,一个学生会对应不同的分数 所以分数呈现时就会不断重复系/老师造成数据冗余
缺点:
数据冗余
创建系时插入异常
删除学生会导致系消失
学生转系时改动多处
2NF(两个表) - 字段完全依赖key
在1NF的基础上,要有键
所有字段分别完全依赖于“键”
如果键是多字段组合,只允许字段完全依赖该键
例:一个key可以组合多个key - 可以将重复的字段单独建一个表(学生表[学号、姓名、系名、系主任]、选课表[学号、课名、分数])
查的时候可以用相同的学号来查
用学号可以确定系名
,系名
依赖学号;系名
可以确定系主任,系主任依赖系名
;
缺点:有间接依赖(系主任间接依赖学号
因为需要用学号来确定系名,再用系名查主任)
3NF(三个表) - 字段间没有间接依赖于key
一个表里不能有两层依赖
把系名和系主任单独建表
学生表[学号、姓名、系名],选课表[学号、课名、分数],系表[系名、系主任]
什么时候设计关联表
当关联自身存在属性时
- 比如关联的有效期,有效期为一年
- 比如关联的级别,店铺会员分为vip1~6
BC范式
key中的属性也不存在间接依赖
二、数据库设计
高内聚
把相关的字段放到一起,不相关的分开建表
如果两个字段能够单独建标,那就单独建标
低耦合
如果两个表之间有弱关系,
一对一可放在一个表,也可两个表加外键
一对多一般用外键
多对多一般建中间表(用关联表连接起来
)
JOIN
合并表
四种方式
inner join
left join
right join
full outer join
三、缓存字段
设置自增、自减字段
四、事务
使用教程
MYSQL 事务处理主要有两种方法:
1、用 BEGIN, ROLLBACK, COMMIT来实现
- BEGIN 开始一个事务
- ROLLBACK 事务回滚
- COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
start transaction
语句1; 语句2; 语句3;
commit;
事务原子性: 如果事务执行中有问题就会回滚(Rollback)
到数据最开始的时候
五、MySQL 存储引擎
命令:
SHOW ENGINES
InnoDB
InnoDB是事务型数据库的首选,支持事务、遵循ACID、支持行锁和外键
常见引擎
- InnoDB - 默认,目前版本是新版InnoDB
- MyISAM - 拥有较高的插入、查询速度,但不支持事务
- Memory -内存中,快速访问数据
- Archive - 只支持 insert 和 select
六、索引
用于提升搜索效率;
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
//语法
CREATE UNIQUE INDEX index1 ON users(name(100))
show index in users
- where xxx>100 创建xxx的索引
- where xxx>100 and yyy>200,创建xxx,yyy的索引
数据库类型
MySQL数据类型
- 数字类型
- 字符串类型
- 时间日期类型
- JSON类型(5.7.8以上)
- 其他特殊类型
数字类型
官方文档链接
根据场景制定字段的类型
bit[(M)]
- - 位值类型。M表示每个值的位数,从 1 到 64。如果M省略,则默认为 1tinyint [(M)] [UNSIGNED] [ZEROFILL]
- - 一个非常小的整数。签署的范围是 -128到127。无符号范围是0to 255。bool, boolean
- - 这些类型是 的同义词 TINYINT(1)。零值被认为是错误的。非零值被认为是真的smallint[(M)] [UNSIGNED] [ZEROFILL]
- - 一个小整数。签署的范围是 -32768到32767。无符号范围是0to 65535mediumint[(M)] [UNSIGNED] [ZEROFILL]
- - 一个中等大小的整数。签署的范围是 -8388608到8388607。无符号范围是0to 16777215。int[(M)] [UNSIGNED] [ZEROFILL]
- - 一个正常大小的整数。签署的范围是 -2147483648到 2147483647。无符号范围是 0to 4294967295。bigint[(M)] [UNSIGNED] [ZEROFILL]
- - 一个大整数。签署的范围是 -9223372036854775808到 9223372036854775807。无符号范围是0to 18446744073709551615。decimal[(M[,D])] [UNSIGNED] [ZEROFILL]
- - 一个压缩的“精确”定点数。 M是总位数(精度),D是小数点后的位数(小数位数)。小数点和(对于负数) -符号不计入 M。如果 D为 0,则值没有小数点或小数部分。最大位数 ( M) 为 DECIMAL65。支持的最大小数位数 ( D) 为 30。如果D省略,则默认为 0。如果M被省略,默认值为 10。(float
double[(M,D)] [UNSIGNED] [ZEROFILL]
- - 一个正常大小(双精度)的浮点数。允许值是 -1.7976931348623157E+308对 -2.2250738585072014E-308, 0以及 2.2250738585072014E-308对 1.7976931348623157E+308。这些是基于 IEEE 标准的理论限制。根据您的硬件或操作系统,实际范围可能会稍小一些。serial
- - 别名BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE。
字符串类型
- char(100) - - 不可变字节 不节省空间 设定多少字节 存多少字节
- varchar(100) - - 可变字节 可节省空间输入多少字节存多少字节
- binary(1024) - - 二进制
- varbinary(1024) - - 可变二进制
- blob - - 长二进制
- text - - 长字符串
- enum(‘v1’, ‘2’) - - 枚举
- set(‘v1’,‘v2’) - - 集合
时间类型
使用 IOS 8601
处理日期格式
- date - - 年月日
- time - - 时分秒
- datetime - - 年月日 时分秒
- timestamp - - 时间戳
- year - - 年
Sequelize - ORM框架
SQL查询语句
1.通过 SQL,您如何从 “Persons” 表中选取 “FirstName” 列的值以 “a” 开头的所有记录?
SELECT * FROM Persons WHERE FirstName LIKE 'a%'
- 请判断下列说法是否正确:当所列出的某个条件为 true 时,OR 运算符会显示记录。当列出的所有条件为 true 时,AND 运算符会显示记录。
正确
- 通过 SQL,您如何在表 Persons 中选择 FirstName 等于 Thomas 而 LastName 等于 Carter 的所有记录?
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
- 通过 SQL,您如何按字母顺序选取 Persons 表中 LastName 介于 Adams 和 Carter 的所有记录?
SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'
- 哪条 SQL 语句可返回唯一不同的值?
SELECT DISTINCT
- 哪个 SQL 关键词用于对结果集进行排序?
ORDER BY
- 通过 SQL,您如何根据 “FirstName” 列降序地从 “Persons” 表返回所有记录?
SELECT * FROM Persons ORDER BY FirstName DESC
- 通过 SQL,您如何向 “Persons” 表插入新的记录?
INSERT INTO Persons VALUES ('Jimmy', 'Jackson')
- 通过 SQL,您如何向 “Persons” 表中的 “LastName” 列插入 “Wilson” ?
INSERT INTO Persons (LastName) VALUES ('Wilson')
- 您如何把 “Persons” 表中 “LastName” 列的 “Gates” 改为 “Wilson” ?
UPDATE Persons SET LastName='Wilson' WHERE LastName='Gates'
- 通过 SQL,您如何在 “Persons” 表中删除 “FirstName” 等于 “Fred” 的纪录?
DELETE FROM Persons WHERE FirstName = 'Fred'
- 通过 SQL,您如何返回 “Persons” 表中记录的数目?
SELECT COUNT(*) FROM Persons