☰
数据库入门第一周:建库建表与增删改查实战复盘
2026/9/28 14:08:45 网站建设 项目流程

这周刚把数据库第一周的内容完整过了一遍,趁着印象还热乎,赶紧把整个学习过程整理成一篇可以随时翻看的复盘笔记。

“北邮 果园 数据库第一周 1.4”这个标题,对应的是我们课程里一个名为“果园”的教学实践项目——模拟一个果园水果销售管理系统的数据库设计与搭建,1.4则指第一周第四节的内容节点。换句话说,这周的任务就是从零开始,把数据库的“地基”打起来:理解什么是数据库、学会建库建表、掌握最基础的增删改查。虽然看着简单,但这一周的内容恰恰是整个数据库学习曲线里最容易被忽略又最不能跳过的部分。

这篇文章我打算拆开来讲:第一周到底学了什么、建库建表有哪些门道、增删改查应该怎么练、以及新手最容易在哪几个地方翻车。如果你是刚接触数据库的同学,或者想快速找回SQL基础的在职朋友,这篇笔记应该能帮你少走不少弯路。

1. 第一周全景回顾:数据库这门课到底在打什么地基

1.1 为什么学习数据库要从“为什么需要它”开始

第一节课老师没有直接扔SQL语法,而是先问了一个问题:如果你是一个水果摊老板,每天要记录进货、销售、库存,用Excel够不够?

这个问题问得特别好。单机单店,几十条数据,Excel完全够用。但一旦规模上来——多门店、多人同时录入、数据量几十万条、还要保证每个人看到的数据都是最新的、不能出现两个人同时改同一条记录导致数据错乱——Excel那一套就顶不住了。数据库就是为了解决这些问题被设计出来的:它负责高效地存储数据、安全地管理数据、并且支持多人并发访问。

第一周反复强调的一个理念就是:SQL(Structured Query Language,结构化查询语言)是跟数据库对话的唯一语言。你不需要理解数据库底层用什么样的文件结构存数据,也不需要关心B+树索引在磁盘上怎么跳转,你只需要学会用SQL告诉数据库“我要什么”。这个抽象层级让数据库的门槛大大降低,但也带来了一个问题:很多人只学了个皮毛就开始各种踩坑。

1.2 第一周必须吃透的SQL四大分类

很多人学SQL学到后面越学越迷糊,就是因为一开始没有把SQL的整体框架立起来。第一周的课程其实就在帮我们搭这个框架,SQL语言按照功能可以分成四大类:

  • DDL(Data Definition Language,数据定义语言):负责定义数据库对象的结构,包括创建数据库、创建表、修改表结构、删除表。核心动词是CREATE、ALTER、DROP。
  • DML(Data Manipulation Language,数据操纵语言):负责对表里的数据进行操作,包括插入、更新、删除。核心动词是INSERT、UPDATE、DELETE。
  • DQL(Data Query Language,数据查询语言):负责查询数据,这是使用频率最高的一类,核心动词是SELECT。
  • DCL(Data Control Language,数据控制语言):负责权限管理和安全性控制,核心动词是GRANT、REVOKE,第一周只需要知道它的存在即可。

这四个分类不是随便分着玩的,它们对应的其实是数据库使用者的不同角色定位。开发人员最常打交道的是DML和DQL,DBA(数据库管理员)更关注DDL和DCL。第一周就把这个框架打下来,后面学到约束、索引、事务的时候,你就知道它们分别挂在哪个分类下,体系感会强很多。

1.3 “果园”教学项目的设计逻辑

“果园”这个名字听起来很可爱,但背后是有教学设计的。项目设定是一个水果销售管理系统,数据库里需要存储水果信息、供应商信息、门店信息、销售记录等。之所以选这个场景,是因为它非常贴近生活:你不需要额外的业务背景知识,就能理解哪张表该存什么字段。而水果业务天然有“多对多”关系——一个供应商供多种水果,一种水果也可能从多个供应商进货——这为后面的多表关联查询埋下了很好的伏笔。

