MySQL零基础入门:从安装建库到增删改查实战
先交代一句这篇东西不是照着官方文档念而是按我自己带人入门的经验来写。很多新手学 MySQL 最大的问题不是学不会而是被一堆命令吓住了敲完也不知道自己在干嘛。这篇基础篇一会带着你把 MySQL 装好、把库建起来、把最简单的增删改查跑通每一步都告诉你为什么要这么写。MySQL 是后端开发、数据分析、运维这些方向几乎绕不开的数据库刚入行的时候把它的基础打牢后面学什么都会顺很多。这篇文章适合从来没接触过数据库的人也适合学过一点但总觉得概念飘着的朋友。我会用大白话把“数据库到底在解决什么问题”讲清楚再给你一套能直接照着敲的实操流程。1. 先搞明白MySQL 到底帮你解决了什么问题1.1 数据库和你电脑上的 Excel 有什么区别很多人一听到“数据库”就觉得很高大上其实它干的事特别朴素存数据、管数据、让你能随时把数据拿出来用。你可以把 MySQL 理解成一个加强版的 Excel但它比 Excel 强在三个地方。第一是并发处理。Excel 打开一个文件同一时间基本只有你能编辑别人要看还得等文件传过去。MySQL 能同时让几十上百个程序去读写同一份数据而且能保证数据不乱。这个能力对网站、App 这类需要多个用户同时访问的场景是必须的。第二是查询效率。Excel 里几千行数据用筛选还行到了几十万行光是打开文件就能卡半天。MySQL 用标准的 SQL 语言去查数据配合索引机制百万级数据量的查询也能在毫秒级返回结果。第三是数据安全。Excel 文件容易误删、损坏改坏了还不好恢复。MySQL 有完整的权限机制、备份恢复方案和日志系统虽然这些是后话但底层设计就是冲着“数据不能丢”去的。1.2 关系型数据库的核心思想二维表MySQL 属于关系型数据库这类数据库最核心的模型就是“二维表”。你看你手机里的通讯录列是姓名、电话、地址行是每一个联系人——这就是一张表。MySQL 的世界里数据就是按照这种“行是记录、列是字段”的方式组织的。所以学 MySQL 的时候你脑子里始终要有一张 Excel 表格的样子后面所有 SQL 语句都是围绕这张表在做操作。数据库Database就是一个文件夹里面放很多张表Table这些表之间还能互相建立联系——比如一张用户表、一张订单表通过用户ID就能关联起来。这个关联的概念现在不用深入你先记住这个文件夹和表格的关系就行。1.3 SQL 是个什么东西需要全背下来吗SQL 不是 MySQL 独有的它是一套通用的数据库操作语言你以后用其他数据库也一样要写。它大致分成几类DDL数据定义语言建库、建表、改表结构比如 CREATE、ALTERDML数据操作语言往表里增、删、改数据比如 INSERT、UPDATE、DELETEDQL数据查询语言查询数据核心就是 SELECTDCL数据控制语言管理权限比如 GRANT前期基本用不到刚入门不需要把这些分类全记熟但脑子里有个印象会有帮助。这篇基础篇主要带你把 DDL 和最简单的 DML、DQL 过一遍。SQL 的语法是有规律的多用几次就记住了真到了复杂的写法查文档、搜资料都很正常不需要硬背。2. 环境搭建把 MySQL 装到你的电脑上2.1 选择安装方式装 MySQL 是新手的第一道坎但其实没那么难。我见过很多人卡在安装这一步就开始打退堂鼓所以我先把三种系统的情况都说一下。Windows 用户直接去 MySQL 官网下载安装包。下载的时候选 MSI Installer 版本它带一个图形化的安装向导你一路点 Next 就行。记得在选择配置类型的界面选 Server only 就够了那些 Samples、Examples 之类的组件用不上装了还占空间、拖慢安装速度。macOS 用户下载 DMG 格式的安装包双击安装跟装普通软件一样。Linux 用户不需要去官网直接用系统自带的包管理器安装常见的发行版里搜 mysql-server 或 mysql 相关的包装完服务会自动注册好。装的过程中最关键的步骤是设置 root 用户的密码。root 就是 MySQL 的最高权限账号相当于你电脑的 Administrator。这时候设置的密码一定得记牢后面所有操作都要用它登录。我建议别用什么 123456 这种密码至少字母加数字组合不然哪天被人扫到了端口数据被删了都没地方哭。2.2 验证安装结果并连上数据库安装完成之后打开命令行终端先确认一下 MySQL 是否装好了。Windows 的 cmd 或者 PowerShell、macOS 和 Linux 的终端都行输入mysql --version如果看到了 mysql 的版本号比如 mysql Ver 8.0.x说明装好了。如果提示“mysql 不是内部或外部命令”不用慌99% 的原因是没有把 MySQL 的 bin 目录加到系统的环境变量里。Windows 用户去系统设置里找到环境变量把 MySQL 安装目录下的 bin 文件夹路径加进去重新打开终端就好了。确认版本之后开始第一次连接数据库mysql -u root -p这条命令的意思是用 root 用户登录-p 表示需要输入密码。回车之后系统会提示你 Enter password输入安装时设置的密码就行。成功之后你会看到Welcome to the MySQL monitor. mysql看到mysql这个提示符你就正式进入 MySQL 的命令行世界了。所有 SQL 语句都是在这个提示符后面输入的。2.3 第一句 SQL看看里面有什么登录之后先别急着建表我们先执行一句最简单的 SQLSHOW DATABASES;注意最后这个分号必须带它表示这条语句结束了。MySQL 默认会带几个数据库有 information_schema、mysql、performance_schema、sys 这几个它们都是 MySQL 自己用来管理内部信息的系统库新手阶段不要动它们。我们以后要建的库会和它们平级地出现在这个列表里。执行完这句你就完成了人生中第一次和数据库的交互。整个过程只要有耐心十分钟内一定能走通。3. 建库建表动手创建你的第一张业务表3.1 先想清楚你要建一个什么表学数据库最忌讳的就是拿起键盘就敲代码脑子里一片空白。我自己的习惯是先从业务角度想清楚我要存什么数据这些数据有哪些字段每个字段是什么类型比如我们做一个学生信息管理的小项目要存学生数据。那这张学生表应该有哪些字段学号、姓名、年龄、班级、入学时间这是最基础的信息。把这些字段列出来之后再来考虑每个字段的类型和长度建表语句就水到渠成了。这就好比你要在 Excel 里做一个表格肯定先想好第一行要写哪些列名再往下面填数据。建表也是一样的思路只是把操作换成了 SQL 语句。3.2 写 SQL 语句创建数据库和表第一步是创建数据库。我们用school作为库名代表学校项目的数据都在这个库里CREATE DATABASE IF NOT EXISTS school DEFAULT CHARACTER SET utf8mb4;这条语句做了三件事创建名为 school 的数据库IF NOT EXISTS 的意思是如果已经存在就不重复创建避免报错DEFAULT CHARACTER SET utf8mb4 是设置默认字符集这个非常重要后面单独讲。然后切换到这个库里面USE school;接下来创建学生表CREATE TABLE student ( id INT AUTO_INCREMENT PRIMARY KEY, stu_no VARCHAR(20) NOT NULL, name VARCHAR(50) NOT NULL, age INT, class_name VARCHAR(50), enroll_date DATE );我把每个字段拆开解释一下id学生的自增主键每插入一条记录它自动加 1从 1 开始。AUTO_INCREMENT 是自增的意思PRIMARY KEY 是主键的意思主键的作用是唯一标识一条记录就像身份证号码不能重复也不能为空。你不用手动去填 id数据库会自动帮你生成。stu_no学号VARCHAR(20) 表示可变长度的字符串最大 20 个字符。NOT NULL 表示这个字段不能为空记录一条学生数据学号必须有。name姓名最长 50 个字符。中文按字符算一般 50 够用了。age年龄整数类型。class_name班级名称也是可变字符串。enroll_date入学日期DATE 类型只存日期不存时间。写完这条 CREATE TABLE 之后MySQL 会提示 Query OK说明表已经建好了。你可以用下面的命令查看表结构DESC student;执行之后会看到一张表格每一行是一个字段包含字段名、类型、是否允许为空、默认值、是否有主键等信息。以后你随时想看任何一张表的结构都可以用这个命令。3.3 主键、自增、非空这三个约束先吃透建表语句里出现了三个最常见的约束我专门展开说一下因为它们直接影响你后面写数据的体验。主键 PRIMARY KEY 的价值在于唯一性。一张表里主键的值绝对不能重复这保证了每条记录都能被准确定位。买火车票的时候你的身份证号对应一张票身份证号就是那个场景的主键。如果一张表没有主键会出现两条一模一样的记录到时候想更新其中某一条都没法精确指定后续会很麻烦。AUTO_INCREMENT 是配合主键使用的。你插入数据的时候不需要传 id 字段MySQL 会自动用当前最大值加 1 作为新记录的主键。它的好处是并发环境下也不会重复。NOT NULL 的作用是强制要求某个字段必须有值。比如学生姓名如果允许为空就会出现一条没有姓名的记录这种脏数据在业务里很难处理。所以关键字段都建议加上 NOT NULL。4. 字段类型先选对后面能少改很多表4.1 整数、小数的选择别拍脑袋选择字段类型时最常见的问题是“都用 INT 不就行了”。真不是这样。我举几个例子你就明白了。手机号虽然是数字但如果用 INT 存会存不下。INT 最大的值是 2147483647手机号是 11 位。而且手机号不应该参与运算存成字符串更合理。年龄、数量这类字段用 INT 没问题。金额必须用 DECIMAL不能用什么 FLOAT、DOUBLE。因为浮点数在计算机里是近似存储的0.1 加 0.2 可能等于 0.30000000000000004这在算钱的时候是不可接受的小数误差。DECIMAL 是按精度存储的十进制数比如 DECIMAL(10,2) 表示总位数 10 位其中小数 2 位这样存金额就不会有精度问题。如果数据量预估会很大比如订单 ID、日志ID 这类可能超过 21 亿条的场景直接用 BIGINT。BIGINT 的范围大到几乎不会用完。4.2 字符串和日期类型字符串类型最常见的是 CHAR 和 VARCHAR。CHAR 是定长的比如 CHAR(10) 不管存多少字符都占 10 个字符的空间。VARCHAR 是变长的存多少占多少。日常业务里 VARCHAR 用得更多只有在字段长度固定不变的时候才用 CHAR比如性别、状态码这种固定长度的短数据。日期时间类型里DATE 只存年月日适合生日、入职日期这种DATETIME 存日期加时间适合订单创建时间、日志时间。TIMESTAMP 也是日期加时间但它有时区概念取值范围小。早期开发统一用 DATETIME 就好逻辑最简单不会因为时区问题突然发现时间差了几个小时。字段类型选对的核心意义在于节省存储空间、提升查询速度、避免精度问题。我一个朋友做过一个项目早期年龄用了 VARCHAR后来要按年龄排序统计的时候发现是按字典序排的10 排在 2 前面改表结构折腾了很久。类型选错的代价往往是后期成倍返还。4.3 字符集一定要用 utf8mb4前面建库的时候我特意写了 DEFAULT CHARACTER SET utf8mb4这里解释一下为什么。老版本的 MySQL 默认字符集是 utf8但它在 MySQL 里最大只支持 3 个字节的 UTF-8 编码。大部分常见文字没问题但遇到一些生僻字或者 emoji 表情就存不进去了直接报错或者变成乱码。utf8mb4 是真正的 4 字节 UTF-8可以兼容全部 Unicode 字符。现在新建数据库我都是无脑用 utf8mb4。还有排序规则collation一般选 utf8mb4_unicode_ci 或者 utf8mb4_general_ci 就行前期怎么选影响不大但你只要记住字符集别用默认的 latin1也别用 utf8直接用 utf8mb4 是最稳的。5. 增删改查先把数据写进去5.1 用 INSERT 往表里加数据建好表之后我们来往 student 表里插入几条记录。插入语句的格式是INSERT INTO student (stu_no, name, age, class_name, enroll_date) VALUES (2025001, 张三, 18, 三年二班, 2025-09-01);这里有三个点需要说明。第一字段列表可以不写全但 VALUES 里必须和字段列表一一对应。上面这条语句里没有 id因为 id 是自增的MySQL 会自动生成。如果某个字段有 NOT NULL 约束但你没填会直接报错。第二字符串和日期类型的值都要用单引号括起来数字不用。第三日期格式要写成 2025-09-01 这种标准的横杠格式MySQL 才能正确识别。你还可以一次插入多条记录只要把 VALUES 后面用逗号分隔多个括号INSERT INTO student (stu_no, name, age, class_name, enroll_date) VALUES (2025002, 李四, 19, 三年一班, 2025-09-01), (2025003, 王五, 18, 三年二班, 2025-09-02);数据插入之后可以用查询语句看一眼SELECT * FROM student;这个时候你就能看到刚才插入的数据id 字段已经被自动填充成 1、2、3 了。5.2 UPDATE 修改数据WHERE 条件务必带上修改数据用 UPDATE。假设张三转班了要把他的班级改成三年三班UPDATE student SET class_name 三年三班 WHERE stu_no 2025001;这条语句的核心是 WHERE 条件。它指定了“只修改学号为 2025001 的那条记录”。新手最容易犯的致命错误就是忘记写 WHERE 条件。你执行下面这条语句UPDATE student SET class_name 三年三班;它会把你表里所有学生的班级全部改成三年三班。这绝对不是你想要的效果。所以在写 UPDATE 语句的时候我个人的习惯是先把 WHERE 条件写好再写 SET 部分养成这个肌肉记忆之后基本不会出大乱子。如果 WHERE 条件里匹配到了多条记录比如按 class_name 来改那所有符合条件的学生都会被修改。这是一个特性也可以看成危险来源全看你有没有想清楚要影响哪些数据。5.3 DELETE 删除数据同样的坑不要踩第二遍删除数据的语法和 UPDATE 很类似DELETE FROM student WHERE stu_no 2025001;这条语句会删除学号为 2025001 的那条学生记录。如果不加 WHERE执行 DELETE FROM student整个表的所有数据都会被清空而且是不可恢复的。我建议刚入门的新手对 DELETE 保持敬畏之心哪怕你在自己本机练习也养成“先 SELECT 再 DELETE”的习惯。也就是说删除之前先用 SELECT 把要删除的记录查出来看一眼确认范围没问题再执行 DELETE。我自己工作几年了生产环境执行删除语句之前都会先跑一遍等价的 SELECT确认影响行数符合预期才敢动手。6. SELECT 查询入门把数据读出来才是最终目的6.1 基础查询与指定列查询SELECT 是数据库使用频率最高的一条语句也是后面所有复杂查询的地基。最简单的用法是把整张表查出来SELECT * FROM student;星号表示所有列。我自己练习时会用但写业务代码时不太建议用星号因为一张表字段多了以后星号会把一堆不需要的数据也捞出来浪费网络带宽和内存。更规范的做法是只查你需要的列SELECT name, age FROM student;这条语句只返回姓名和年龄两列。这里有个概念叫投影就是指定列的查询。你只需要记住需要什么列就把列名写上列的显示顺序就是你写的顺序。6.2 用 WHERE 给数据做过滤刚才的 SELECT 会把整张表的数据都返回。实际业务里我们往往只需要满足某些条件的数据。比如想查所有十八岁的学生SELECT name, age, class_name FROM student WHERE age 18;WHERE 后面跟着的是一个条件表达式它会对每一行数据进行真值判断只有结果为真的行才会出现在结果里。这个机制和 UPDATE、DELETE 里的 WHERE 是同一个道理。你也可以用比较运算符组合出更丰富的条件。查大于十八岁的学生用age 18查询不是三年二班的可以用class_name ! 三年二班还可以用 AND、OR 连接多个条件SELECT * FROM student WHERE age 18 AND class_name 三年一班;这条语句表示年龄大于 18 且班级是三年一班的学生。AND 要求所有条件同时满足OR 只要满足一个就行。新手一开始容易搞混不用急多用两次自然就清楚了。6.3 排序和限量ORDER BY 与 LIMIT查询结果默认是按照插入顺序返回的但很多时候我们需要按某个字段排序。比如按年龄从小到大排SELECT name, age FROM student ORDER BY age ASC;ASC 是升序从小到大也是默认顺序不写也行。想从大到小就用 DESC。一般做排行榜、看最新数据的时候都用 DESC。LIMIT 用来控制返回多少行。比如只取前两条SELECT * FROM student LIMIT 2;这个在分页场景特别常用。页面显示数据不可能一次性返回几十万条都是每页固定条数。第一页取 LIMIT 10第二页用 LIMIT 10 OFFSET 10表示跳过 10 条再取 10 条这就是分页的逻辑。ORDER BY 和 LIMIT 经常配合使用。想查年龄最大的三个学生SELECT name, age FROM student ORDER BY age DESC LIMIT 3;这条语句的执行顺序是先按年龄降序排列再取前三条。学 SELECT 的时候脑子里要建立一个执行顺序的概念先 FROM 找到表再 WHERE 过滤行再 SELECT 投影列再 ORDER BY 排序最后 LIMIT 截断。这个顺序能帮你理解很多复杂查询的行为。7. 新手最容易踩的五个坑和他的排查办法7.1 命令敲不进去不是内部或外部命令刚装完 MySQL打开命令行输入 mysql --version系统提示不是内部或外部命令。这个问题的原因我在前面环境配置部分已经说了是环境变量没配好。解决方法是找到 MySQL 安装目录下的 bin 文件夹把完整路径加到系统环境变量的 Path 里然后关掉终端重新打开。macOS 或者 Linux 用户更要检查一下是不是没有把安装目录下的 bin 加进 PATH或者安装过程中途失败。7.2 报错 ERROR 1045 Access denied输入 mysql -u root -p 之后系统提示 ERROR 1045 (28000): Access denied for user root。这个错误说明密码不对或者 root 用户当前不允许从你登录的这个来源连接。密码输错是最常见的原因检查一下大小写锁没锁可能 Caps Lock 按了都不知道。如果确实忘了密码可以查一下当前版本的官方文档里面关于重置 root 密码的说明核心思路是临时绕过权限验证登录进去然后重新设置密码。这个操作要谨慎但自己本机练习的时候偶尔用得上。7.3 中文数据变成乱码插入中文数据之后查出来全是问号或者乱码这个问题在初学者里出现频率非常高。原因几乎都是字符集不对。早期的默认字符集不支持中文或者连接 MySQL 的时候客户端、连接、数据库、表的字符集不一致。解决办法就是我在建库时反复强调的数据库字符集用 utf8mb4并且在连接的时候也设置好字符集。你在命令行登录时可以加参数mysql -u root -p --default-character-setutf8mb4这样客户端用的字符集就和数据库统一了乱码问题基本能解决。7.4 端口 3306 被占用启动 MySQL 服务的时候提示端口被占用或者连接的时候报端口错误这是因为 3306 端口已经被别的程序占用了。排查方法是查看当前哪些进程在监听 3306 端口找到占用端口的进程看它是否是你之前装的多余 MySQL 实例。如果有把多余的停掉直接用新的就行。不想跟别人抢端口的也可以在 MySQL 配置文件里把端口改成别的但这会带来额外的记忆成本后期连接的时候容易忘记端口号所以能不改就不改清除掉多余的进程更稳妥。7.5 忘了加 SQL 结尾的分号在 mysql 命令行输完 SQL 语句后没有反应只是换了行然后提示符变成了箭头符号这不是死机了是 MySQL 在等你输入语句结束符。SQL 语句的结束标志就是分号你不加分号它就一直等着。处理办法很简单在末尾补一个分号回车语句就执行了。如果不小心进入了这种状态又不想继续输入可以输入 \c 取消这条语句。新手阶段还有一个小问题就是 SQL 关键字大小写混着写会不会报错。MySQL 对关键字本身是不区分大小写的SELECT 和 select 都能执行表名在 Windows 上也不区分但在 Linux 上是区分大小写的。我建议统一用小写字母写 SQL养成一致的风格读起来也干净。我最初入门的时候学 MySQL 最深的感触是它没有想象中那么难也没有想象中那么轻松关键是要把每一步操作和背后的逻辑对上号。建数据库到底在做什么加 WHERE 条件到底在限制什么类型选错到底会引发什么问题——这些想明白了后面学索引、学表关联、学事务都会顺畅得多。你现在照着我上面的步骤把环境搭好把语句敲一遍然后把示例数据自己换着花样查几次这个基础就算扎扎实实立住了。下一篇我们再继续往深走把查询的进阶用法和表关系设计讲清楚。