ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

数据库入门第一周:建库建表与增删改查实战复盘

数据库入门第一周:建库建表与增删改查实战复盘 这周刚把数据库第一周的内容完整过了一遍趁着印象还热乎赶紧把整个学习过程整理成一篇可以随时翻看的复盘笔记。“北邮 果园 数据库第一周 1.4”这个标题对应的是我们课程里一个名为“果园”的教学实践项目——模拟一个果园水果销售管理系统的数据库设计与搭建1.4则指第一周第四节的内容节点。换句话说这周的任务就是从零开始把数据库的“地基”打起来理解什么是数据库、学会建库建表、掌握最基础的增删改查。虽然看着简单但这一周的内容恰恰是整个数据库学习曲线里最容易被忽略又最不能跳过的部分。这篇文章我打算拆开来讲第一周到底学了什么、建库建表有哪些门道、增删改查应该怎么练、以及新手最容易在哪几个地方翻车。如果你是刚接触数据库的同学或者想快速找回SQL基础的在职朋友这篇笔记应该能帮你少走不少弯路。1. 第一周全景回顾数据库这门课到底在打什么地基1.1 为什么学习数据库要从“为什么需要它”开始第一节课老师没有直接扔SQL语法而是先问了一个问题如果你是一个水果摊老板每天要记录进货、销售、库存用Excel够不够这个问题问得特别好。单机单店几十条数据Excel完全够用。但一旦规模上来——多门店、多人同时录入、数据量几十万条、还要保证每个人看到的数据都是最新的、不能出现两个人同时改同一条记录导致数据错乱——Excel那一套就顶不住了。数据库就是为了解决这些问题被设计出来的它负责高效地存储数据、安全地管理数据、并且支持多人并发访问。第一周反复强调的一个理念就是SQLStructured Query Language结构化查询语言是跟数据库对话的唯一语言。你不需要理解数据库底层用什么样的文件结构存数据也不需要关心B树索引在磁盘上怎么跳转你只需要学会用SQL告诉数据库“我要什么”。这个抽象层级让数据库的门槛大大降低但也带来了一个问题很多人只学了个皮毛就开始各种踩坑。1.2 第一周必须吃透的SQL四大分类很多人学SQL学到后面越学越迷糊就是因为一开始没有把SQL的整体框架立起来。第一周的课程其实就在帮我们搭这个框架SQL语言按照功能可以分成四大类DDLData Definition Language数据定义语言负责定义数据库对象的结构包括创建数据库、创建表、修改表结构、删除表。核心动词是CREATE、ALTER、DROP。DMLData Manipulation Language数据操纵语言负责对表里的数据进行操作包括插入、更新、删除。核心动词是INSERT、UPDATE、DELETE。DQLData Query Language数据查询语言负责查询数据这是使用频率最高的一类核心动词是SELECT。DCLData Control Language数据控制语言负责权限管理和安全性控制核心动词是GRANT、REVOKE第一周只需要知道它的存在即可。这四个分类不是随便分着玩的它们对应的其实是数据库使用者的不同角色定位。开发人员最常打交道的是DML和DQLDBA数据库管理员更关注DDL和DCL。第一周就把这个框架打下来后面学到约束、索引、事务的时候你就知道它们分别挂在哪个分类下体系感会强很多。1.3 “果园”教学项目的设计逻辑“果园”这个名字听起来很可爱但背后是有教学设计的。项目设定是一个水果销售管理系统数据库里需要存储水果信息、供应商信息、门店信息、销售记录等。之所以选这个场景是因为它非常贴近生活你不需要额外的业务背景知识就能理解哪张表该存什么字段。而水果业务天然有“多对多”关系——一个供应商供多种水果一种水果也可能从多个供应商进货——这为后面的多表关联查询埋下了很好的伏笔。第一周我们只做了这个项目的第一阶段建好所有基础表把数据插进去做一些最简单的查询。虽然看起来简单但这个过程把DDL和DML完整走了一遍算是非常扎实的入门训练。2. 环境准备与建库建表把地基打牢的关键实操2.1 数据库选型与连接工具北邮的这个课程用的是MySQL这也是国内教学和中小型项目里使用最广泛的数据库之一完全开源免费社区资料极其丰富。第一周第一件事就是把MySQL装起来。这里我想多说一句很多同学在安装环节就放弃了。MySQL的安装说简单也简单说麻烦也麻烦。官方安装包体积不小安装过程中要选版本、选端口、设置root密码稍不注意就卡住了。我自己走过的路径是直接下载MySQL Community Server安装时保持默认端口3306字符集选择utf8mb4root密码设置成自己容易记的。安装完成后打开命令行输入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.10.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而执行顺序是FROM确定从哪张表取数据WHERE对表里的记录逐行过滤GROUP BY按某列分组HAVING对分组后的结果过滤SELECT确定要返回哪些列ORDER BY对结果排序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 动手实践从空表到一份完整的果园数据第一周的实际作业是把果园项目的一组实验数据完整录入数据库并且完成一组指定查询。我自己当时练习的小项目是模拟了一份水果库存表数据大概长这样idnamecategorypriceoriginstock1红富士苹果仁果类6.50山东烟台2002库尔勒香梨浆果类8.00新疆库尔勒1503赣南脐橙柑橘类5.80江西赣州3004海南香蕉热带水果3.50海南三亚5005巨峰葡萄浆果类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): Cant connect to MySQL server on localhost:3306。遇到这个报错请按顺序排查MySQL服务是否启动了Windows下按WinR输入services.msc打开服务管理器找到MySQL服务看看状态不是“正在运行”就右键启动。端口是不是被改了如果在安装时改了端口连接命令要加-P参数指定新端口。3306端口是不是被占用可以用netstat -ano | findstr 3306查看。我记得当时班里几十号人同时安装有网络不稳定的、有杀毒软件拦截的、有安装到一半报错的各种情况都有。最稳妥的做法是安装时跟着官方安装向导一步一步走不要跳步服务起不来后面的全部操作都无从谈起。4.2 中文数据全都变成问号往表里插入中文数据查询出来看到的全是“???”这是经典的字符集问题。原因在于MySQL服务端、客户端、数据库、表的字符集不一致导致的编码错乱。解决思路统一步调把各个环节的字符集都设置成utf8mb4。MySQL从8.0版本开始默认字符集就是utf8mb4之前的老版本需要手动设置。修改方法有两个一个是在连接时加上--default-character-setutf8mb4参数另一个是在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图、三范式、数据库设计方法论。这些内容是后续几周要陆续展开的第一周做的就是给这些知识打桩。另外第一周反复出现的几个概念比如主键、字段类型、查询过滤条件其实在互联网公司的日常开发里也是高频使用的。面试官问数据库基础的时候大概率会从这些点往深处追问。所以第一周学得扎实一些后面冲刺大厂实习和秋招面试的时候你会感激现在没有偷懒的自己。“果园”项目接下来还会继续扩展补充更多业务表、设计表之间的关联关系、写更复杂的查询语句。这一周把地基打扎实了后面的学习和实操才会顺遂很多。
返回列表