第一周我们只做了这个项目的第一阶段:建好所有基础表,把数据插进去,做一些最简单的查询。虽然看起来简单,但这个过程把DDL和DML完整走了一遍,算是非常扎实的入门训练。

2. 环境准备与建库建表:把地基打牢的关键实操

2.1 数据库选型与连接工具

北邮的这个课程用的是MySQL,这也是国内教学和中小型项目里使用最广泛的数据库之一,完全开源免费,社区资料极其丰富。第一周第一件事就是把MySQL装起来。

这里我想多说一句:很多同学在安装环节就放弃了。MySQL的安装说简单也简单,说麻烦也麻烦。官方安装包体积不小,安装过程中要选版本、选端口、设置root密码,稍不注意就卡住了。我自己走过的路径是:直接下载MySQL Community Server,安装时保持默认端口3306,字符集选择utf8mb4,root密码设置成自己容易记的。安装完成后,打开命令行输入mysql -u root -p能进入交互界面,就说明服务已经正常跑起来了。

连接工具方面,课程推荐的是Navicat。它是一个图形化的数据库管理工具,可以像操作Excel一样去查看表结构和数据,对新手非常友好。不过我自己后来用的是DBeaver,也是免费的,跨平台,社区版功能足够日常学习使用。这里不纠结哪个更好,能让你愿意打开去操作的就是好工具。

2.2 第一张表的诞生:CREATE TABLE 的完整语法

第一周的核心实操就是建表。以“果园”项目里的水果表为例,我们的需求是:记录每种水果的名称、种类、单价、产地、库存量。对应的建表语句是这样的:

CREATE TABLE fruit ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, category VARCHAR(30), price DECIMAL(10, 2), origin VARCHAR(50), stock INT DEFAULT 0 );

逐行拆解一下:

  • id:主键字段,设置为自增整数。这是每条记录的唯一身份标识,以后你要更新某条数据、删除某条数据,都靠这个id来定位。AUTO_INCREMENT让数据库自动为每一条新插入的记录生成递增的编号,省去了手动管理序号的工作。
  • name:水果名称,VARCHAR(50)表示最多50个字符的可变长度字符串。NOT NULL表示这个字段不能为空——总不能让一条记录没有名字吧。
  • category:水果种类,比如“柑橘类”“浆果类”“核果类”。这里用VARCHAR(30),30个字符的容量完全够用。
  • price:单价。为什么要用DECIMAL(10,2)而不是FLOAT或者DOUBLE?这是第一周最容易忽略的知识点。浮点数在计算机里是近似存储的,0.1+0.2可能等于0.30000000000000004,这在金额计算里是灾难。DECIMAL是定点数,按位数精确存储,2表示保留两位小数,正好对应人民币分。钱相关的数据,永远用DECIMAL。
  • origin:产地。
  • stock:库存量。用INT就够了,因为库存是个整数。DEFAULT 0表示如果不填这个字段,默认就是0,防止出现NULL值。

建表语句执行成功后,可以用DESC fruit;查看表结构,确认字段类型和约束都正确。这一步虽然简单,但我建议每个人都亲自敲一遍,注意观察数据类型、约束、默认值这些设计细节,因为它们是后续学习“数据库设计”的第一手经验。

2.3 为什么数据类型的选择这么重要

第一周建表的过程中,老师反复强调“选对类型”比“写出SQL”更考验数据库设计能力。这一点我深有感触。类型选得不对,后面会有各种隐形问题:

  • 用VARCHAR存数字:排序会变成字典序,10排在2前面,完全没法用。
  • 用FLOAT存金额:结果出现0.30000000000000004这种精度问题,对账对不上。
  • 用TEXT存只有几个字的字段:浪费存储空间,而且不能加默认值(TEXT类型不允许有DEFAULT)。
  • 用DATETIME存日期,但代码传进去的是字符串:时区、格式各种出问题。

