MySQL 超详细入门指南:从数据库基础到面试常问
一、什么是数据库1.1 概念数据库Database简称 DB是长期存放在计算机内、有组织、可共享的大量数据的集合是一个数据仓库。1.2 作用存放和管理数据。1.3 分类类型说明代表关系型数据库使用表格存储数据数据之间有关联关系MySQL、Oracle、SQL ServerNoSQL 数据库非关系型数据库适合大数据、高并发场景MongoDB、Redis二、为什么选择 MySQLMySQL 是目前最流行的开源关系型数据库之一具有以下特点✅操作便捷SQL 语法简单易学✅小巧、功能齐全体积小但功能强大✅免费开源社区版完全免费✅跨平台可运行在 Windows 或 Linux 系统三、数据库结构概览概念说明数据库Database以文件形式存放在磁盘上对应一个或多个物理文件数据表Table由一组数据记录组成数据库中的数据以表为单位进行组织字段Field也称域表中的每一列称为一个字段记录Record表中的每一行称为一个记录由若干字段组成索引Index含有关键字段的值和指向实际记录位置的指针可提高访问效率SQL 语句结构化查询语言用于操作数据库四、SQL 语句分类分类全称作用常用命令DDL数据定义语言Data Definition Language定义和管理数据对象如数据库、数据表CREATE、DROP、ALTERDML数据操作语言Data Manipulation Language操作数据库对象中包含的数据INSERT、UPDATE、DELETEDQL数据查询语言Data Query Language查询数据库数据SELECTDCL数据控制语言Data Control Language管理权限及数据更改GRANT、COMMIT、ROLLBACK五、DDL 操作数据库5.1 创建数据库CREATEDATABASE[IFNOTEXISTS]dbname;IF NOT EXISTS可选如果数据库不存在则创建dbname数据库名称5.2 删除数据库DROPDATABASE[IFEXISTS]dbname;5.3 查看所有数据库SHOWDATABASES;⚠️ 注意不要省略末尾的S5.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 ≤ 255M 字符VARCHAR(M)可变长度字符串0 ≤ M ≤ 65535变长度TINYTEXT微型文本串16777215 长度 3 字节tinytextTEXT文本串约 4G 大小4294967295 长度 4 字节textCHAR vs VARCHAR 选择建议CHAR适用于长度固定、查询频繁的场景如手机号、身份证号VARCHAR适用于长度不固定、节省空间的场景如姓名、地址7.2 数值类型类型说明取值范围存储需求TINYINT非常小的数据有符号-2⁷ ~ 2⁷-1无符号0 ~ 2⁸-11 字节SMALLINT较小的数据有符号-2¹⁵ ~ 2¹⁵-1无符号0 ~ 2¹⁶-12 字节MEDIUMINT中等大小的数据有符号-2²³ ~ 2²³-1无符号0 ~ 2²⁴-13 字节INT标准整数有符号-2³¹ ~ 2³¹-1无符号0 ~ 2³²-14 字节BIGINT较大的整数有符号-2⁶³ ~ 2⁶³-1无符号0 ~ 2⁶⁴-18 字节FLOAT单精度浮点数±1.1754351e-384 字节DOUBLE双精度浮点数±2.2250738585072014e-3088 字节DECIMAL(M,D)精确小数适用于金额由 M 和 D 决定M 个字节⚠️DECIMAL 使用注意M指字节长度D指小数位数例如DECIMAL(4,1)最多存储999.9适用于需要精确计算的场景如金额7.3 NULL 类型理解为没有值或未知值不要用 NULL 进行算术运算结果仍为 NULLMySQL 中0 或 NULL 都意味着为假1 为真八、字段注释给字段增加注释方便后续维护CREATETABLEstudent(stu_idINT(4)COMMENTID,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 InnoDBMySQL 5.5 默认特点✅ 支持事务处理ACID✅ 支持外键约束✅ 支持行级锁适合高并发✅ 崩溃后可安全恢复适用场景需要频繁增删改查、高并发、事务处理的场景文件结构表名.ibd存储数据和索引MySQL 8.0 合并了表结构11.2 MyISAMMySQL 5.5 之前默认特点✅ 访问速度快✅ 支持全文索引、压缩、空间函数❌ 不支持事务❌ 不支持外键❌ 不支持行级锁表级锁❌ 崩溃后无法安全恢复适用场景只读应用或以读为主的业务文件结构表名.frm存储表结构表名.MYD存储数据MYData表名.MYI存储索引MYIndex11.3 InnoDB vs MyISAM 对比对比项MyISAMInnoDB外键❌ 不支持✅ 支持事务❌ 不支持✅ 支持锁机制表锁行锁缓存只缓存索引缓存索引 真实数据默认使用❌ 否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外键名;十四、面试常问Q1CHAR() 和 VARCHAR() 的区别答CHAR(M)固定长度字符串VARCHAR(M)可变长度字符串超过最大长度谁都存不下VARCHAR不浪费空间但效率低适用于姓名等变长数据CHAR浪费空间但效率高适用于手机号、身份证号等定长数据Q2InnoDB 与 MyISAM 的区别答InnoDB支持事务、外键、行级锁擅长增删改查适用于高并发和事务处理场景MyISAM不支持事务、外键、行级锁擅长读取崩溃后无法恢复优点是存取快、资源消耗少适用于查询密集型场景Q3INT(1) 与 INT(11) 的区别答区别仅在于显示宽度。INT(1)中1表示显示宽度为 1 位INT(11)中11表示显示宽度为 11 位但它们的存储范围和存储空间完全相同4 字节-2147483648 ~ 2147483647显示宽度只影响显示效果不影响存储内容Q4三大范式是什么答第一范式确保每列保持原子性第二范式确保每列都和主键相关第三范式确保每列都和主键直接相关而不是间接相关Q5外键约束和外键关系是一回事吗答不是。外键关系两个表通过外键建立的关联外键约束保障外键关系完整性、一致性的规则如确保外键值在父表的主键或唯一键中存在Q6DELETE / TRUNCATE / DROP 的区别答命令作用是否可回滚速度DELETE删除表中数据保留表结构✅ 可回滚慢TRUNCATE清空表中所有数据保留表结构❌ 不可回滚快DROP删除整个表结构和数据❌ 不可回滚最快只想删除数据用DELETE或TRUNCATE彻底删除表用DROP。十五、总结本文从数据库基础概念出发系统梳理了 MySQL 的核心知识点✅ 数据库基本概念与 SQL 分类✅ DDL 操作数据库和表的增删改查✅ 常用数据类型及选择建议✅ 存储引擎对比InnoDB vs MyISAM✅ 三大范式与数据库设计✅ 约束的创建与删除✅ 面试高频问题希望这篇文章能帮助你快速入门 MySQL欢迎在评论区交流讨论如果对你有帮助欢迎点赞 收藏 ⭐ 关注 持续分享更多技术干货