【mysql基础知识】

mysql数据类型

MySQL数据类型定义了数据的大小范围,因此使用时选择合适的类型,不仅会降低表占用的磁盘空间,

间接减少了磁盘I/O的次数,提高了表的访问效率,而且索引的效率也和数据的类型息息相关。

数值类型

比如说定义年龄,咱们就不用INT类型了 因为没有人的年龄那么大 就设置TINYINT;

age INT(9) 整形占用内存党的大小是固定的,和具体的类型是强相关的。(M)只是代表整数显示的宽度

字符串类型

BLOB就是二进制;一般文本就用TEXT

char(M) 就是说是它这个字符的宽度,如果是hello那宽度也是12,但是超过12的字符串就会截取

日期和时间类型

日期类型也是做项目过程中,经常使用的类型信息,尤其是TIMESTAMP和DATETIME两个类型,但是注意TIMESTAMP会自动更新时间,非常适合那些需要记录最新更新时间的场景,而DATETIME需要手动更新。

**注:**一般不会使用数据库的这种时间,因为我们项目最先遇到性能瓶颈的就是mysql因为它设计磁盘的IO

enum和set

这两个类型,都是限制该字段只能取固定的值,但是枚举字段只能取一个唯一的值,而集合字段可以取任意个值。

比如就是我设置一个性别的时候只能选男女不可以选别的,来限制该字段。

MySQL运算符

MySQL运算符

就是正常的运算

逻辑运算符

复制代码
 select * from user where sex = 'M'and score>=90.0;//找出是男的而且成绩大于90的

比较运算符

mySQL常用函数

字符串函数

复制代码
 select * from user where age between 20 and 22;
 select * from user where score in(99.0,100);//找出99到100的学生
 select * from user where name like 'zhang%';//这个就是找到后面所有字符的 比如说zhang san  zhang yao
 select * from user where name like 'zhang_';//找到一个的  zhang x

mysql的完整性约束

主键约束

primary key//主键就是这个字段不能取空值,不能重复

主键和唯一键 非空约束是不用写到一起的

复制代码
 ​

自增键约束

auto_increment

//就比如说我加入id这个东西我不需要考虑去加到哪一列 会自动按顺序生成

唯一键约束

unique

一个表只能有一个主键,但是可以有很多个唯一键

非空约束

not null

默认值约束

default

外键约束

foregin key

例子:

复制代码
 学生信息表       父表
 张三 xxx xxx
 学生考试表
 张三id xxx xxx    子表

比如说我这个学生退学了 那就是删除张三 但是其它表都有它的信息 那就应该提示或者有关联的 比如说id就都删除

但一般来说我们用不上这些 我们使用代码逻辑来控制


实例:

复制代码
 CREATE TABLE user(
 id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT'用户的主键id',
 nickname VARCHAR(50) UNIQUE NOT NULL COMMENT'用户的昵称',
 age TINYINT UNSIGNED NOT NULL DEFAULT 18,
 sex ENUM('m','f')
 );

关系型数据库表设计

一对一(碰到的少)

复制代码
 用户user
 uid     name    age     sex
 1100    zhang   20      M
 1110    liu     21      W
 1111    wang    22      M
 ​
 身份信息info
 uid     cardid      addrinfo
 1100    112233      shanghai
 1110    112244      beijing

其实这就是一个外键uid

一对多

比如我现在做一个电商系统

用户User

商品Product

订单Order

用户和商品:没关系

用户和订单:一对多有关系

商品和订单:多对多关系

用户User表

uid name age sex

1000 zhang 20 M

1100 wang 21 W

2010 li 22 M

订单Oredr

ordeird uid pid number money totalprice addrinfo

O1111 1000 1 1 600 海淀区

O1111 1000 2 2 4000 海淀区

O1111 1000 3 4 40 海淀区

O2000 2010 2 1 2000 朝阳

商品Product pid pname price amount

1 手机 600 100

2 笔记本 2000 50

3 电池 10 200

多对多

增加一个中间表 因为太冗余了 可以看上面的 如果修改的话就涉及很多的修改

关系型数据库范式(面试问)

应用数据库范式可以带来许多好处,但是最重要的好处归结为三点:

1)减少数据冗余(这是最主要的好处,其他好处都是由此而附带的)

2)消除异常(插入异常,更新异常,删除异常)

3)让数据组织的更加和谐

但是数据库范式绝对不是越高越好,范式越高,意味着表越多,多表联合查询的机率就越大,SQL的效

率就变低。

第一范式

每一列都保持原子特性

列都是基本数据项,不能够在进行分割,否则设计成一对多的实体关系。例如表中的地址字段,可以再细分为省,市,区,等不可·1再分割(既原子特性)的字段,如下:

上图的表就是把地址字段分成更详细的city,country,street三个字段,注意,不符合第一范式不能称作关系型数据库。

雇员ID,部门名称,名字,地址(addressID),工作,职位描述,技能,部门描述

第二范式

属于完全依赖于主键-主要针对联合主键

非主属性完全依赖于主关键字,如果不是完全依赖主键,应该拆分成新的实体,设计成一对多的实体关系。

例如:选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),(学号,课程名称)是联合主键,但是学分字段只和课程名称有关,和学号无关,相当于只依赖联合主键的其中一个字段,不符合第二范式。

第三范式

属性不依赖于其它非主属性

要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

示例:学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),学号是主键,但是学院电话只依赖于所在学院,并不依赖于主键学号,因此该设计不符合第三范式,应该把学院专门设计成一张表,学生表和学院表,两个是一对多的关系。

注意:一般关系型数据库满足第三范式就可以了。

BC范式

每个表中只有一个候选键

简单的说,BC范式是在第三范式的基础上的一种特殊情况,即每个表中只有一个候选键(在一个数据库**中每行的值都不相同,则可称为候选键)**,在上面第三范式的noNF表(上面图3)中可以看出,每一个员工的email都是唯一的(不可能两个人用同一个email),则此表不符合BC范式,对其进行BC范式化后的关系图为:

第四范式

消除表中的多值依赖

简单来说,第四范式就是要消除表中的多值依赖,也就是说可以减少维护数据一致性的工作。比如图4中的noNF表中的skill技能这个字段,有的人是"java,mysql",有的人描述的是"Java,MySQL",这样数据就不一致了,解决办法就是将多值属性放入一个新表,所以满足第四范式的关系图如下:

从上面对于数据库范式进行分解的过程中不难看出,应用的范式越高,表越多。表多会带来很多问题:

1查询时需要连接多个表,增加了**SQL查询的复杂度**

2查询时需要连接多个表,降低了数据库查询性能

因此,并不是应用的范式越高越好,视实际情况而定。第三范式已经很大程度上减少了数据冗余,并且基本预防了数据插入异常,更新异常,和删除异常了。

相关推荐
序安InToo几秒前
第6课|注释与代码风格
后端·操作系统·嵌入式
xyy123几秒前
C#: Newtonsoft.Json 到 System.Text.Json 迁移避坑指南
后端
洋洋技术笔记3 分钟前
Spring Boot Web MVC配置详解
spring boot·后端
JxWang054 分钟前
VS Code 配置 Markdown 环境
后端
navms7 分钟前
搞懂线程池,先把 Worker 机制啃明白
后端
JxWang057 分钟前
离线数仓的优化及重构
后端
Nyarlathotep01138 分钟前
gin01:初探gin的启动
后端·go
JxWang058 分钟前
安卓手机配置通用多屏协同及自动化脚本
后端
JxWang0510 分钟前
Windows Terminal 配置 oh-my-posh
后端
SimonKing26 分钟前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员