资讯动态

MySQL入门:从建库建表到增删改查,避开新手最常见的坑

发布时间:2026/10/15 5:08:55 来源:尧图企业网站定制
开头从一次带新人的经历引入很多小白把会用Navicat当成会MySQL实际上点鼠标和写SQL之间隔着整整一套概念体系。本篇是MySQL系列第一篇从核心概念讲起手把手带建库、建表、写增删改查并穿插一些容易踩的坑。1. MySQL到底是什么别再把客户端工具当成数据库我第一次带实习生的时候发现一个特别普遍的现象很多人把Navicat、DBeaver这类可视化工具当成数据库本身。打开工具点几下鼠标看到表格数据就觉得自己会用MySQL了。这是一个很危险的误解。MySQL本质上是数据库管理系统DBMSDatabase Management System它是跑在服务器上的一个后台程序专门负责数据的存储、查询、修改、删除和权限控制。而Navicat、DBeaver、命令行小黑窗这些只是用来和MySQL服务器对话的客户端工具。换句话说MySQL在后台默默干活你用的工具只是传话筒。装MySQL的时候很多人被安装这件事绕晕了因为一个安装包里往往包含好几个东西。拆开看其实就三块服务器端mysqld真正负责存储和读取数据的程序平时跑在后台不露面。客户端mysql提供命令行界面让你能直接敲SQL语句和服务器交互。图形化管理工具如Navicat、Workbench可选装本质还是客户端只是把输入SQL和看结果的过程做成了图形界面。用一个不太严谨但好理解的类比MySQL服务器像一家银行的金库客户端工具像柜台的窗口。你办业务查余额、存取款是在窗口完成的但真正动金库的永远是后台那个人。你把窗口砸了卸载Navicat金库还好好的真正要操心的是金库里那个管账的人——MySQL服务器本身。学习MySQL的第一课我建议强迫自己在命令行客户端里完成所有操作不要急着装图形工具。命令行虽然看起来原始但它能逼你想清楚我正在给服务器发什么指令而不是我在哪个按钮上点了什么。等到SQL语句熟练了再换图形工具提升工作效率你会发现两种工具在你眼里已经完全不一样了——前者是本质后者是皮肤。如果你用的是Linux服务器或Mac命令行一般是自带的Windows上装完MySQL后在开始菜单里能找到MySQL Command Line Client点开输入安装时设置的root密码就能进去。看到mysql这个提示符说明你已经连上服务器了接下来敲的每一句SQL服务器都会认真执行。2. 从一行数据说起库、表、行、列的关系在真正开始写SQL之前必须把MySQL里最基础的四层结构搞清楚。很多新手后面写SQL报错根子就在于概念模糊比如字段和记录分不清数据库和表混着用。这四层结构从上到下是这样的**数据库Database**相当于一个文件夹里面装着若干张表。你新建的项目通常对应一个独立的数据库不同项目用不同库互相不干扰。**表Table**是真正存数据的地方结构类似Excel表格。一张表只描述一类事物比如用户表只管用户订单表只管订单理论上不会出现一张表里既放用户信息又放订单信息的设计——这涉及后面的表结构设计规范现在先有个印象。**字段Column**就是表的列描述事物的某个属性。用户表里的name、age、email都是字段。字段需要提前定义好类型这个列里将来只能装数字、文字还是日期。**记录Row**是表的行特指一条完整的数据。用户表里一行就是一个完整用户包含这个用户的所有属性值。我教新人时常用一句话总结字段是填什么记录是一个完整的东西。字段决定了这张表能填哪些属性记录决定了这张表里实际有多少条实体。概念上糊涂的人经常会在写SQL时把列名和值的位置写反或者在不知道某列该用整数还是小数的时候乱选类型最后取出来的数据全是错的。这里还要提一嘴主键Primary Key它是整张表最重要的字段用来唯一标识一条记录。主键有一个硬性要求不能重复、不能为空。最常见的做法是用id字段做主键类型用整数后面加一个AUTO_INCREMENT自增这样每插入一条新记录MySQL会自动给你分配一个从1开始、依次递增的编号完全不用手动管理。自增主键有点像超市排队取号机器自动发号永不出错。有人会问为什么不能直接用姓名、身份证号之类有业务含义的字段做主键因为业务会变——姓名可能重名身份证号虽然理论上唯一但要是有录入错误会很麻烦。用无业务含义的自增数字做主键是最省心、最稳妥的设计。等到后面学表关系JOIN时你会发现主键存不存在、稳不稳定直接决定了表之间能不能高效关联。3. SQL的四大门派DDL、DML、DQL、DCL有了结构概念接下来要认识的是操作这门语言的语法体系。SQLStructured Query Language结构化查询语言是关系型数据库通用的语言MySQL只是实现了这套语言标准的众多数据库之一。SQL按功能分成四大类一开始搞清楚这个分类后面学习会非常有条理。DDL数据定义语言管结构负责创建、修改、删除数据库和表。关键字包括CREATE创建、ALTER修改、DROP删除。DDL操作的是表有没有、字段有哪些这些框架问题不关心具体数据。DML数据操作语言管数据负责对表里的记录做增、删、改。关键字包括INSERT插入、DELETE删除、UPDATE更新。DML操作的是表里到底装了哪些数据它必须在表已经存在的前提下进行。DQL数据查询语言管查数据只有一条命令就是SELECT。查询是使用频率最高的操作也是后面学习的重头戏。我见过不少项目一条SQL写几百行各种表关联嵌套本质都是在用DQL从数据库里组装出业务想要的数据。DCL数据控制语言管权限负责管理用户权限、控制访问。常用关键字有GRANT授权、REVOKE撤销权限、COMMIT提交事务和ROLLBACK回滚事务。单个开发者阶段DCL用得不多通常是数据库管理员关心的事情但了解一下能让你知道权限边界这件事在数据库层面是怎么实现的。四大分类有什么用最大的实际意义是当你写SQL报错时能快速判断是语法问题还是逻辑问题。CREATE TABLE写错了那是DDL语法不过关SELECT查出来的数据不对那是DQL逻辑有问题。排查方向完全不同思维清楚解决问题就快。另外说一句加班血泪换来的忠告任何修改类操作UPDATE / DELETE在正式执行前先看一眼有没有WHERE条件。新手最经典的翻车事故就是——DELETE FROM users;这句语句没有任何WHERE意味着把users表里的数据全删了。想删的是某个用户结果全表清零。这个坑怎么强调都不为过我在团队里要求所有人执行DELETE和UPDATE时必须先SELECT一遍相同WHERE条件确认范围没有例外。4. 实操第一课连接服务器、建库、建表上面全是概念铺垫到这里进入真正的动手环节。从零开始跑通连接—建库—建表—查看结构的全流程。4.1 连接MySQL服务器假设你本地已经安装好MySQL打开命令行客户端Windows的MySQL Command Line Client或者Mac/Linux终端里敲mysql -u root -p按提示输入root密码后看到这个就说明连上了mysql如果是在自己的电脑上学习root是超级管理员账号拥有所有权限。注意密码输入时命令行不会显示任何字符这是正常的不是键盘坏了。提示在学习阶段使用root账号完全没问题。但等你要部署真实项目时千万不要给业务系统用root连接数据库。正确做法是创建一个权限受限的专用账号只给它某个库的增删改查权限——数据库安全的底线往往不是外部攻破而是内部权限失控。4.2 查看已有数据库连接成功后先看看服务器上现在有什么。MySQL安装好之后自带几个系统数据库information_schema、mysql、performance_schema等这些是MySQL自己用来管理内部数据的新手不要去动它们。SHOW DATABASES;注意SQL语句结尾的分号;不能少它表示这条语句结束了MySQL才会开始执行。如果不加分号直接回车命令行会认为你还没写完显示续行状态很多人第一次卡在这里。4.3 创建自己的数据库输入下列语句创建一个专门用来学习的数据库CREATE DATABASE study_db DEFAULT CHARACTER SET utf8mb4;这条命令里study_db是库名DEFAULT CHARACTER SET utf8mb4指定字符集。字符集这块值得展开讲一下早期MySQL默认字符集是utf8但它只支持基本的多语言字符遇到一些生僻汉字、emoji表情会出现乱码或报错。utf8mb4是utf8的超集能完整支持所有Unicode字符是现在的事实标准。从建库这一步就把字符集设好能省掉后面一堆编码折磨。注意utf8mb4写法里是数字4不是字母a。数据库新手经常把这个打错报错后一脸懵。执行成功后命令行会提示Query OK。然后用SHOW DATABASES;再看一眼列表里已经多了一个study_db。4.4 进入数据库并建表建完库还要选库让MySQL知道接下来操作的是哪个数据库USE study_db;这里有一个新手经常踩的坑建好库之后不执行USE直接写CREATE TABLE结果报No database selected。就好比进了大楼却没说要去几层电梯不知道该送你到哪。命令行客户端每次新开会话都需要重新指定库下次重连时的第一件事就是USE。接下来创建一张学生表包含学号、姓名、年龄、入学日期四个字段CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT, enroll_date DATE );逐个解释字段定义的含义id INT PRIMARY KEY AUTO_INCREMENTid字段用整数类型作为主键自增。以后插入数据时不用手动给id赋值MySQL自动从1开始往后分配。name VARCHAR(50) NOT NULL姓名用可变长字符串最长50个字符加了NOT NULL约束表示这个字段不能为空。VARCHAR存的是最多50个字符实际有多少存多少不会浪费空间。age INT年龄用整数类型这种与业务无关的属性先不设约束允许为空。enroll_date DATE入学日期用日期类型MySQL有专门的DATE类型来存年月日比硬塞进字符串里方便得多——日期类型可以直接做大小比较、计算相隔天数这在后面写统计查询时非常好用。4.5 查看表结构建表之后可以确认一下结构DESC student;MySQL会用一张表把这个表的字段名、类型、是否允许为空、主键信息、默认值等一列列列出来。想看得更详细可以执行SHOW CREATE TABLE student;它会返回当初建表用的完整SQL语句甚至包含一些你没显式写但MySQL默认帮你加上的配置这是排查表结构问题最强力的工具。跑通建库—选库—建表—查看结构这条线你就已经掌握了MySQL最核心的骨架操作。接下来往骨架里填数据也就是真正高频的增删改查。5. 增删改查CRUD从插入第一条记录开始删除、修改、插入、查询这四件事的英文首字母拼起来就是CRUDCreate、Read、Update、Delete这是数据库日常操作的基础几乎所有业务系统最终都可以归纳为对数据库的CRUD。这一节把四个基本操作全部过一遍顺便讲清楚每个操作背后容易出问题的地方。5.1 插入记录INSERTINSERT INTO student (name, age, enroll_date) VALUES (小明, 18, 2024-09-01);注意这里没有写id字段因为它是自增主键MySQL会自动分配。字段列表和值的顺序必须一一对应name对应小明、age对应18、enroll_date对应2024-09-01。字符串和日期要加单引号整数和浮点数不用加。当表有好几十个字段时强烈建议在INSERT语句里明确写上字段列表而不是省略INSERT INTO student VALUES (1, 小明, 18, 2024-09-01);这种写法虽然合法但完全依赖字段顺序一旦表结构调整比如新增一个字段这条语句就会报字段数量不匹配排查起来特别麻烦。明确写字段列表SQL可读性和稳定性都更好。一次插入多条记录只要把括号里的内容用逗号隔开INSERT INTO student (name, age, enroll_date) VALUES (小红, 17, 2024-09-01), (小刚, 18, 2023-09-01), (小丽, 19, 2022-09-01);这也是一种常用的小技巧不要一条条执行INSERT能合并就合并因为每执行一次SQL都有网络往返和解析开销批量插入能有效节省时间数据量越大越明显。5.2 查询记录SELECT查询是CRUD里最常用的操作但新手阶段先掌握最基本的三件套查全部、按条件查、查指定字段。SELECT * FROM student;*表示查询所有字段适合刚开始看数据全貌时使用。但在公司规范里生产环境往往不允许用*因为它会把不需要的字段都拉出来白白增加网络传输负担。更推荐的做法是点名要查的字段SELECT name, age FROM student;按条件查询用WHERESELECT * FROM student WHERE age 18;WHERE后面跟条件表达式支持比较运算、!、、、、、逻辑运算AND、OR、NOT等。这句话会筛选出所有年龄大于等于18的学生记录。如果你的表里有很多条记录希望只展示前面几条可以用LIMIT限制返回数量SELECT * FROM student LIMIT 3;这个操作网站分页功能里用得非常多比如第一页10条就是LIMIT 0, 10第二页是LIMIT 10, 10。LIMIT是MySQL里很常用的结束语排在SQL语句的最后面。5.3 修改记录UPDATE修改记录是这个单元里最需要警惕的操作。语法很直观UPDATE student SET age 19 WHERE name 小明;这条语句把小明的年龄改成19。关键就是前面强调过的WHERE条件——它圈定了哪些记录会被改。如果漏写WHEREUPDATE student SET age 19;它会修改表里所有记录的年龄字段没有任何提示执行完连后悔的机会都几乎没有。别问我怎么知道的每个数据库老手都有一段被自己全表更新支配的恐惧。真正的职业习惯是执行UPDATE之前先跑一遍同样的WHERE条件做SELECT确认范围SELECT id, name, age FROM student WHERE name 小明;确认查询结果里就是你想改的那几行再执行UPDATE。5.4 删除记录DELETE删除是四兄弟里最危险的大部分数据恢复请求都源于DELETE写错范围。DELETE FROM student WHERE name 小明;执行后小明这条记录就没了。删数据前我强烈建议先用相同条件SELECT确认SELECT * FROM student WHERE name 小明;看到结果确实只有小明再把SELECT *换成DELETE重新执行一次。整个过程多花10秒钟但能避免一次灾难。另外要区分DELETE和DROPDELETE是删除记录表结构还在像删掉Excel里的几行DROP是删除表整个表连同结构一起没了像把整个Excel文件扔进回收站。刚入门时这两个词经常混用但后果完全不同。尤其是面试和实际工作里你写DROP TABLE之前一定要多确认一遍是真的要删掉整张表吗6. 数据类型选错是怎么坑人的聊聊字段设计前面建表时已经用过INT、VARCHAR(50)、DATE三种类型。但实际建表时选错类型是非常常见的问题而且一旦表建好数据填进去了后面再改类型非常痛苦。这里把最常用的几类聊透你就知道该怎么选了。整数类型包括TINYINT极小整数、SMALLINT小整数、INT常规整数、BIGINT大整数。它们的区别是可存储的数值范围和占用空间大小。年龄用TINYINT UNSIGNED就够了0~255用户ID建议用INT但要考虑上亿数据量的话就得用BIGINT。选类型时记住一个原则够用就好但别抠到不够用。比如年龄字段选TINYINT UNSIGNED完全合理因为不会有人活过255岁但订单ID如果业务规模可能很大直接上BIGINT更省心因为等INT不够用了发现还得改表结构迁移成本高到流泪。字符串类型最常用的是VARCHAR(n)n表示最多能存几个字符这种类型用多少存多少节省空间。另一个是CHAR(n)它是定长的不够长度会用空格补齐。名字、邮箱、地址这类长度变化大的字段用VARCHAR固定长度的场景很少比如有些系统用固定编码表示状态001、002可以考虑CHAR。TEXT类型用来存大段文本比如文章正文、评论内容。初学者选VARCHAR时经常纠结长度我给个通用参考范围姓名30、邮箱100、地址200、标题100基本覆盖绝大多数场景。日期时间类型DATE只存年月日如2024-09-01DATETIME存年月日时分秒如2024-09-01 14:30:00TIMESTAMP也差不多但有时区概念。创建记录时间、更新时间这类字段一般用DATETIME或TIMESTAMP。有个实用设置是默认值用CURRENT_TIMESTAMP这样插入记录时MySQL自动填当前时间业务代码完全不用管。建表时给每个字段都设好合适的类型就像装修前定好每个房间的用途。前期多花一小时想清楚后面少加无数班。7. 入门阶段最常见的五个坑和对应的排坑思路前面各部分陆续提到了一些坑这里汇总一下入门阶段最高频的五个问题方便你自查。这些问题每个我都见过新手反复踩单独列一个章节因为它们避坑的价值比多写几句SQL高得多。没有分号导致的卡死执行SQL后回车发现命令行换了一行继续等待输入那是因为语句末尾没加分号;。MySQL会认为你尚未输入完一直处于等待状态。这时候补上分号回车即可如果语句已经乱掉按CtrlC取消当前输入重来。密码输入没反应命令行输入密码时不做任何回显连星号都没有这是安全设计而不是故障。输完直接回车即可。库名打错导致No database selected只要执行建表操作时报这个错第一反应就是检查有没有执行USE 数据库名;。这个错误提示虽然出现的场景很基础但即使是我在新建一个会话忘了选库时也会碰到。DELETE或UPDATE忘记WHERE前面强调过执行修改和删除之前必须先用相同的WHERE条件执行SELECT确认范围。这应该成为肌肉记忆不是知识而是习惯。中文乱码解决思路是统一字符集。建库时用utf8mb4连接时确保客户端和服务器字符集一致中文基本就稳了。真遇到乱码从建库语句、连接字符串、表字段字符集三处排查大部分问题出在某一层还在用老旧的latin1或utf8。MySQL入门阶段的核心目标其实不是会写多少条SQL而是建立起数据长什么样、存在哪、怎么安全地操作它这套心智模型。概念通了后面学约束、索引、表关联乃至事务都是在这张骨架上添砖加瓦。下一篇会继续讲单表查询的进阶内容比如排序、分组、聚合函数和WHERE条件的各种用法到时候我们接着往下啃。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