数据库学习小记

操作数据库

在这里插入图片描述

一、关系型数据库的范式(设计标准)

关系型数据库是被使用地最广泛的

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来实现

  1. BEGIN 开始一个事务
  2. ROLLBACK 事务回滚
  3. COMMIT 事务确认

2、直接用 SET 来改变 MySQL 的自动提交模式:

SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

start transaction
语句1; 语句2; 语句3;
commit;

事务原子性: 如果事务执行中有问题就会回滚(Rollback)到数据最开始的时候

五、MySQL 存储引擎

命令:
SHOW ENGINES

InnoDB

InnoDB是事务型数据库的首选,支持事务、遵循ACID、支持行锁和外键
常见引擎

  1. InnoDB - 默认,目前版本是新版InnoDB
  2. MyISAM - 拥有较高的插入、查询速度,但不支持事务
  3. Memory -内存中,快速访问数据
  4. Archive - 只支持 insert 和 select

六、索引

课程链接

用于提升搜索效率;
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

//语法
CREATE UNIQUE INDEX index1 ON users(name(100))
show index in users
  1. where xxx>100 创建xxx的索引
  2. where xxx>100 and yyy>200,创建xxx,yyy的索引

数据库类型

MySQL数据类型
  1. 数字类型
  2. 字符串类型
  3. 时间日期类型
  4. JSON类型(5.7.8以上)
  5. 其他特殊类型

数字类型

官方文档链接
根据场景制定字段的类型

  1. bit[(M)] - - 位值类型。M表示每个值的位数,从 1 到 64。如果M省略,则默认为 1
  2. tinyint [(M)] [UNSIGNED] [ZEROFILL] - - 一个非常小的整数。签署的范围是 -128到127。无符号范围是0to 255。
  3. bool, boolean - - 这些类型是 的同义词 TINYINT(1)。零值被认为是错误的。非零值被认为是真的
  4. smallint[(M)] [UNSIGNED] [ZEROFILL] - - 一个小整数。签署的范围是 -32768到32767。无符号范围是0to 65535
  5. mediumint[(M)] [UNSIGNED] [ZEROFILL] - - 一个中等大小的整数。签署的范围是 -8388608到8388607。无符号范围是0to 16777215。
  6. int[(M)] [UNSIGNED] [ZEROFILL] - - 一个正常大小的整数。签署的范围是 -2147483648到 2147483647。无符号范围是 0to 4294967295。
  7. bigint[(M)] [UNSIGNED] [ZEROFILL] - - 一个大整数。签署的范围是 -9223372036854775808到 9223372036854775807。无符号范围是0to 18446744073709551615。
  8. decimal[(M[,D])] [UNSIGNED] [ZEROFILL] - - 一个压缩的“精确”定点数。 M是总位数(精度),D是小数点后的位数(小数位数)。小数点和(对于负数) -符号不计入 M。如果 D为 0,则值没有小数点或小数部分。最大位数 ( M) 为 DECIMAL65。支持的最大小数位数 ( D) 为 30。如果D省略,则默认为 0。如果M被省略,默认值为 10。(
  9. float
  10. double[(M,D)] [UNSIGNED] [ZEROFILL] - - 一个正常大小(双精度)的浮点数。允许值是 -1.7976931348623157E+308对 -2.2250738585072014E-308, 0以及 2.2250738585072014E-308对 1.7976931348623157E+308。这些是基于 IEEE 标准的理论限制。根据您的硬件或操作系统,实际范围可能会稍小一些。
  11. serial - - 别名BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE。

字符串类型

官方文档链接

  1. char(100) - - 不可变字节 不节省空间 设定多少字节 存多少字节
  2. varchar(100) - - 可变字节 可节省空间输入多少字节存多少字节
  3. binary(1024) - - 二进制
  4. varbinary(1024) - - 可变二进制
  5. blob - - 长二进制
  6. text - - 长字符串
  7. enum(‘v1’, ‘2’) - - 枚举
  8. set(‘v1’,‘v2’) - - 集合

时间类型

使用 IOS 8601 处理日期格式

  1. date - - 年月日
  2. time - - 时分秒
  3. datetime - - 年月日 时分秒
  4. timestamp - - 时间戳
  5. year - - 年

Sequelize - ORM框架

官方文档
教程

SQL查询语句

1.通过 SQL,您如何从 “Persons” 表中选取 “FirstName” 列的值以 “a” 开头的所有记录?

 SELECT * FROM Persons WHERE FirstName LIKE 'a%'
  1. 请判断下列说法是否正确:当所列出的某个条件为 true 时,OR 运算符会显示记录。当列出的所有条件为 true 时,AND 运算符会显示记录。
正确
  1. 通过 SQL,您如何在表 Persons 中选择 FirstName 等于 Thomas 而 LastName 等于 Carter 的所有记录?
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
  1. 通过 SQL,您如何按字母顺序选取 Persons 表中 LastName 介于 Adams 和 Carter 的所有记录?
SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'
  1. 哪条 SQL 语句可返回唯一不同的值?
SELECT DISTINCT
  1. 哪个 SQL 关键词用于对结果集进行排序?
ORDER BY
  1. 通过 SQL,您如何根据 “FirstName” 列降序地从 “Persons” 表返回所有记录?
 SELECT * FROM Persons ORDER BY FirstName DESC
  1. 通过 SQL,您如何向 “Persons” 表插入新的记录?
INSERT INTO Persons VALUES ('Jimmy', 'Jackson')
  1. 通过 SQL,您如何向 “Persons” 表中的 “LastName” 列插入 “Wilson” ?
INSERT INTO Persons (LastName) VALUES ('Wilson')
  1. 您如何把 “Persons” 表中 “LastName” 列的 “Gates” 改为 “Wilson” ?
UPDATE Persons SET LastName='Wilson' WHERE LastName='Gates'
  1. 通过 SQL,您如何在 “Persons” 表中删除 “FirstName” 等于 “Fred” 的纪录?
DELETE FROM Persons WHERE FirstName = 'Fred'
  1. 通过 SQL,您如何返回 “Persons” 表中记录的数目?
SELECT COUNT(*) FROM Persons
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Supernova_gu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值