2026/10/22 15:15:29

MySQL 数据库基础:从入门到熟练的完整教程

MySQL 数据库基础:从入门到熟练的完整教程 一、数据库与 MySQL 概述在正式开始学习 MySQL 之前我们先厘清几个关键概念。数据库是用于组织、存储和管理数据的仓库而数据库管理系统DBMS则是帮助用户创建、维护和使用数据库的软件。MySQL 就是目前最流行的开源关系型数据库管理系统之一。关系型数据库把数据组织成一张张相互关联的表。每张表由行和列组成一行表示一条记录一列表示一个字段。例如一张学生表可能包含学号、姓名、年龄和班级等字段每行则对应一名学生。MySQL 之所以被广泛使用主要因为开源免费社区版可以免费使用适合学习和中小企业项目。性能较高读写速度快能够满足大部分 Web 应用和后台系统的需求。生态成熟有大量文档、教程、管理工具和第三方框架支持。语法标准遵循 SQL 标准学习后可以较容易地迁移到其他关系型数据库。常见的 MySQL 应用场景包括网站用户系统、订单系统、商品管理、日志存储以及各类数据分析任务。即使现在出现了很多 NoSQL 数据库MySQL 在很多业务流程中仍然是核心存储方案。二、MySQL 的安装与连接学习 MySQL 的第一步是在本机或服务器上完成安装。根据操作系统不同可以选择不同的安装方式。初学者推荐使用官方安装包或者使用集成开发环境例如 XAMPP、WampServer这些工具会把 MySQL 和其他 Web 组件一起装好。安装完成后可以通过命令行连接到 MySQL 服务mysql -u root -p输入密码后即可进入 MySQL 客户端。如果刚刚安装且还没有设置密码有些版本可以直接回车进入。为了安全和日常管理通常需要先创建独立账号并设置密码CREATE USER demo_userlocalhost IDENTIFIED BY Demo123456; GRANT ALL PRIVILEGES ON demo_db.* TO demo_userlocalhost; FLUSH PRIVILEGES;对于习惯图形化操作的用户也可以使用 Navicat、DBeaver、DataGrip 或 MySQL Workbench 等工具。图形工具适合查看表结构、导入导出数据和调试 SQL不过命令行仍然是排查问题时的基本功。三、数据库与数据表的基本操作连接数据库后我们需要先创建数据库再在数据库中创建数据表。数据库相当于一个容器用来存放一组相关的表。下面的语句创建一个名为school的数据库CREATE DATABASE school DEFAULT CHARACTER SET utf8mb4;这里指定了utf8mb4字符集。它是utf8的超集能够正确存储表情符号和更多 Unicode 字符因此现在更推荐使用它。接下来进入该数据库USE school;然后创建学生表。建表时不仅需要指定列名还要为每列选择合适的数据类型并设置必要的约束CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 学生ID, student_no VARCHAR(20) NOT NULL UNIQUE COMMENT 学号, name VARCHAR(50) NOT NULL COMMENT 姓名, gender ENUM(男, 女) DEFAULT 男 COMMENT 性别, age TINYINT UNSIGNED COMMENT 年龄, class_name VARCHAR(50) COMMENT 班级, created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间 ) COMMENT 学生表;上面这个建表语句包含了主键、自增、非空、唯一、默认值等约束这些都是日常开发中非常常用的配置。四、MySQL 常见数据类型选择合适的数据类型既关系到存储空间也关系到查询性能和数据准确性。MySQL 的数据类型主要分为三类数值类型、字符串类型、日期时间类型。4.1 数值类型整数类型常用TINYINT、INT、BIGINT等。它们的主要区别是占用空间和表示范围不同类型占用字节大致范围TINYINT1 字节有符号约 -128 到 127INT4 字节约 -21 亿到 21 亿BIGINT8 字节非常大的整数范围对于年龄、状态标记等数值使用TINYINT可以节省空间。对于自增主键如果数据量可能很大可以使用BIGINT。小数类型常见的有DECIMAL和FLOAT、DOUBLE。需要精确计算的金额字段应使用DECIMAL(M,D)其中 M 是总位数D 是小数位数例如DECIMAL(10,2)可以表示最多 8 位整数和 2 位小数。4.2 字符串类型最常用的字符串类型是VARCHAR和CHAR。VARCHAR(n)是变长字符串最多存储 n 个字符适合姓名、地址等长度变化较大的数据。CHAR(n)是定长字符串适合存储固定长度的编码。长文本可以使用TEXT。三种 TEXT 类型分别是TINYTEXT、TEXT和LONGTEXT存储容量依次增大。文章内容、评论、JSON 字符串等都可以视大小选择 TEXT 类型。4.3 日期时间类型常用日期时间类型包括DATE、DATETIME和TIMESTAMPDATE只存储年月日格式为 YYYY-MM-DD。DATETIME存储日期和时间范围为 1000 年到 9999 年。TIMESTAMP也存储日期和时间但范围较窄并且会受到时区设置影响。一般情况下记录创建时间和更新时间推荐使用DATETIME因为它范围更大、行为更直观。五、SQL 语言基础与分类SQL 是结构化查询语言用来和关系型数据库交互。按照功能可以大致分为四类DDL数据定义语言例如CREATE、ALTER、DROP。DML数据操作语言例如INSERT、UPDATE、DELETE。DQL数据查询语言主要是SELECT。DCL数据控制语言例如GRANT、REVOKE。日常开发中使用最多的是 DML 和 DQL。理解这四类语句的职责有助于在维护数据库时快速判断某个操作会影响结构还是只影响数据。六、数据插入、更新与删除创建好表之后就可以向表中写入数据。插入数据使用INSERT语句INSERT INTO student (student_no, name, gender, age, class_name) VALUES (20260001, 张三, 男, 18, 高一(1)班);也可以一次插入多条数据INSERT INTO student (student_no, name, gender, age, class_name) VALUES (20260002, 李四, 男, 19, 高一(2)班), (20260003, 王五, 女, 18, 高一(1)班), (20260004, 赵六, 男, 20, 高一(3)班);更新数据使用UPDATE语句。需要注意的是更新和删除语句几乎必须搭配WHERE条件否则会影响整张表UPDATE student SET age 19, class_name 高一(2)班 WHERE student_no 20260001;删除数据使用DELETE语句DELETE FROM student WHERE student_no 20260004;如果不小心执行了不带WHERE的更新或删除可能会清空整张表的数据。因此在生产环境中执行这类语句前建议先使用SELECT确认影响范围必要时进行备份。七、数据查询SELECT 语句SELECT是使用频率最高的 SQL 语句。最基础的查询是查看表中的所有列SELECT * FROM student;一般建议显示列出需要的字段避免SELECT *因为这样更清晰也更容易维护SELECT student_no, name, age, class_name FROM student;7.1 条件查询 WHERE通过WHERE可以筛选符合条件的记录。常用运算符包括、、、、、、LIKE、IN、BETWEEN等。SELECT name, age FROM student WHERE age 18 AND class_name 高一(1)班;模糊查询使用LIKE其中%表示任意多个字符_表示任意单个字符SELECT name FROM student WHERE name LIKE 张%;范围查询可以使用BETWEEN ... AND ...SELECT name, age FROM student WHERE age BETWEEN 18 AND 20;7.2 排序 ORDER BYORDER BY用于对结果排序ASC表示升序DESC表示降序SELECT name, age FROM student ORDER BY age DESC;7.3 分页 LIMITLIMIT用于限制返回行数常用于分页。例如查询第 2 页每页 10 条数据SELECT * FROM student ORDER BY id LIMIT 10 OFFSET 10;其中OFFSET 10表示跳过前 10 条记录。也可以写成LIMIT 10, 10第一个数字是偏移量第二个数字是返回行数。7.4 聚合函数与分组MySQL 提供COUNT、SUM、AVG、MAX、MIN等聚合函数。例如统计学生总数SELECT COUNT(*) AS total FROM student;GROUP BY可以按某个字段分组统计。下面统计每个班级的学生人数SELECT class_name, COUNT(*) AS student_count FROM student GROUP BY class_name ORDER BY student_count DESC;如果要对分组后的结果继续筛选需要使用HAVING而不是WHERESELECT class_name, COUNT(*) AS student_count FROM student GROUP BY class_name HAVING student_count 2;简单来说WHERE在分组前过滤行HAVING在分组后过滤聚合结果。八、约束与数据完整性约束用来保证数据符合业务规则。MySQL 中常用的约束有主键约束、外键约束、唯一约束、非空约束、默认值约束和检查约束。主键约束 PRIMARY KEY唯一标识表中的一行不能为 NULL。外键约束 FOREIGN KEY保证子表引用父表中的记录有效。唯一约束 UNIQUE要求字段值在表中不能重复。非空约束 NOT NULL要求字段必须有值。默认值约束 DEFAULT当未提供值时使用默认值。检查约束 CHECKMySQL 8.0 及以上支持用来限制字段取值范围。下面创建班级表和学生表并建立外键关系CREATE TABLE class_info ( id INT PRIMARY KEY AUTO_INCREMENT, class_name VARCHAR(50) NOT NULL UNIQUE ); CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, student_no VARCHAR(20) NOT NULL UNIQUE, name VARCHAR(50) NOT NULL, class_id INT, CONSTRAINT fk_student_class FOREIGN KEY (class_id) REFERENCES class_info(id) );外键约束能够在一定程度上避免出现“孤儿数据”。不过在高并发系统中有些团队会选择在应用层维护引用关系不使用数据库外键以降低写入时的锁和校验开销。是否使用外键需要结合具体业务判断。九、多表关联查询关系型数据库的核心能力之一就是可以把分散在不同表中的数据关联起来查询。常用的关联方式包括内连接、左连接和右连接。内连接INNER JOIN只返回两表中满足关联条件的记录SELECT s.student_no, s.name, c.class_name FROM student s INNER JOIN class_info c ON s.class_id c.id;左连接LEFT JOIN返回左表全部记录即使右表没有匹配记录也仍然保留左表内容右表字段显示为 NULLSELECT s.student_no, s.name, c.class_name FROM student s LEFT JOIN class_info c ON s.class_id c.id;右连接RIGHT JOIN则相反返回右表全部记录。实际开发中使用左连接的情况更多一些。为了避免字段名冲突上面的语句给表设置了简短别名这也是写复杂查询时的好习惯。十、事务与 ACID 特性事务是一组要么全部成功、要么全部失败的数据库操作。事务可以保证数据从一种一致状态转变为另一种一致状态。事务具有 ACID 四个特性原子性 Atomicity事务中的操作要么全部执行要么全部不执行。一致性 Consistency事务执行前后数据都满足业务规则和约束。隔离性 Isolation多个事务并发执行时相互之间不会产生错误影响。持久性 Durability事务一旦提交对数据的修改会永久保存。一个典型场景是转账从 A 账户扣款再向 B 账户加款。两个操作必须放在同一个事务中START TRANSACTION; UPDATE account SET balance balance - 100 WHERE account_id A; UPDATE account SET balance balance 100 WHERE account_id B; COMMIT;如果中间某个操作失败应当执行ROLLBACK回滚整个事务START TRANSACTION; UPDATE account SET balance balance - 100 WHERE account_id A; UPDATE account SET balance balance 100 WHERE account_id B; ROLLBACK;MySQL 的 InnoDB 存储引擎完整支持事务也是 MySQL 5.5 之后的默认存储引擎。使用事务相关功能时需要确保表是 InnoDB 引擎。十一、索引与查询优化索引是帮助数据库快速定位数据的数据结构。没有索引时数据库可能需要扫描整张表来查找数据有合适索引时则可以直接定位到符合条件的记录。创建普通索引CREATE INDEX idx_student_name ON student(name);创建唯一索引CREATE UNIQUE INDEX uk_student_no ON student(student_no);并不是索引越多越好。索引会占用额外存储空间并且在插入、更新和删除数据时需要维护索引可能降低写入性能。通常应该为以下字段创建索引经常出现在WHERE条件中的字段。经常用于ORDER BY排序的字段。经常用于表关联的外键字段。需要保证唯一性的字段。同时要注意避免对低区分度字段单独建索引例如性别字段通常只有“男”和“女”两个值单独建索引的实际帮助有限。分析查询性能时可以在查询语句前加上EXPLAIN查看执行计划EXPLAIN SELECT * FROM student WHERE name 张三;通过执行计划可以观察是否使用了索引、扫描行数多少以及连接方式是否合理。十二、用户权限与安全管理数据库安全从合理分配权限开始。应避免所有应用都使用 root 账号更不建议把 root 账号暴露给不相关人员。可以为不同应用创建不同账号并只授予必要权限。创建只读账号CREATE USER readonly_user% IDENTIFIED BY Readonly123456; GRANT SELECT ON school.* TO readonly_user%; FLUSH PRIVILEGES;这里的%表示允许从任意主机连接。出于安全考虑生产环境应尽量限制为具体 IP 或内网网段。如果不再需要某个账号可以删除DROP USER readonly_user%;此外还应定期备份数据、及时升级 MySQL 版本、避免在代码中硬编码数据库密码并控制服务器和数据库端口的访问范围。十三、备份与恢复数据备份是数据库运维中非常重要的一环。MySQL 自带逻辑备份工具mysqldump。最简单的全库备份命令如下mysqldump -u root -p school school_backup.sql恢复备份时可以先创建目标数据库再导入备份文件mysql -u root -p school school_backup.sql对于数据量较大的系统还可以使用物理备份工具例如 Percona XtraBackup或者借助云数据库提供的自动备份能力。无论使用什么工具都应该定期演练恢复流程确保备份文件真正可用。十四、常见报错与排错思路初学者经常会遇到一些典型问题掌握排查思路比记住单个解决方案更重要。Access denied通常是账号、密码或主机权限配置错误确认账号是否存在、密码是否正确、授权主机是否包含当前连接来源。Table does not exist可能是表名写错或者没有先执行USE database_name切换到对应数据库。Duplicate entry向有唯一约束的字段插入了重复值检查主键或唯一索引字段。Data too long插入的数据长度超过字段定义长度通常需要调整字段长度或校验输入内容。Foreign key constraint fails插入或更新的外键值在父表中不存在先确认关联记录是否已创建。Lock wait timeout exceeded事务长时间持有锁导致等待超时需要排查长时间未提交的事务。遇到错误时建议先完整阅读 MySQL 返回的错误信息再结合项目中的业务上下文定位问题而不是直接搜索并套用解决方案。十五、学习路线与练习建议掌握 MySQL 基础之后建议按照以下路线继续深入学习熟练写出常用查询包括条件筛选、排序、分组、聚合和分页。理解表结构设计练习为实际业务场景拆分表、设置主外键和索引。掌握事务隔离级别了解脏读、不可重复读和幻读的区别。学习执行计划分析尝试优化慢查询。了解主从复制、读写分离和高可用架构的基本原理。最好的学习方式是结合实际项目练习。可以自己设计一个简单的学生管理、博客或订单系统把建库、建表、增删改查、关联查询、事务和索引全部用起来。只有真正在项目中使用过这些知识才能理解它们各自解决的问题和价值。