MySQL 超详细入门指南:从数据库基础到面试常问
一、什么是数据库?
1.1 概念
数据库(Database,简称 DB)是长期存放在计算机内、有组织、可共享的大量数据的集合,是一个数据"仓库"。
1.2 作用
存放和管理数据。
1.3 分类
| 类型 | 说明 | 代表 |
|---|---|---|
| 关系型数据库 | 使用表格存储数据,数据之间有关联关系 | MySQL、Oracle、SQL Server |
| NoSQL 数据库 | 非关系型数据库,适合大数据、高并发场景 | MongoDB、Redis |
二、为什么选择 MySQL?
MySQL 是目前最流行的开源关系型数据库之一,具有以下特点:
- ✅操作便捷:SQL 语法简单易学
- ✅小巧、功能齐全:体积小但功能强大
- ✅免费开源:社区版完全免费
- ✅跨平台:可运行在 Windows 或 Linux 系统
三、数据库结构概览
| 概念 | 说明 |
|---|---|
| 数据库(Database) | 以文件形式存放在磁盘上,对应一个或多个物理文件 |
| 数据表(Table) | 由一组数据记录组成,数据库中的数据以表为单位进行组织 |
| 字段(Field) | 也称"域",表中的每一列称为一个字段 |
| 记录(Record) | 表中的每一行称为一个记录,由若干字段组成 |
| 索引(Index) | 含有关键字段的值和指向实际记录位置的指针,可提高访问效率 |
| SQL 语句 | 结构化查询语言,用于操作数据库 |
四、SQL 语句分类
| 分类 | 全称 | 作用 | 常用命令 |
|---|---|---|---|
| DDL | 数据定义语言(Data Definition Language) | 定义和管理数据对象,如数据库、数据表 | CREATE、DROP、ALTER |
| DML | 数据操作语言(Data Manipulation Language) | 操作数据库对象中包含的数据 | INSERT、UPDATE、DELETE |
| DQL | 数据查询语言(Data Query Language) | 查询数据库数据 | SELECT |
| DCL | 数据控制语言(Data Control Language) | 管理权限及数据更改 | GRANT、COMMIT、ROLLBACK |
五、DDL 操作数据库
5.1 创建数据库
CREATEDATABASE[IFNOTEXISTS]dbname;IF NOT EXISTS:可选,如果数据库不存在则创建dbname:数据库名称
5.2 删除数据库
DROPDATABASE[IFEXISTS]dbname;5.3 查看所有数据库
SHOWDATABASES;⚠️ 注意:不要省略末尾的S
5.4 选择数据库
USEdbname;六、DDL 创建数据表
6.1 基本语法
CREATETABLE表名(字段名1类型[属性],字段名2类型[属性],...字段名n 类型[属性]-- 最后一个字段不带逗号);6.2 示例
CREATETABLEstudent(stu_nameVARCHAR(10),stu_ageTINYINT,stu_birthdayDATETIME,stu_idCHAR(18),stu_scoreDECIMAL(4,1));七、数据类型详解
7.1 字符串类型
| 类型 | 说明 | 取值范围 | 存储需求 |
|---|---|---|---|
CHAR(M) | 固定长度字符串,检索快但费空间 | 0 ≤ M ≤ 255 | M 字符 |
VARCHAR(M) | 可变长度字符串 | 0 ≤ M ≤ 65535 | 变长度 |
TINYTEXT | 微型文本串 | 16777215 长度 + 3 字节 | tinytext |
TEXT | 文本串(约 4G 大小) | 4294967295 长度 + 4 字节 | text |
💡CHAR vs VARCHAR 选择建议:
CHAR:适用于长度固定、查询频繁的场景(如手机号、身份证号)VARCHAR:适用于长度不固定、节省空间的场景(如姓名、地址)
7.2 数值类型
| 类型 | 说明 | 取值范围 | 存储需求 |
|---|---|---|---|
TINYINT | 非常小的数据 | 有符号:-2⁷ ~ 2⁷-1;无符号:0 ~ 2⁸-1 | 1 字节 |
SMALLINT | 较小的数据 | 有符号:-2¹⁵ ~ 2¹⁵-1;无符号:0 ~ 2¹⁶-1 | 2 字节 |
MEDIUMINT | 中等大小的数据 | 有符号:-2²³ ~ 2²³-1;无符号:0 ~ 2²⁴-1 | 3 字节 |
INT | 标准整数 | 有符号:-2³¹ ~ 2³¹-1;无符号:0 ~ 2³²-1 | 4 字节 |
BIGINT | 较大的整数 | 有符号:-2⁶³ ~ 2⁶³-1;无符号:0 ~ 2⁶⁴-1 | 8 字节 |
FLOAT | 单精度浮点数 | ±1.1754351e-38 | 4 字节 |
DOUBLE | 双精度浮点数 | ±2.2250738585072014e-308 | 8 字节 |
DECIMAL(M,D) | 精确小数(适用于金额) | 由 M 和 D 决定 | M 个字节 |
⚠️DECIMAL 使用注意:
M指字节长度,D指小数位数- 例如
DECIMAL(4,1)最多存储999.9- 适用于需要精确计算的场景(如金额)
7.3 NULL 类型
- 理解为"没有值"或"未知值"
- 不要用 NULL 进行算术运算,结果仍为 NULL
- MySQL 中,0 或 NULL 都意味着为假,1 为真
八、字段注释
给字段增加注释,方便后续维护:
CREATETABLEstudent(stu_idINT(4)COMMENT'ID',stu_nameVARCHAR(10)COMMENT'姓名',stu_ageINT(2)COMMENT'年龄',stu_sexCHAR(2)COMMENT'性别');九、查看表结构
方式一:desc 命令
DESCstudent;-- 或DESCRIBEstudent;方式二:查看建表语句
SHOWCREATETABLEstudent;十、修改和删除表结构
10.1 修改表名
ALTERTABLE旧表名RENAMEAS新表名;-- 示例ALTERTABLEstudentRENAMEASxuesheng;10.2 添加字段
ALTERTABLE表名ADD字段名 类型[属性];-- 示例ALTERTABLExueshengADDstu_qqVARCHAR(20)COMMENT'这是学生的QQ号';10.3 删除字段(⚠️ 危险操作)
ALTERTABLE表名DROP字段名;-- 示例ALTERTABLExueshengDROPstu_age;10.4 修改字段
方式一:MODIFY(只改类型和属性)
ALTERTABLE表名MODIFY字段名 新类型[新属性];-- 示例:将 stu_name 长度改为 100ALTERTABLExueshengMODIFYstu_nameVARCHAR(100);方式二:CHANGE(可改字段名、类型和属性)
ALTERTABLE表名 CHANGE 旧字段名 新字段名 新类型[新属性];-- 示例:将 stu_qq 改名为 qqALTERTABLExuesheng CHANGE stu_qq qqVARCHAR(20)COMMENT'这是学生的QQ号';10.5 删除表(⚠️ 危险操作)
DROPTABLE[IFEXISTS]表名;十一、存储引擎
11.1 InnoDB(MySQL 5.5+ 默认)
特点:
- ✅ 支持事务处理(ACID)
- ✅ 支持外键约束
- ✅ 支持行级锁,适合高并发
- ✅ 崩溃后可安全恢复
适用场景:需要频繁增删改查、高并发、事务处理的场景
文件结构:
表名.ibd:存储数据和索引(MySQL 8.0 合并了表结构)
11.2 MyISAM(MySQL 5.5 之前默认)
特点:
- ✅ 访问速度快
- ✅ 支持全文索引、压缩、空间函数
- ❌ 不支持事务
- ❌ 不支持外键
- ❌ 不支持行级锁(表级锁)
- ❌ 崩溃后无法安全恢复
适用场景:只读应用或以读为主的业务
文件结构:
表名.frm:存储表结构表名.MYD:存储数据(MYData)表名.MYI:存储索引(MYIndex)
11.3 InnoDB vs MyISAM 对比
| 对比项 | MyISAM | InnoDB |
|---|---|---|
| 外键 | ❌ 不支持 | ✅ 支持 |
| 事务 | ❌ 不支持 | ✅ 支持 |
| 锁机制 | 表锁 | 行锁 |
| 缓存 | 只缓存索引 | 缓存索引 + 真实数据 |
| 默认使用 | ❌ 否(5.5 之前是) | ✅ 是(5.5+) |
| 关注点 | 性能:节省资源、消耗少 | 事务:并发写、更大资源 |
十二、数据库三大范式
12.1 什么是范式?
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循的规则。
12.2 第一范式(1NF):确保每列保持原子性
- 每一列属性都是不可再分的属性值
- 两列属性相近或相似时,尽量合并
反例:地址字段存"北京市海淀区",应拆分为省、市、区三列。
12.3 第二范式(2NF):确保每列都和主键相关
- 在满足 1NF 的基础上建立
- 每个实例或行必须可以被唯一区分
- 需要添加主键作为唯一标识
12.4 第三范式(3NF):确保每列都和主键直接相关
- 数据不能存在传递关系
- 即每个属性都跟主键有直接关系,而不是间接关系
反例:
学生表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)存在传递关系:学号 → 所在院校 → (院校地址,院校电话)
应拆分为:
- 学生表(学号,姓名,年龄,性别,所在院校)
- 院校表(所在院校,院校地址,院校电话)
💡注意:三大范式是一般设计数据库的基本理念,但需求 > 性能 > 表结构,不能一味追求范式。
十三、约束
13.1 什么是约束?
约束是表中数据的限制条件,目的是保证表中的记录完整和有效。
13.2 约束种类
| 约束 | 说明 |
|---|---|
NOT NULL | 非空约束 |
UNIQUE | 唯一性约束 |
PRIMARY KEY | 主键约束 |
FOREIGN KEY | 外键约束 |
CHECK | 检查约束(MySQL 不支持,Oracle 支持) |
13.3 约束示例
非空约束
CREATETABLEtb1(usernameVARCHAR(10)NOTNULL,-- 非空约束userageINTDEFAULTNULL);-- 带默认值的非空约束CREATETABLEtb2(usernameVARCHAR(10)NOTNULLDEFAULT'无名',userageINT);唯一约束
-- 行级约束(单列唯一)CREATETABLEtb3(usernameVARCHAR(10)UNIQUE,userageINT);-- 联合唯一约束(多列组合唯一)CREATETABLEtb4(usernameVARCHAR(10),userageINT,UNIQUE(username,userage));-- 给约束起名字CREATETABLEtb5(usernameVARCHAR(10),userageINT,CONSTRAINTname_age_uniqueUNIQUE(username,userage));💡注意:唯一约束可以为 NULL,并且可以有多个 NULL(因为 NULL 是一个类型)。
主键约束
-- 单列主键CREATETABLEtb6(usernameVARCHAR(10)PRIMARYKEY,userageINT);-- 联合主键CREATETABLEtb7(usernameVARCHAR(10),userageINT,PRIMARYKEY(username,userage));-- 自增主键(推荐)CREATETABLEtb8(tidINTPRIMARYKEYAUTO_INCREMENT,-- 主键自增,不会回补usernameVARCHAR(10),userageINT);💡主键特点:每张表必须有且只有一个主键;主键值唯一且不能为 NULL。
外键约束
-- 父表(主表)CREATETABLEa(aidINTPRIMARYKEYAUTO_INCREMENT,anameVARCHAR(10));-- 从表CREATETABLEb(bidINTPRIMARYKEYAUTO_INCREMENT,bnameVARCHAR(10),aidINT,FOREIGNKEY(aid)REFERENCESa(aid));💡外键特点:
- 外键值可以重复
- 外键值可以为 NULL
- 外键值必须是父表中存在的值
- 父表的关联字段必须具有唯一性
- 一个表中可以有多个外键,但只能有一个主键
13.4 删除约束
-- 删除 NOT NULL 约束ALTERTABLE表名MODIFY列名 类型;-- 删除 UNIQUE 约束ALTERTABLE表名DROPINDEX唯一约束名;-- 删除 PRIMARY KEY 约束ALTERTABLE表名DROPPRIMARYKEY;-- 删除 FOREIGN KEY 约束ALTERTABLE表名DROPFOREIGNKEY外键名;十四、面试常问
Q1:CHAR() 和 VARCHAR() 的区别?
答:
CHAR(M):固定长度字符串;VARCHAR(M):可变长度字符串- 超过最大长度谁都存不下
VARCHAR不浪费空间但效率低,适用于姓名等变长数据;CHAR浪费空间但效率高,适用于手机号、身份证号等定长数据
Q2:InnoDB 与 MyISAM 的区别?
答:
- InnoDB:支持事务、外键、行级锁;擅长增删改查,适用于高并发和事务处理场景
- MyISAM:不支持事务、外键、行级锁;擅长读取,崩溃后无法恢复;优点是存取快、资源消耗少,适用于查询密集型场景
Q3:INT(1) 与 INT(11) 的区别?
答:区别仅在于显示宽度。
INT(1)中"1"表示显示宽度为 1 位INT(11)中"11"表示显示宽度为 11 位- 但它们的存储范围和存储空间完全相同(4 字节,-2147483648 ~ 2147483647)
- 显示宽度只影响显示效果,不影响存储内容
Q4:三大范式是什么?
答:
- 第一范式:确保每列保持原子性
- 第二范式:确保每列都和主键相关
- 第三范式:确保每列都和主键直接相关,而不是间接相关
Q5:外键约束和外键关系是一回事吗?
答:不是。
- 外键关系:两个表通过外键建立的关联
- 外键约束:保障外键关系完整性、一致性的规则(如确保外键值在父表的主键或唯一键中存在)
Q6:DELETE / TRUNCATE / DROP 的区别?
答:
| 命令 | 作用 | 是否可回滚 | 速度 |
|---|---|---|---|
DELETE | 删除表中数据,保留表结构 | ✅ 可回滚 | 慢 |
TRUNCATE | 清空表中所有数据,保留表结构 | ❌ 不可回滚 | 快 |
DROP | 删除整个表(结构和数据) | ❌ 不可回滚 | 最快 |
只想删除数据用
DELETE或TRUNCATE;彻底删除表用DROP。
十五、总结
本文从数据库基础概念出发,系统梳理了 MySQL 的核心知识点:
- ✅ 数据库基本概念与 SQL 分类
- ✅ DDL 操作(数据库和表的增删改查)
- ✅ 常用数据类型及选择建议
- ✅ 存储引擎对比(InnoDB vs MyISAM)
- ✅ 三大范式与数据库设计
- ✅ 约束的创建与删除
- ✅ 面试高频问题
希望这篇文章能帮助你快速入门 MySQL,欢迎在评论区交流讨论!
如果对你有帮助,欢迎点赞 👍 + 收藏 ⭐ + 关注 🔖,持续分享更多技术干货!