第一周只需要掌握最基础的几个类型就够了:整数用INT,小数金额用DECIMAL,短文本用VARCHAR,日期时间用DATETIME,大段文本用TEXT。后面学到更复杂的业务场景时,再扩展其他类型。

2.4 主键、外键与约束:第一周不必全懂但必须见一面

严格来说,外键是后面章节的内容,但第一周建表的时候,我们会发现一个问题:销售记录表里需要记录“卖了哪种水果”,总不能把水果的名称、产地、规格全部重复写一遍吧?正确做法是把水果的id存到销售表里,通过id关联到水果表。那个id在销售表里就叫外键。

第一周不需要写外键约束,但需要在脑子上形成关联的意识。至于外键约束怎么声明、ON DELETE CASCADE是什么意思,那是后面的事。第一周先把一个表建明白,把字段类型和主键理解透,就已经超额完成任务了。

3. 增删改查:第一周的重头戏

3.1 插入数据的几种姿势与注意事项

建好表之后第一件事就是往里塞数据。插入数据的核心语法是INSERT INTO。以“果园”项目为例,往水果表里插入一条记录的语句长这样:

INSERT INTO fruit (name, category, price, origin, stock) VALUES ('红富士苹果', '仁果类', 6.50, '山东烟台', 200);

有几个细节第一周就值得记下来:

  • 如果不需要为所有字段赋值,字段列表是可以省略的,但省略时VALUES里的值必须按照建表时的字段顺序全部列出来。我强烈建议永远不要省略字段列表,虽然多敲几个字,但可读性和可维护性都强得多,而且后面表结构一旦变化,省略字段写的INSERT就会报错。
  • id字段不用出现在INSERT语句里,因为AUTO_INCREMENT会自动处理。如果你手动指定了id值,要注意不能跟已有记录冲突。
  • 批量插入是高效操作。一次插入多条记录,只需要把VALUES部分用逗号分隔:
INSERT INTO fruit (name, category, price, origin, stock) VALUES ('红富士苹果', '仁果类', 6.50, '山东烟台', 200), ('库尔勒香梨', '浆果类', 8.00, '新疆库尔勒', 150), ('赣南脐橙', '柑橘类', 5.80, '江西赣州', 300);

这样比逐条执行三条INSERT快得多,因为减少了数据库的连接次数和SQL解析开销。

3.2 查询:SELECT的完整执行顺序

SELECT是SQL里最核心、使用最频繁的语句。第一周先把最基础的SELECT用法练熟:查询整张表用SELECT * FROM fruit;,查询指定字段用SELECT name, price FROM fruit;,加条件用SELECT * FROM fruit WHERE category = '柑橘类';,排序用SELECT * FROM fruit ORDER BY price DESC;。

但第一周真正值得花时间理解的是:SELECT语句的各个子句在执行时是有固定顺序的。这个知识点很多工作了三五年的人都说不清楚。SQL语句的书写顺序是:

SELECT FROM WHERE GROUP BY HAVING ORDER BY LIMIT

而执行顺序是:

  1. FROM:确定从哪张表取数据
  2. WHERE:对表里的记录逐行过滤
  3. GROUP BY:按某列分组
  4. HAVING:对分组后的结果过滤
  5. SELECT:确定要返回哪些列
  6. ORDER BY:对结果排序
  7. LIMIT:截断返回条数

很多人写SQL的时候栽跟头,就是因为不理解这个执行顺序。比如在WHERE里用SELECT里才定义的别名做过滤,结果报错,就是因为WHERE执行的时候别名还不存在。第一周就建立这个执行顺序的概念,后面写复杂查询会省很多力气。

3.3 更新与删除:WHERE是生命线

UPDATE和DELETE这两条语句的语法非常简单:

UPDATE fruit SET price = 7.00 WHERE name = '红富士苹果'; DELETE FROM fruit WHERE id = 1;

但简单背后藏着数据库新手踩过最惨烈的坑:忘记写WHERE条件。

