尧图精选

数据库入门实战:从Excel到SQL,增删改查与避坑指南

🕒 发布时间:2026/9/16 3:22:59 📁 来源:尧图网络
去年春天帮一个学弟改数据库课程设计他的选题是“学生选课管理系统”。功能其实不难难的是他把所有数据都放在 Excel 里用 VLOOKUP 和筛选硬做完了整个“系统”。答辩时老师问了一句“如果学生选课并发量到一百人你怎么保证成绩不串”他愣住了回来问我数据库和 Excel 到底差在哪这个问题问得特别好。数据库这门课学校教材讲范式、讲 E-R 图、讲 SQL 语法唯独很少讲一件事数据库究竟是来解决什么问题的。结果就是新手学完一整学期会背概念、会写简单查询一旦遇到真实场景——数据多了、并发来了、出错了要排查——还是懵。这篇文章就是写给零基础入门和学完基础想巩固的人。我会用一套实战路径把你从“听说过数据库”带到“能独立完成一份课程设计、能应对常见数据库面试题”的水平。不讲虚的上来直接拆解数据库底层到底在干什么、环境怎么搭、增删改查怎么练、哪些坑是新手必踩、每天该刷什么题。1. 新人入门的第一道坎数据库到底在解决什么问题1.1 先放下“高深”的恐惧数据库就是存数据的地方我第一次接触数据库时觉得这玩意儿特别高大上什么 Oracle、MySQL、SQL Server一听就感觉是机房深处的大型机在运转。后来工作久了回头看数据库其实做的最核心的事情特别朴素把数据存下来并且让你能快速找回来。你可以把数据库想象成一个超级仓库它和你平时用的 Excel 很像都有行和列都是一张一张表。区别在于Excel 是给人看的数据库是给程序用的Excel 适合处理几万行数据数据库处理几千万行也不会卡死Excel 只能一个人改数据库允许几百人同时读写还能保证数据不乱我刚工作时见过一个小公司用 Excel 存订单到月底对账时文件有三四十兆打开一次要半分钟而且两个人同时编辑就会互相覆盖。后来我帮他们导到 MySQL 里同样的数据查询时间从“等水烧开”变成“眨个眼”。这就是数据库最直接的威力。1.2 关系型和非关系型新手选哪个学市面上的数据库分两大阵营关系型和非关系型。关系型数据库把数据组织成“表”表之间靠“关系”关联比如一个订单表通过用户 ID 关联用户表。代表有 MySQL、Oracle、SQL Server、PostgreSQL还有达梦、人大金仓这些国产数据库。这类数据库的通用语言叫 SQL也就是结构化查询语言。非关系型数据库则各不相同有文档型的 MongoDB有键值型的 Redis有搜索引擎型的 Elasticsearch。它们的共同点是“不用严格定义表结构”更适合存 JSON 文档、缓存这类灵活数据。对比项关系型数据库非关系型数据库数据组织表格 行 列文档 / 键值 / 图表结构必须先定义修改成本高灵活随时加字段适合场景订单、账务、ERP、选课系统缓存、日志、爬虫、实时推荐事务支持强ACID较弱最终一致性新手推荐度★★★★★★★★我的建议很简单新手一门心思先把关系型数据库学透。理由有三个市面上 80% 以上的业务系统以关系型为主SQL 是通用语言学会一种库其他库基本能上手你面试时最常被问到的也是关系型知识。把 MySQL 或 SQL Server 学扎实MongoDB、Redis 后面两天就能上手。1.3 几个必须一次搞懂的核心概念新手最容易被一堆名词绕晕。其实数据库的概念用一张学生表就能全讲清楚学生表表名student --------------------------- | id | name | age | class_id | --------------------------- | 1 | 张三 | 20 | 101 | | 2 | 李四 | 21 | 102 | ---------------------------数据库装着所有表的大仓库相当于一个文件夹表一种数据的集合比如学生表专门存学生信息行记录表格里的每一行就是一个完整的数据条目张三那一整行就是一条记录列字段一条数据里的某个属性比如姓名、年龄主键能唯一标识一条记录的字段比如学号 id不可能有两个人共用同一个 ID外键指向别的表主键的字段比如 class_id 指向班级表的 id用来建立表间关系理解主键是特别关键的一步。很多新手设计表时不设主键或者用姓名这种可能重复的字段当主键以后查数据、关联表时就会遇到各种诡异的问题。记住一句话每张表都要有一个主键推荐用无意义的自增整数 ID。这是无数项目验证过的最省心方案。2. 从零跑通第一个数据库环境搭建和基础认知2.1 选哪个数据库作为起点新手选第一个数据库经常被网上各种“MySQL 和 PostgreSQL 谁更强”的争论带偏。我的建议是不在最强而在最容易跑通。要是安装就卡住你半天再强也学不下去。对完全没有基础的人我推荐两条路线SQLite极致轻量文件型数据库。不需要安装服务端就是一个文件放在那用 Python 或工具一连就能操作。想快速体验 SQL 语法选它准没错。MySQL业界应用最广的开源数据库资料最多、遇到的坑基本都能搜到解决方案。安装包下载、启动服务、命令行一敲半小时能出结果。推荐正式开始学。至于 Oracle多半是你进了用它的公司才需要系统学达梦、人大金仓是国产数据库现在很多政府项目要求信创如果你找工作可能要接触但语法和 Oracle 高度相似先学 MySQL 再去迁移也不是难事。MySQL 安装时有几个细节要注意Windows 下建议下载安装版而不是绿色解压版傻瓜式安装不易出错安装过程中会让你设置 root 用户密码别设太复杂记不住后面改起来麻烦选字符集时直接选 utf8mb4这是后面避免中文乱码的关键一步把 MySQL 加入系统 PATH方便在命令行里直接敲 mysql 命令安装完成后打开命令行输入mysql -u root -p输入密码看到mysql提示符说明你已经连上了数据库服务器。2.2 图形化工具Navicat、DBeaver、Workbench 怎么选新手不建议长期在纯命令行里折腾。敲命令能看到结果但看不到数据全貌。图形化工具的核心体验是左边树形列表点开所有库和表鼠标点哪里就能看数据写 SQL 还有提示和可视化执行计划。常见的三款工具工具优点缺点适合人群MySQL WorkbenchMySQL 官方出品免费界面偏丑偶尔卡顿新手入门DBeaver免费开源支持几乎所有数据库启动略慢插件机制要适应工作中强烈推荐Navicat界面最友好功能最全收费破解版有安全风险不差钱选它我个人的建议是学习阶段用 DBeaver。因为它是免费的还能连接 MySQL、Oracle、达梦、高斯等各种库以后不管换到哪个环境都不用重新学工具。下载地址搜 DBeaver 官网即可下载社区版就够用。2.3 连接数据库时那几个参数到底什么意思打开 DBeaver 点新建连接会要求填一堆东西主机、端口、用户名、密码、数据库名。新手往往随手乱填连不上就开始怀疑人生。其实这些参数一点都不神秘。以 MySQL 为例主机Hostlocalhost 或 127.0.0.1表示数据库就在你自己这台电脑上 端口Port3306MySQL 默认监听这个门牌号 用户名Usernameroot管理员账号 密码Password安装时设置的那个密码 数据库名Database选填不填也能连接进来后自己选这里的端口号很容易出问题。一台电脑上装了多个数据库端口默认值不一样数据库默认端口MySQL3306SQL Server1433Oracle1521达梦5236PostgreSQL5432如果你安装 MySQL 时手动改过端口连接时填 3306 就会报“Connection refused”。这种问题十有八九是端口不对或者服务没启动。Windows 下按Win R输入services.msc找到 MySQL 服务看它有没有启动这一步能解决你 90% 的连接难题。3. 增删改查数据库操作的四个基本动作3.1 建库建表先把“房子”盖好数据库的核心操作就四个字增删改查对应 SQL 里的 INSERT、DELETE、UPDATE、SELECT。这四个动作的前提是你得先有“房子”——也就是数据库和表。建库命令CREATE DATABASE student_db DEFAULT CHARACTER SET utf8mb4;注意结尾的分号在 SQL 里它表示一条语句结束。新手最容易漏分号一漏就报语法错误。建表命令拿学生表举个例子CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 主键, name VARCHAR(50) NOT NULL COMMENT 姓名, age INT COMMENT 年龄, class_id INT COMMENT 班级ID ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT学生表;这条语句里有几处很容易犯错的地方我挨个说INT是整数类型VARCHAR(50)是变长字符串50 表示最多 50 个字符。字段类型选错是新手高频问题比如用VARCHAR存出生日期以后做日期比较就有麻烦。日期用DATE小数用DECIMAL(10,2)别用FLOAT。PRIMARY KEY指定主键AUTO_INCREMENT让编号自动加一不需要你手动填NOT NULL代表这个字段不能为空最后一定要带ENGINEInnoDB和CHARSETutf8mb4前者是保证事务支持后者是保证中文不乱码建好表之后可以用DESC student;查看表结构用SHOW CREATE TABLE student;查看建表语句。这两个命令是你检查自己写没写对的“照妖镜”。3.2 把数据放进去INSERT 的三种写法插入数据的标准写法INSERT INTO student (name, age, class_id) VALUES (张三, 20, 101);有必要养成一个习惯列名那一串括号不要省。如果写成INSERT INTO student VALUES (1, 张三, 20, 101)万一表结构以后加了字段这条语句直接就报错了。写了列名以后加字段它也跑得好好的。一次插多条数据用逗号分隔INSERT INTO student (name, age, class_id) VALUES (张三, 20, 101), (李四, 21, 102), (王五, 19, 101);最开始练习时你可能会遇到几个报错。字符串忘了加引号报错。字段名写错了报错。中文插入后变成????说明连接字符集或者表字符集不对返回第二章检查utf8mb4的设置。3.3 把数据捞出来SELECT 的起点查询是数据库里最常用、也最能拉开水平差距的动作。先掌握最基础的-- 查全部字段 SELECT * FROM student; -- 只查指定字段 SELECT name, age FROM student; -- 加条件 SELECT name, age FROM student WHERE age 20; -- 排序 SELECT name, age FROM student WHERE age 20 ORDER BY age DESC; -- 限制返回条数 SELECT name FROM student LIMIT 10;这五行代码覆盖了日常 60% 的查询场景。有个小技巧我很早就想告诉新手SELECT *在练习时随便用但到了项目里能用明确字段就不要用星号。原因不是效率问题虽然也有影响而是别人读你代码时根本不知道你拿全表数据要干什么不符合“最小化数据”的工程习惯。3.4 UPDATE 和 DELETE危险动作要当心更新和删除写法上跟查询很像但风险完全不一样。看这两条命令UPDATE student SET age 22 WHERE name 张三; DELETE FROM student WHERE id 1;注意WHERE条件。如果忘了写 WHERE就会变成UPDATE student SET age 22; -- 所有人都变成22岁 DELETE FROM student; -- 整张表清空这个错误我见过不止一次每次都是血泪教训。记一个铁律执行 UPDATE 和 DELETE 前先用 SELECT 查一遍 WHERE 条件选出来的数据确认是你想改/想删的那几条。-- 改之前先确认 SELECT * FROM student WHERE name 张三; -- 看到确实是他再执行 UPDATE student SET age 22 WHERE name 张三;现阶段养成这个习惯以后进公司少给同事惹麻烦。3.5 什么是“删库跑路”的防御机制事务很多人听过“删库跑路”的段子。实际上数据库设计者早就考虑过误操作的问题解决方案就是事务Transaction。事务的核心思想是一批操作要么全部成功要么全部回滚不存在做一半的状态。在 MySQL 中使用事务非常简单START TRANSACTION; -- 开启事务 DELETE FROM student WHERE id 1; -- 如果真的删错了 ROLLBACK; -- 回滚刚才的删除作废 -- 如果确认没问题 COMMIT; -- 提交永久生效新手改数据时建议养成“先开事务再操作”的习惯尤其课程设计里往表里批量改成绩的时候这个习惯能救你很多次。InnoDB 引擎才支持事务MyISAM 不支持这就是我前面强调用 InnoDB 的原因。4. 从单表到多表查询能力的关键跃迁4.1 WHERE 条件筛选陷入僵局后的进阶玩法基础查询会用之后你会遇到“条件复杂起来了不知道怎么写”的情况。记住几个常用的条件语法就行了-- 范围查询 SELECT * FROM student WHERE age BETWEEN 18 AND 22; -- 枚举匹配 SELECT * FROM student WHERE class_id IN (101, 102, 103); -- 模糊查询% 代表任意长度字符 SELECT * FROM student WHERE name LIKE 张%; -- 多条件组合 SELECT * FROM student WHERE age 20 AND class_id 101; SELECT * FROM student WHERE age 20 OR class_id 102;模糊查询LIKE是新手接触“搜索功能”的入口。LIKE 张%匹配所有姓张的人%能出现在任意位置。但是注意%放在开头比如LIKE %张会导致查询没法用索引数据量一大性能会明显下降。面试的时候也常拿这个点来问。4.2 JOIN 联结查询把多张表“缝”在一起单表查询练熟之后真正让你从“会数据库”变成“会设计系统”的分水岭是 JOIN。拿课程设计最常见的“学生选课系统”举例。你可能有这么两张表学生表 studentid, name 成绩表 scoreid, student_id, course_name, score学生表和成绩表通过student_id关联。现在要查“每个学生选了哪些课、考了多少分”就必须把两张表拼在一起查SELECT student.name, score.course_name, score.score FROM student INNER JOIN score ON student.id score.student_id;INNER JOIN 的结果是两张表都匹配得上的记录。如果某个学生没有成绩记录他就不会出现在结果里。还有一种更常用的 LEFT JOIN会保留左边表的全部记录右边表匹配不上的地方显示 NULLSELECT student.name, score.score FROM student LEFT JOIN score ON student.id score.student_id;这句话查出来是“所有学生有没有成绩都显示”。实际工作中 LEFT JOIN 出现的频率比 INNER JOIN 高得多因为“以哪张表为主”的业务需求非常常见比如查所有商品及其销量没销量的也要显示出来。面试题最爱问“INNER JOIN 和 LEFT JOIN 的区别”核心就是INNER 只留交集LEFT 保留左边全部。4.3 聚合函数与分组统计数据库相比 Excel 的另一个强大之处在于直接在库里做统计。五个聚合函数是必会的SELECT COUNT(*) FROM student; -- 总共有多少学生 SELECT AVG(score) FROM score WHERE course_name 数据库; -- 某门课平均分 SELECT MAX(score), MIN(score) FROM score; -- 最高分和最低分 SELECT SUM(score) FROM score WHERE student_id 1; -- 某个学生的总分GROUP BY 则用于分组统计比如“每个班有多少人”SELECT class_id, COUNT(*) AS cnt FROM student GROUP BY class_id;加一个 HAVING 还能做分组后的条件过滤这是新手很容易和 WHERE 搞混的地方SELECT class_id, COUNT(*) AS cnt FROM student GROUP BY class_id HAVING COUNT(*) 10;区别在于WHERE 是在分组前筛选原始数据HAVING 是在分组后筛选统计结果。记住这个面试时能答得漂亮。5. 新手必踩的坑和应对办法死锁、乱码、误操作5.1 数据库死锁是怎么回事数据库死锁这个词听着吓人但原理其实不复杂。想象两个人在一条很窄的走廊里迎面相遇你往左他往右你又往右他又往左两个人永远错不开身。数据库死锁就是这个场景。具体到数据库最常见的素材是“银行转账”事务 A给 1 号账户转钱给 2 号账户先锁了 1 号账户还想锁 2 号事务 B给 2 号账户转钱给 1 号账户先锁了 2 号账户还想锁 1 号A 等 B 释放 2 号B 等 A 释放 1 号谁也不让谁就死锁了。MySQL 检测到死锁后会自动回滚其中一个事务并报一个Deadlock found的错误。解决办法有两个层面程序层面多个事务按固定顺序访问资源比如都先锁编号小的账户再锁编号大的数据库层面不要在一个事务里做太多事情事务时间越短死锁概率越低新手写课程设计时基本碰不到死锁但面试官就爱问这就是一个“用过的人才答得出来”的区分点。5.2 中文乱码的根源与字符集新手用数据库最崩溃的时刻之一就是插入中文后查出来是???。这个问题十有八九是字符集不统一。字符集相当于数据库的“语言”。你建表时指定utf8mb4连接数据库时却用默认的 latin1两边语言不通中文自然变成问号。检查顺序如下-- 查看数据库字符集 SHOW VARIABLES LIKE character_set_database; -- 查看表字符集 SHOW TABLE STATUS LIKE student;连接字符串里也要显式指定字符集。用命令行连接时可以加参数mysql -u root -p --default-character-setutf8mb4用 DBeaver 连接时在连接设置里找到“编码/字符集”选项改成 UTF-8。MySQL 有个特别容易迷惑新手的地方utf8和utf8mb4不一样。MySQL 的utf8其实只支持三字节的 Unicode 字符像 emoji 表情这类四字节字符就存不进去。所以无论建库建表一律用utf8mb4这是 2025 年还在被反复刷屏的“mysql 修改结构”技术贴里的高频话题。5.3 那些“要命”的误操作与备份习惯数据库从业者最常说的玩笑是“不是在备份就是在去备份的路上”。新人一定要明白一个事实数据库本身不负责救你备份才负责救你。我最建议大家从学习第一天就养成一个习惯做任何批量修改前先导出当前表的备份。MySQL 命令行里一行就能导出mysqldump -u root -p student_db student student_backup.sql恢复也很简单mysql -u root -p student_db student_backup.sql有些同学会说“我就做个课程设计数据丢了重新插呗”。话是没错但如果你以后的工作系统里存着几十万条订单这个意识从现在就建立起来才不会在工作后付出巨大代价。5.4 身份证号码变成科学计数法的经典问题网上流传很广的一个坑Oracle 数据库导出的身份证号用 Excel 打开后变成了1.23457E17显示不出完整身份证号。这个问题的根源不在数据库而在 Excel身份证号是 18 位数字超出 Excel 15 位有效数字的精度限制Excel 自动把它转成科学计数法了。解决方案有几种Excel 层面导入时把该列格式设为“文本”或者先在一个空单元格输入英文单引号再粘贴数据库层面导出时把身份证号转成字符串Oracle 里用TO_CHAR(id_card)MySQL 里用CAST(id_card AS CHAR)更稳妥的办法设计表结构时就把身份证号设计成 VARCHAR 类型而不是数字类型。这不仅是展示问题还是精度问题——18 位数字用INT根本存不下用BIGINT也会在导入导出中吃精度亏这个例子特别适合说明一个新手常犯的错误把“看起来是数字”的数据存成数字类型。身份证号、电话号码、学号、订单号这些字段只是“由数字组成”不是真正的数值应该一律存成字符串。拿电话号码来说你永远不会对“电话号码”求平均值或求和它就没有理由用数字类型。5.5 表结构修改时的“奇葩”报错为什么删不掉数据库还有一类新手常遇到的坑就是“SQL Server 2008 不能删除数据库”“multisim 访问数据库发生错误”这类问题。数据库删不掉通常是因为有连接占着它不放。SQL Server 里要先把它踢下线再删ALTER DATABASE [库名] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE [库名];”Multisim 访问数据库发生错误“则是新版软件在中文用户名或非默认安装目录下找不到内置数据库文件解决方向是检查安装目录里的数据库路径是否正确或者把软件重装到纯英文路径下。看数据库的报错并非无从下手关键是你得建立一套排查思路先看服务启动没有再看连接参数对不对再看权限和字符集最后才考虑语句本身。顺序对了排查速度能快一倍。6. 学完基础之后怎么继续巩固和进阶6.1 经典练习库北风数据库和课程设计的思路基础语法学完后刷题是巩固最快的路径。有两个经典练习资源值得知道一个是“北风数据库”Northwind。这个库是很多教材和培训机构在用的示例数据库里面有商品、订单、客户、员工、供应商等多张表数据之间关系足够复杂适合练 JOIN、子查询、聚合统计。网上可以搜到 SQL 脚本一条条执行就能建出完整的库和表。另一个是自己设计一个“学生选课系统”的三张表学生表 student(id, name, class_id) 课程表 course(id, course_name, credit) 成绩表 score(id, student_id, course_id, score)这个项目虽小但已经包含了一对多一个学生有多条成绩、多对多一个学生选多门课、一门课被多个学生选的经典关系。把这三张表建出来然后练习查询每个学生的选课门数和平均分查询每门课的选课人数和最高分查询选修了“数据库”课程的所有学生名单查询没有选任何课程的学生这四个查询覆盖了 JOIN、GROUP BY、LEFT JOIN、WHERE 的综合运用。能独立写出来你的 SQL 基础就算彻底过关了。6.2 数据库面试题背后的逻辑网上一搜“数据库面试题”能搜出一大堆但题目背后考察的无非是几个底层能力索引原理“为什么查询快为什么加索引会慢”——本质是考察你对 B 树的理解以及“索引不是越多越好”的工程权衡事务 ACID“什么是脏读、不可重复读、幻读”——考察你对并发控制的掌握锁机制“悲观锁和乐观锁的区别是什么”——考察你是否理解高并发场景的取舍SQL 优化“为什么这条查询很慢”——考察你能否用EXPLAIN分析执行计划而不是死记硬背我的建议是不要背答案而是动手验证。比如你建了学生表和成绩表插入 10 万条测试数据不加索引跑一次带 WHERE 的查询再建索引跑一次看执行时间差多少再用EXPLAIN看 rows 的变化。这个过程比背 50 道题都有用。6.3 数据库同步、设计文档与后续方向把基础打牢之后你会接触到更多“数据库周边”的工具和概念就是从“会用数据库”走向“能维护数据库系统”。最近几年数据库领域的热门方向很多数据库同步工具从主库同步到从库、从生产同步到测试环境常见的有 DataX、Maxwell、Canal以及各种图形化的同步配置工具数据库设计文档自动生成Java 项目里用 Schemacrawler、Chat2DB 这类工具能从现有表结构反向生成 Markdown 格式的设计文档省去手写文档的大量时间向量数据库随着 AI 应用普及Qdrant、Milvus 这些向量数据库越来越火它们专门用于存储和检索文本/图片的向量表示支撑“语义搜索”和“知识库问答”这类场景但不管方向怎么变关系型数据库的建模思维、SQL 能力、事务与锁的认知始终是底层基本功。把 MySQL 学明白的人去摸达梦、人大金仓这些国产库基本一天就能上手去摸 MongoDB 这类非关系型库也就两三天的事。最后分享一个我自己的体会我带过很多零基础转行的人他们有一个共性误区是“想先看完教程再动手”。数据库不是一个“看会”的领域它是一个“练会”的领域。花一个小时读完这篇不如花十分钟把文中的建表语句敲一遍再花十分钟插几条数据查一查。把增删改查练成肌肉记忆把 WHERE 条件记成条件反射再去碰课程设计、面试题你会发现自己比想象中上手快得多。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →