文章目录
- MySQL基本介绍
- MySQL数据类型
- 数值类型
- 字符串类型
- 日期和时间类型
- ENUM和SET
- MySQL运算符
- 算数运算符
- 逻辑运算符
- 比较运算符
- MySQL常用函数
- 字符串函数
- 数值函数
- 时间和日期函数
- 聚合函数
- MySQL完整性约束
- 范式
- 第一范式(1NF)
- 第二范式(2NF)
- 第三范式(3NF)
- BC范式(BCNF)
- 第四范式(4NF)
MySQL基本介绍
-
关系型数据库:建立在关系模型的基础上的数据库。数据被存放在了各种表中(比如用户表),表中的每一行就存放着一条数据(比如一个用户的信息)
-
table:二维表(行:记录;列:字段/属性)
-
熟悉的关系型数据库还有SQL Server、Oracle、MariaDB、DB2
-
MySQL区别于其它关系型数据库很大的一个特点就是支持插件式的存储引擎,支持如InnoDB, MyISAM,Memory等
-
MySQL的服务器模型采用的是I/O复用+可伸缩的线程池,是实现网络服务器的经典模型(磁盘I/O操作会极大的影响速率)
扩展介绍:
关系模型的常用概念:
- 关系:一张二维码,每个关系都具有一个关系名,也就是表名
- 元组:二维表中的一行,在数据库中被称为记录
- 属性:二维表中的一列,在数据库中被称为字段
- 域:属性的取值范围,也就是数据库中某一列的取值限制
- 关键字:一组可以唯一标识元组 的熟悉,数据库中常称为主键,由一个或多个列组成
- 关系模式:指对关系的描述。其格式为:关系名(属性1,属性2,…,属性N),在数据库中被称为表结构
非关系型数据库:非关系型的、分布式的,且一般不保证遵循的ACID原则的数据存储系统,以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对
面试考点:关系型数据库和非关系型数据库的区别?
最大的区别:关系型数据库是table表的形式,有行有列的二维表,非关系型数据库是key-value键值对的形式
MySQL数据类型
MySQL数据类型定义了数据的大小范围,因此使用时选择合适的类型,不仅会降低表占用的磁盘空间,还能间接的减少磁盘I/O的次数,提高了表的访问效率,而且索引的效率也和数据的类型息息相关
数值类型
建议:浮点类型推荐使用decimal类型(保存为字符串格式)
age INT(9)
# 整型占用内存的大小是固定的,和具体的类型是强相关的,但是(M)表示的是整数显示的宽度
面试考点:整数类型的 UNISIGNED 属性有什么用?
UNISIGNED 表示不允许负数的无符号整数,可以将正整数的上限提高一倍,因为不需要存储负数。
例如:TINYINT UNSIGNED 范围:0 ~ 255;普通的 TINYINT 范围:-128 ~ 127
面试考点:DECIMAL 和 FLOAT/DOUBLE 的区别是什么?
DECIMAL:定点数,可以存储更加精确的小数点(可以避免浮点数带来的精度损失)
FLOAT/DOUBLE:浮点数:只能存储近似的小数值
字符串类型
日期和时间类型
注意:日期类型也是做项目过程中,经常使用的类型信息,尤其是TIMESTAMP(时间戳)和DATETIME(YYYY-MM-DD hh:mm:ss)两个类型,但是注意TIMESTAMP会自动更新时间,非常适合那些需要记录最新更新时间的场景,而DATETIME需要手动更新
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
面试考点:DATETIME 和 TIMESTAMP 的区别是什么?
DATETIME 类型没有时区信息,TIMESTAMP 和时区有关
TIMESTAMP 只需要使用 4 个字节的存储空间,但是 DATETIME 需要耗费 8 个字节的存储空间。但是,这样同样造成了一个问题,TIMESTAMP 表示的时间范围更小
- DATETIME:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
- TIMESTAMP:1970-01-01 00:00:01 ~ 2037-12-31 23:59:59
ENUM和SET
这两个类型,都是限制该类型只能取固定的值,但是枚举字段只能取一个唯一的值,而集合字段可以取任意个数的值
MySQL运算符
算数运算符
逻辑运算符
比较运算符
MySQL常用函数
字符串函数
函数 | 说明 |
---|---|
LEFT() 、RIGHT() | 左边或者右边的字符 |
LOWER() 、UPPER() | 转换为小写或者大写 |
LTRIM() 、RTRIM() | 去除左边或者右边的空格 |
LENGTH() | 长度,以字节为单位 |
SOUNDEX() | 转换为语音值 |
数值函数
函数 | 说明 |
---|---|
SIN() | 正弦 |
COS() | 余弦 |
TAN() | 正切 |
ABS() | 绝对值 |
SQRT() | 平方根 |
MOD() | 余数 |
EXP() | 指数 |
PI() | 圆周率 |
RAND() | 随机数 |
时间和日期函数
函数 | 说明 |
---|---|
NOW() | 返回当前的日期和时间 |
UNIX_TIMESTAMP(data) | 返回日期date的UNIX时间戳 |
CURRENT_TIMESTAMP() | 当前时间 |
CURDATE() | 当前日期 |
CURTIME() | 当前时间 |
DATA_FORMAT(data, “%yyyy-%mm-%dd”) | 格式化日期时间等 |
聚合函数
- COUNT()、SUM()、AVG()、MAX()、MIN()
MySQL完整性约束
- 主键约束:PRIMARY KEY
- 自增键约束:AUTO_INCREMENT
- 唯一键约束:UNIQUE
- 非空约束:NOT NULL
- 默认值约束:DEFAULT
- 外键约束:FOREIGN KEY
CREATE TABLE user (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) UNIQUE NOT NULL,
age TINYINT UNSIGNED NOT NULL DEFAULT 18,
sex ENUM('M', 'W')
);
范式
面试考点:范式的好处?
- 减少数据冗余(主要好处)
- 消除异常(插入异常、更新异常、删除异常)
- 让数据组织变得更加和谐
注意:但是数据库范式不是越高越好,范式越高,意味着表越多,多表联合查询的机率就越大,SQL的效率就越低
第一范式(1NF)
每一列保持原子特性
列都是基本数据项,不能够再进行分割,否则设计成一对多的实体关系。
例如表中的地址字段AddressID,可以再细分为省、市、区等不可再分割的字段
注意:不符合第一范式的不能够称作关系型数据库
第二范式(2NF)
属性完全依赖于主键——主要针对联合主键
非主属性需要完全依赖于主关键字,如果不是完全依赖主键,需要拆分为新的实体,设计成一对多的实体关系。
例如选课关系表为SelectCourse(学号、姓名、年龄、课程名称、成绩、学分),而(学号、课程名称)是联合主键,但是学分字段只和课程名称有关,和学号无关,相当于只依赖于联合主键的其中一个字段,不符合第二范式。
第三范式(3NF)
属性不依赖于其他非主属性
要求一个数据库表中不包含已经存在于其他表中包含的非主关键字信息
例如:学生关系表Student(学号、姓名、年龄、所在学院、学院地点、学院电话),学号是主键,但是学院电话只依赖于所在学院,并不依赖于主键学号,因此该设计不符合第三范式,应该把学院专门设计成一张表,学生表和学院表,两个是一对多的关系。
注意:一般关系型数据库只需要满足第三范式就可以了
BC范式(BCNF)
每个表中只有一个候选键
简单来说,BC范式是在第三范式的基础上的一种特殊情况,即每个表中都只有一个候选键(在一个数据库中每行的值都不相同,则可称为候选键),再上面第三范式的noNF表中可以看出,每一个员工的email都是唯一的(不可能两个人用同一个email),则该表不符合BC范式,对其进行BC范式化。
第四范式(4NF)
消除表中的多值依赖
简单来说,第四范式就是要消除表中的多值依赖,也就是说可以减少维护数据一致性的工作。比如图4中的noNF表中的skill技能这个字段,有的人是“java,mysql”,有的人描述的是“Java,MySQL”,这样数据就不一致了,解决办法就是将多值属性放入一个新表,所以满足第四范式的关系图如下:
总结:从上面对于数据库范式进行分解的过程中不难看出,应用的范式越多,表越多。而表多会带来很多问题:
- 查询时需要连接多个表,增加了SQL查询的复杂度
- 查询时需要连接多个表,降低了数据库查询性能
因此,并不是应用的范式越高越好,要视情况而定。第三范式已经很大程度上减少了数据冗余,并且基本预防了数据插入异常,更新异常,删除异常。