UPDATE fruit SET price = 7.00;这条语句会把整张表所有水果的单价全部改成7.00,而且MySQL默认开启了事务但没开安全更新模式的话,这条语句会直接执行成功。同样,DELETE FROM fruit;会把全表数据清空。

这个问题的本质在于:UPDATE和DELETE操作的默认粒度是“行”,如果你不写WHERE,数据库会认为你想操作所有行。所以我在第一周学到的第一个铁律就是:执行UPDATE和DELETE之前,先用SELECT加同样的WHERE条件查一遍,确认要操作的数据确实是目标数据,然后再把SELECT改成UPDATE或DELETE。这个习惯养成之后,可以帮你躲过职业生涯里绝大多数生产事故。

3.4 动手实践:从空表到一份完整的果园数据

第一周的实际作业是把果园项目的一组实验数据完整录入数据库,并且完成一组指定查询。我自己当时练习的小项目是模拟了一份水果库存表,数据大概长这样:

idnamecategorypriceoriginstock
1红富士苹果仁果类6.50山东烟台200
2库尔勒香梨浆果类8.00新疆库尔勒150
3赣南脐橙柑橘类5.80江西赣州300
4海南香蕉热带水果3.50海南三亚500
5巨峰葡萄浆果类9.90辽宁大连80

然后用它练手三组查询:

  • “查出所有浆果类水果,按价格从高到低排序”:SELECT name, price FROM fruit WHERE category = '浆果类' ORDER BY price DESC;
  • “查出库存低于100的水果名称”:SELECT name FROM fruit WHERE stock < 100;
  • “统计当前一共有多少种水果”:SELECT COUNT(*) FROM fruit;

这些查询看着基础,但COUNT、WHERE、ORDER BY、比较运算符这些概念全都覆盖到了。第一周不贪多,把这些跑通,手感自然就出来了。

4. 第一周最容易踩的五个坑与排查思路

4.1 安装后连接不上数据库

这是第一周出现频率最高的问题,症状一般是命令行输入mysql -u root -p提示ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost:3306'。遇到这个报错,请按顺序排查:

  • MySQL服务是否启动了?Windows下按Win+R输入services.msc打开服务管理器,找到MySQL服务看看状态,不是“正在运行”就右键启动。
  • 端口是不是被改了?如果在安装时改了端口,连接命令要加-P参数指定新端口。
  • 3306端口是不是被占用?可以用netstat -ano | findstr 3306查看。

我记得当时班里几十号人同时安装,有网络不稳定的、有杀毒软件拦截的、有安装到一半报错的,各种情况都有。最稳妥的做法是安装时跟着官方安装向导一步一步走,不要跳步,服务起不来后面的全部操作都无从谈起。

4.2 中文数据全都变成问号

往表里插入中文数据,查询出来看到的全是“???”,这是经典的字符集问题。原因在于:MySQL服务端、客户端、数据库、表的字符集不一致导致的编码错乱。

解决思路统一步调:把各个环节的字符集都设置成utf8mb4。MySQL从8.0版本开始默认字符集就是utf8mb4,之前的老版本需要手动设置。修改方法有两个:一个是在连接时加上--default-character-set=utf8mb4参数;另一个是在my.cnf或my.ini配置文件里修改默认字符集设置。

这里要多啰嗦一句:utf8和utf8mb4不是同一个东西。MySQL里的utf8最多只支持3字节的字符,而emoji和一些生僻汉字是4字节的,用utf8存会直接报错。所以在今天的项目里,一律用utf8mb4。

4.3 忘了WHERE条件导致全表数据被改

这个问题前面已经提到过,但值得单独作为一节来讲。因为它造成的后果可能是灾难性的——数据被批量修改后没有备份就没有后悔药可吃。

第一周的实际案例是:班级群里有个同学想把“海南香蕉”的价格改一下,写的语句是UPDATE fruit SET price = 4.00;,结果整张表所有水果的价格全部变成了4.00。幸运的是数据量小,手动改回来就行。但在真实的生产环境里,这就是一次严重的事故。

