基础篇
MySQL数据类型
数值类型
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
TIMESTAMP类型有专有的自动更新特性。
字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。
CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。
多表查询
多表关系
一对多
多对多
一对一
内连接
外连接
自连接
子查询
MySQL函数
约束
概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中数据的正确、有效性和完整性。
分类:
主键约束
主要特点如下:
- 唯一性(Uniqueness):主键列中的数据必须唯一,不能有重复值。
- 非空(NOT NULL):主键列不能包含 NULL 值。
- 自动索引(Indexing):MySQL 自动为主键创建 唯一索引,加速查询效率。
- 一张表只能有一个主键,但可以由多个列组合形成 复合主键。
// 创建表时指定主键
//在创建表时,可以使用 PRIMARY KEY 指定主键
CREATE TABLE users (
id INT PRIMARY KEY, -- id 作为主键
name VARCHAR(100),
email VARCHAR(100)
);
//使用 AUTO_INCREMENT 自动递增
//如果主键是数值类型,通常会配合 AUTO_INCREMENT 让其自动增长:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键自动递增
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE
);
在 MySQL 中,不同存储引擎对主键的实现方式不同:
(1)InnoDB 存储引擎
- 聚簇索引(Clustered Index):InnoDB 采用 B+ 树索引 存储数据,主键就是索引,数据按照主键顺序存储在磁盘上。
- 主键索引加速查询,但更新主键的代价较高,因为需要移动数据位置。
(2)MyISAM 存储引擎
- 非聚簇索引:MyISAM 将主键索引和数据存储分开,主键索引只是指向数据的地址。
- 更新主键不会移动数据,但数据存储与索引是分开的,查询可能略慢。
主键 vs 唯一键(UNIQUE)
外键约束
外键的定义
外键是某个表中的一列,它包含在另一个表的主键中。
外键也是索引的一种,是通过一张表中的一列指向另一张表中的主键,来对两张表进行关联。一张表可以有一个外键,也可以存在多个外键,与多张表进行关联。
外键的作用 外键的主要作用是保证数据的一致性和完整性,并且减少数据冗余。 主要体现在以下两个方面:
- 阻止执行
- 从表插入新行,其外键值不是主表的主键值便阻止插入。
- 从表修改外键值,新值不是主表的主键值便阻止修改。
- 主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行)。
- 主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。
- 级联执行
- 主表删除行,连带从表的相关行一起删除。
- 主表修改主键值,连带从表相关行的外键值一起修改。
事务
事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败
事务四大特性ACID
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
并发事务问题
- 脏读:一个事务读到另外一个事务还没有提交的数据。常见的解决方法是使用锁机制,确保事务在读取数据时,其他事务不会修改相同的数据。
- 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。常见的解决方法使用更严格的隔离级别,如可串行化隔离级别,或者使用行级锁或多版本并发控制(MVCC)。
- 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 "幻影"。常见的解决方法使用更严格的隔离级别,如可串行化隔离级别,或者使用行级锁或多版本并发控制(MVCC)。
事务隔离
为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别。主要有以下几种:
注意:事务隔离级别越高,数据越安全,但是性能越低。
进阶篇
存储引擎
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。我们可以在创建表的时候,来指定选择的存储引擎,如果没有指定将自动选择默认的存储引擎。
重点提到的三种存储引擎 InnoDB、MyISAM、Memory的特点:
在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据 实际情况选择多种存储引擎进行组合。
- InnoDB: 是
Mysql的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较合适的选择。 - MyISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。
- MEMORY:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。MEMORY的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性。