并且,很多情况下会使用程序中的时间戳来代替,并且稍后保存到数据库时将字段类型设置为。这样可以节省存储空间,提高数据读取速度。
03.约束规则主键key:区分表中每一行数据唯一性的标志,以及数据物理存储的顺序
not null:该字段不允许填写空值,如果允许填写空值,则不直接填写not null。
:该字段中的值不允许重复
默认值:当不填写该值时,将使用默认值。 若填写,以填写的值为准。
外键key:用于连接两个表之间的关系,约束关系字段。 为关系字段填写值时,会查询关联表是否存在该值,如果存在则填写成功;如果存在则填写成功。 如果不存在则填充失败并抛出异常。
注意:虽然外键约束可以保证数据的有效性,但是在对数据进行增删改查(增、修改、删除、读查询)时,会降低数据库的性能,所以不建议使用。 那么如何保证数据的有效性呢? 可以在逻辑层进行判断控制【用代码控制】
04.数据库设计关系数据库建议基于ER模型,我们需要根据产品经理的设计方案提取模型和关系,并制定表结构。 这是该项目的第一步。
在开发中,设计数据库的软件有很多,常用的有power、db等,这些软件可以直观的看到实体以及实体之间的关系。
设计数据库可以由专门的数据库设计者或开发团队的成员来完成。 通常由项目经理带领团队成员完成。
这个阶段不需要独立完成数据库设计,但是要注意积累一些这方面的经验。
05.实体实体是我们根据开发需要想要以表的形式保存到数据库的东西。实体的名称最终会成为表名
实体将具有属性。 实体的属性是描述事物的内容。 实体的属性最终将作为字段存在于表中。
实体之间将存在关系。 这种关系一般就是按照三个范式抽取出来的主键和外键。
06.三范式范式理论【总结经验后,我们提出了一些理论来规范我们的数据库设计】数据必须是不可分割的
数据不能冗余()
数据不能重复。 对于重复的数据,新建一个表来存储。
经过对使用中问题的研究和总结,提出了数据库设计的一些规范。 这些规范称为范例(Forms)。
目前可追溯的范式有8种。 一般来说,需要遵循 3 个范式。
2、第一范式(1NF):它强调列的原子性,即列不能再分为其他列。 考虑这样一个表:
1.【联系人】(姓名、性别、电话)
2、如果在实际场景中,一个联系人有一个家庭电话号码和一个工作电话号码,那么这个表结构设计并没有达到1NF。
3、为了符合1NF,我们只需要拆分一栏(电话)即可,即:【联系人】(姓名、性别、家庭电话、公司电话)
4.1NF很容易区分,但2NF和3NF很容易混淆。
3、第二范式(2NF):首先是1NF,它也包含两部分。 首先,表必须有主键; 其次,不包含在主键中的列必须完全依赖于主键,而不能仅依赖于主键的部分。 考虑订单详细列表:
1.【】(,,,,,)
2. 一张订单可以订购多种产品,因此单件不足以作为主键。 主键应该是 (,)
3.另外,(折扣)、(数量)完全依赖于主键(,)
4. 然而,仅取决于
5.所以该表不符合2NF。不符合2NF的设计容易产生冗余数据
6、可以将[]表拆分为[](,,,)和[](,,),消除原订单表中的多个重复
4、第三范式(3NF):首先,它是2NF。 另外,非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列A依赖于非主键列B,且非主键列A依赖于非主键列B。 B 列取决于主键。 考虑一个订单表。
1.【顺序】(,,,,,)主键是()
2.其中、、、、、等非主键列完全依赖于主键(),因此符合2NF
3.但问题是,它直接依赖于(非主键列),而不是直接依赖于主键。 它依赖于主键通过传输,因此不符合3NF。
4. 通过将[Order]拆分为[Order](,,)和[](,,,)来实现3NF
5、第二范式(2NF)和第三范式(3NF)的概念很容易混淆。 区分它们的要点是:
2NF:非主键列是完全依赖于主键,还是部分依赖于主键
3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列?
07.逻辑删除不想物理删除重要数据。 一旦删除,数据将无法恢复。
删除计划:集合列,类型为bit,代表逻辑删除,默认值为0
不重要的数据可以物理删除
数据的重要性要根据实际开发来确定
08.消除重复行。 在以下列之前使用它可以消除重复的行。
第 1 列,...FROM 表名;
# 例子:
从 ;
09. WHERE条件的高级运算符
1)。 null判断注意事项:NULL和''是不同的
查询未填写身高的学生
* 从哪里为空; 不为空
查询填写身高的学生
* 来自 WHERE 不为空; 查询填写身高的男生
* FROM WHERE 不为空且=1;
2)。 优先级从高到低依次为:括号、非、比较运算符、逻辑运算符
并且是在or之前计算的。 如果同时出现,想先计算或,则需要与()结合使用
10、连接查询当查询结果的列来自多个表时,需要将多个表连接成一个大数据集,然后选择合适的列返回
mysql支持三种类型的连接查询,分别是:
内连接查询:查询的结果是两个表匹配的数据
右连接查询:查询结果是两个表匹配到的数据,右表特有的数据,左表不存在的数据用NULL填充
左连接查询:查询结果是两个表匹配到的数据,左表特有的数据,右表不存在的数据用NULL填充
* 来自表 1
内\左\右连接 表 2
ON 表 1. 列 = 表 2. 列
6、示例01:使用内连接查询班级表和学生表
* 从
内部联接
ON .=.id;
7、示例02:使用左连接查询班级表和学生表
* 来自 AS
左连接 AS c
ON s.=c.id;
8、示例03:使用右连接查询班级表和学生表
* 来自 AS
右连接 AS c
开 s。 = c.id;
9、示例04:查询学生姓名和班级名称
s.name,c.name 来自 AS s
内连接 AS c
开 s。 = c.id;
11. 子查询
1)。 子查询在一条语句中嵌入了另一条语句,因此嵌入的语句称为子查询语句。
2)。 主查询的主查询对象,第一条语句
3)。 主查询和子查询之间的关系。 子查询嵌入在主查询中。
子查询是主查询的辅助,既可以作为条件,也可以作为数据源。
子查询是一条可以独立存在的语句,是一个完整的语句。
4). 例子
查找年龄高于平均年龄的学生
* 来自哪里年龄>(平均(年龄)来自);