排查的思路是:如果发现数据莫名被批量修改或删除,第一时间用事务回滚能不能救回来——前提是操作发生在事务里,且尚未提交。但MySQL命令行默认是自动提交的,操作完想反悔往往已经来不及了。所以还是那句老话:先SELECT,再UPDATE/DELETE。

4.4 主键冲突导致插入失败

批量插入数据时,有时候会报Duplicate entry '1' for key 'fruit.PRIMARY'。这个错误的意思是主键值重复了。常见场景是:手动指定了id值插入,然后再用AUTO_INCREMENT插入时,自增计数器可能跟手动插入的id“打架”。

排查方法很简单:执行SELECT MAX(id) FROM fruit;看看当前最大id是多少,然后要么插入时避开这个范围,要么直接用ALTER TABLE fruit AUTO_INCREMENT = 100;重置自增起点。第一周出这个问题不算什么,理解主键唯一性的概念反而比问题本身更有价值。

4.5 图形工具操作表结构和数据时连接断开

用Navicat或DBeaver连接MySQL操作一段时间后,偶尔会遇到“连接已断开”之类的提示。大部分情况是因为MySQL的wait_timeout默认值是8小时,超过8小时没有活动连接就会被服务端关闭。第一次遇到不要慌,重新连接一次就行。这个问题在长期开发中会多次出现,知道原因就不会被吓到。

5. 第一周学习的三个小技巧与心得

现在回过头来看,第一周的内容虽然基础,但有些学习方法和细节非常值得分享出来。我觉得对后来者最有价值的是这三条。

第一条是跟着敲,不要只看。数据库和SQL是纯操作型技能,看视频和看文档都觉得懂了,手一放到键盘上就各种报错。我亲眼见过很多同学把课堂命令抄在笔记上抄得整整齐齐,但到了操作环节连登录都登不进数据库。SQL的报错信息本身就是最好的老师,比如Syntax error near 'xxx'就是在告诉你语法写错了,Column 'xxx' not found是在告诉你字段名拼错了。这些信息必须通过亲手操作才能真正消化。

第二条是每建一张表都先停下来想想设计。建表前先问自己三个问题:哪些字段必须有?每个字段该用什么类型?哪个字段是主键?这三个问题在第一周看似简单,但它们就是后面数据库设计的全部起点。我第一周建了六七张表之后,再去做“用户表”“订单表”的设计题,明显比刚开始顺手得多。

第三条是养成给SQL语句规范格式化的习惯。关键字大写、字段名小写、每行一个字段、缩进对齐。很多初学者不理解为什么要这么较真,反正SQL不区分大小写。但到了后面写几十行上百行的复杂查询时,规范的格式能让你在五分钟内找到问题所在,而凌乱的一坨代码可能要盯半小时。第一周就把这个习惯定下来,后面一点不亏。

6. 后续拓展方向与学习展望

第一周虽然只学了SQL的入门操作,但我已经能看到它后面牵引出的知识地图:约束条件在深入后会引出外键、唯一约束、检查约束;SELECT会引出连接查询、子查询、聚合函数、窗口函数;单表操作会引出事务、锁、索引;数据模型会引出ER图、三范式、数据库设计方法论。这些内容是后续几周要陆续展开的,第一周做的就是给这些知识打桩。

另外,第一周反复出现的几个概念,比如主键、字段类型、查询过滤条件,其实在互联网公司的日常开发里也是高频使用的。面试官问数据库基础的时候,大概率会从这些点往深处追问。所以第一周学得扎实一些,后面冲刺大厂实习和秋招面试的时候,你会感激现在没有偷懒的自己。

“果园”项目接下来还会继续扩展:补充更多业务表、设计表之间的关联关系、写更复杂的查询语句。这一周把地基打扎实了,后面的学习和实操才会顺遂很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询