尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
MySQL 学习笔记一
# MySQL 学习进度笔记# 一、笔记用途本文件用于记录 MySQL 学习进度方便在新的 ChatGPT 聊天中继续学习。学习者背景* 服务端开发工程师。* 主要使用 Node.js、Pomelo、Redis、MongoDB。* 正在从基础开始系统学习 MySQL。* 使用 Windows 电脑进行开发。学习要求1. 使用中文讲解循序渐进。2. 每一课都要有知识点、SQL 示例、实际用途和练习。3. 练习完成后逐题批改给出分数。4. 详细解释正确原因和错误原因。5. 尽量结合游戏服务端场景例如玩家、道具、背包、金币、订单和排行榜。6. 不要跳过基础知识也不要在没有理解前一次讲太多新内容。7. 每次继续学习前先参考本文件中的进度。8. 注意区分示例数据与实际数据库数据不要假设本地表结构一定完全一致。# 二、当前学习进度已完成* 第 1 课MySQL 基础* 第 2 课WHERE 条件查询、排序与限制* 第 3 课增删改查 CRUD* 第 4 课聚合函数与分组* 第 5 课进阶条件查询* 第 6 课多表查询 JOIN当前正在学习* 第 7 课子查询 Subquery第 7 课已经完成知识讲解但三道练习题尚未提交和批改。下一步必须先完成第 7 课练习然后再进入第 8 课索引 INDEX。# 三、第 1 课MySQL 基础1. 基础概念数据库 Database用于存储和组织数据。数据表 Table由行和列组成用于保存一类数据。行 Row代表一条记录例如一个玩家。列 Column代表记录中的一个字段例如玩家名称、等级、金币。2. 创建数据库CREATE DATABASE study_mysql;选择数据库USE study_mysql;3. 创建玩家表CREATE TABLE player (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,level INT NOT NULL DEFAULT 1,gold INT NOT NULL DEFAULT 0);字段说明id玩家 ID整数类型主键自动递增。name玩家名称最多 50 个字符不允许为 NULL。level玩家等级整数类型默认值为 1。gold玩家金币整数类型默认值为 0。PRIMARY KEY主键用于唯一标识一条记录。AUTO_INCREMENT插入数据时自动生成递增的 ID。NOT NULL不允许字段值为 NULL。DEFAULT设置默认值。4. 插入数据INSERT INTO player (name, level, gold)VALUES (张三, 10, 500);INSERT INTO player (name, level, gold)VALUES (李四, 20, 1200);INSERT INTO player (name, level, gold)VALUES (王五, 5, 300);5. 查询所有数据SELECT * FROM player;* 表示查询所有字段。注意以上是教学示例。实际数据库可能已经存在这些数据不要为了重复练习而反复插入相同数据。# 四、第 2 课WHERE 条件查询、排序与限制1. WHERE 条件查询查询名称为李四的玩家SELECT *FROM playerWHERE name 李四;2. 比较运算符 等于 大于 小于 大于等于 小于等于 ! 不等于示例查询等级大于 10 的玩家。SELECT *FROM playerWHERE level 10;3. AND 与 ORAND多个条件必须同时满足。SELECT *FROM playerWHERE level 10 AND gold 500;OR多个条件满足其中一个即可。SELECT *FROM playerWHERE level 20 OR gold 1000;4. ORDER BY 排序等级从低到高SELECT *FROM playerORDER BY level ASC;等级从高到低SELECT *FROM playerORDER BY level DESC;ASC 表示升序。DESC 表示降序。5. LIMIT 限制返回数量查询等级最高的 3 名玩家SELECT *FROM playerORDER BY level DESCLIMIT 3;# 五、第 3 课CRUD 增删改查CRUD 是数据库最基本的操作。Create新增。Read查询。Update更新。Delete删除。1. INSERT 新增INSERT INTO player (name, level, gold)VALUES (孙七, 15, 2000);2. SELECT 查询SELECT *FROM player;3. UPDATE 更新将李四的金币修改为 3000UPDATE playerSET gold 3000WHERE name 李四;UPDATE 的基本结构UPDATE 表名SET 字段名 新值WHERE 条件;4. DELETE 删除删除王五DELETE FROM playerWHERE name 王五;DELETE 的基本结构DELETE FROM 表名WHERE 条件;5. 非常重要的安全规则错误示例UPDATE player SET gold 3000;由于没有 WHERE可能会把所有玩家的金币都修改为 3000。错误示例DELETE FROM player;由于没有 WHERE会删除整张表中的所有记录。正确习惯1. 修改或删除前先使用 SELECT 检查目标记录。2. 尽量使用唯一的 id 定位玩家。3. 不要盲目执行 UPDATE 和 DELETE。4. 字符串使用英文半角单引号例如 李四。5. 不要使用中文弯引号例如 ‘李四’。更安全的更新示例UPDATE playerSET gold 3000WHERE id 2;# 六、第 4 课聚合函数与分组1. COUNT 统计数量查询玩家总数SELECT COUNT(*)FROM player;2. SUM 求和查询所有玩家的金币总和SELECT SUM(gold)FROM player;3. MAX 最大值查询最高等级SELECT MAX(level)FROM player;4. MIN 最小值查询最低等级SELECT MIN(level)FROM player;5. AVG 平均值查询平均等级SELECT AVG(level)FROM player;6. GROUP BY 分组统计统计每个等级有多少名玩家SELECT level, COUNT(*) AS player_countFROM playerGROUP BY level;说明GROUP BY按照指定字段分组。COUNT(*)统计每组记录数量。AS player_count为查询结果中的统计列设置别名。游戏场景可以用于统计不同等级的玩家人数、不同道具的持有记录数量等。# 七、第 5 课进阶条件查询1. LIKE 模糊匹配查询名称以“张”开头的玩家SELECT *FROM playerWHERE name LIKE 张%;常见通配符%匹配任意长度的字符包括零个字符。_匹配单个字符。2. IN 指定多个可能值查询 ID 为 1、2、3 的玩家SELECT *FROM playerWHERE id IN (1, 2, 3);3. BETWEEN 范围查询查询等级在 10 到 20 之间的玩家SELECT *FROM playerWHERE level BETWEEN 10 AND 20;BETWEEN 通常包含起始值和结束值。4. IS NULL 判断空值查询 email 为空的玩家SELECT *FROM playerWHERE email IS NULL;查询 email 不为空的玩家SELECT *FROM playerWHERE email IS NOT NULL;注意原始 player 表不一定包含 email 字段。如果需要练习可以先确认字段是否存在再考虑执行ALTER TABLE playerADD COLUMN email VARCHAR(100) NULL;NULL 不等于 0也不等于空字符串 。判断 NULL 应使用 IS NULL 或 IS NOT NULL不要使用 email NULL。# 八、第 6 课多表查询 JOIN1. 为什么需要 JOIN游戏服务端中玩家基础信息和玩家道具通常可以放在不同的表中。例如player保存玩家信息。player_item保存玩家拥有的道具。通过玩家 ID 将两张表关联起来。2. 玩家表 player示例数据id | name | level1 | 张三 | 102 | 李四 | 203 | 王五 | 53. 道具表 player_item示例建表语句CREATE TABLE player_item (id INT PRIMARY KEY AUTO_INCREMENT,player_id INT NOT NULL,item_name VARCHAR(50) NOT NULL,item_count INT NOT NULL DEFAULT 0);示例数据INSERT INTO player_item (player_id, item_name, item_count)VALUES(1, 金币袋, 5),(1, 宝石, 2),(2, 金币袋, 10),(2, 木剑, 1);注意执行建表或插入前要确认表和数据是否已经存在。player_id 必须与实际 player 表中的 id 对应。不要在不确认的情况下重复插入示例数据。4. INNER JOIN 内连接查询有匹配道具记录的玩家及道具SELECTplayer.name,player_item.item_name,player_item.item_countFROM playerINNER JOIN player_itemON player.id player_item.player_id;INNER JOIN 的特点只返回两张表中符合关联条件的记录。没有匹配道具的玩家不会出现在结果中。5. LEFT JOIN 左连接查询所有玩家及其道具SELECTplayer.name,player_item.item_name,player_item.item_countFROM playerLEFT JOIN player_itemON player.id player_item.player_id;LEFT JOIN 的特点保留左表 player 中的所有玩家。如果玩家没有匹配的道具记录右表字段会返回 NULL。6. INNER JOIN 与 LEFT JOIN 的区别INNER JOIN只保留匹配成功的记录。LEFT JOIN保留左表所有记录即使右表没有匹配数据。7. 第 6 课练习结果题目 1查询成功匹配的玩家名称、道具名称和数量。用户答案使用 INNER JOIN正确。题目 2查询所有玩家及其道具没有道具的玩家也要显示。用户答案使用 LEFT JOIN正确。题目 3王五没有道具时如何让他仍然出现用户回答 LEFT JOIN并正确解释了没有匹配记录时右表字段为 NULL。第 6 课成绩100 / 100。8. LEFT JOIN 的注意事项例如SELECT player.name, player_item.item_nameFROM playerLEFT JOIN player_itemON player.id player_item.player_idWHERE player_item.item_name 木剑;这条 SQL 会筛选道具名称为木剑的匹配记录。没有匹配道具的玩家会因为 WHERE 条件而被过滤掉。因此使用 LEFT JOIN 时需要注意 WHERE 条件是否会排除右表没有匹配记录的行。# 九、第 7 课子查询 Subquery当前课程当前进度已经学习子查询的基本概念和三个示例。三道练习尚未提交和批改。1. 什么是子查询子查询是在一条 SQL 语句内部嵌套另一条 SQL 语句。例如SELECT *FROM playerWHERE level (SELECT AVG(level)FROM player);内部查询SELECT AVG(level)FROM player;用于计算玩家平均等级。外部查询找出等级高于平均等级的玩家。实际执行方式可能经过 MySQL 优化器优化。这里的先后步骤主要用于帮助理解。2. 查询等级高于平均等级的玩家SELECT *FROM playerWHERE level (SELECT AVG(level)FROM player);知识点AVG(level)计算平均等级。子查询将计算出的平均等级作为外层查询的条件。3. 查询金币最多的玩家SELECT *FROM playerWHERE gold (SELECT MAX(gold)FROM player);知识点MAX(gold)计算最大金币值。外层查询找出金币等于最大值的玩家。如果多个玩家金币并列第一这条 SQL 会返回所有并列玩家。4. 查询拥有道具记录的玩家SELECT *FROM playerWHERE id IN (SELECT player_idFROM player_item);知识点子查询返回 player_item 表中的 player_id 列表。IN判断玩家 id 是否在这个列表中。该写法可以查询拥有道具记录的玩家。即使一个玩家有多条道具记录外层玩家记录也不会因为道具数量而重复出现。# 十、第 7 课待完成练习请先完成下面三道题再继续第 8 课。练习 1平均等级30 分要求查询所有等级高于玩家平均等级的玩家。提示使用 AVG(level) 和子查询。练习 2最高金币30 分要求查询金币最多的玩家只返回玩家名称和金币数量。提示使用 MAX(gold) 和子查询。练习 3拥有道具的玩家40 分要求查询所有至少拥有一条道具记录的玩家每名玩家只显示一次。提示使用 IN 和子查询避免 JOIN 造成玩家重复出现。批改要求* 每题分别打分。* 解释 SQL 是否正确。* 如果错误指出具体语法或逻辑问题。* 给出正确 SQL。* 解释子查询的含义。* 三题完成后进入第 8 课。# 十一、后续学习计划第 8 课索引 INDEX* 什么是索引。* 为什么索引可以加快查询。* 如何创建索引。* 如何查看索引。* 如何删除索引。* 主键和普通索引的区别。* 如何为游戏中的玩家查询、道具查询设计索引。* 索引并非越多越好因为索引会占用空间也会增加 INSERT、UPDATE、DELETE 的维护成本。后续课程建议第 9 课主键、唯一约束与索引设计。第 10 课事务 Transaction。学习 START TRANSACTION、COMMIT、ROLLBACK。第 11 课数据库表设计与表之间的关系。第 12 课EXPLAIN 与慢查询分析。第 13 课Node.js 服务端如何连接 MySQL。第 14 课游戏服务端数据库实战例如玩家金币变更、道具扣除、订单记录和排行榜查询。# 十二、给下次 ChatGPT 的继续学习指令请阅读这份 MySQL 学习进度笔记并严格按照当前进度继续教学。我的学习背景我是服务端开发工程师主要使用 Node.js、Pomelo、Redis 和 MongoDB目前正在学习 MySQL。教学要求1. 使用中文教学。2. 采用循序渐进的方式。3. 每课包含知识讲解、SQL 示例、常见错误和练习。4. 每次练习都要逐题批改并评分。5. 结合游戏服务端的实际开发场景讲解。6. 不要从第 1 课重新开始。7. 当前已完成第 16 课。8. 第 6 课 JOIN 练习成绩为 100 / 100。9. 当前正在学习第 7 课子查询。10. 第 7 课知识讲解已完成但三道练习尚未提交和批改。11. 请先让我提交第 7 课练习如果我已经在聊天中给出答案就直接批改。12. 批改完成后再进入第 8 课索引 INDEX。13. 不要假设我的本地数据库与示例数据完全一致。涉及 CREATE TABLE、INSERT、UPDATE、DELETE 时先提醒我确认实际表结构和数据避免重复插入或误修改。请从第 7 课的三道练习开始继续。
RELATED

相关推荐

Claude Code Mods实战:自定义命令、MCP工具与终端界面

Claude Code Mods实战:自定义命令、MCP工具与终端界面

Claude Code Mods 这个词,最近在我的圈子里出现频率一下子高了起来。说白了,它就是一套围绕 Claude Code 的轻量扩展玩法:给这个终端里的 AI 助手挂上自定义命令、接上外部工具,顺手还能用 ANSI 转义序列在终端里渲染出带颜色、带…

📅 2026/10/10 8:39:44
风储VSG并网Simulink仿真:虚拟同步发电机建模与参数整定详解

风储VSG并网Simulink仿真:虚拟同步发电机建模与参数整定详解

整套风储并网系统搭下来之前,我一直以为“并网仿真难在电力电子器件选型和拓扑上”,直到把虚拟同步发电机控制加进去,才发现真正的核心其实是“怎么让那台没有转子的逆变器,表现得像一台有转子的同步发电机”。最近终于完成了这套…

📅 2026/10/10 8:34:39
Pulse v6 自托管商业 GA 一致性:付费运行时分发与 Docker 镜像策略演进记录

Pulse v6 自托管商业 GA 一致性:付费运行时分发与 Docker 镜像策略演进记录

可观测性运维后端 【免费下载链接】Pulse Real-time monitoring dashboard for Proxmox VE, PBS, Docker, Kubernetes, TrueNAS and vSphere. Self-hosted, with smart alerts and AI patrols that catch silent failures. 项目地址: https://gitcode.com/gh_mirror…

📅 2026/10/10 8:34:39
MORE NEWS

更多资讯

📰

铁路智能调度系统:B/S+C/S混合架构与蚁群算法落地实践

简介:本资源是一篇发表于《新型工业化》2020年第6期的专业技术论文,聚焦铁路运输智能化系统的开发设计全过程,面向智能交通、工业软件开发及铁路信息化领域的工程师、高校研究者与系统架构师,解决传统铁路调度效率低、人工依赖强、…

📰

分布式系统监控工具选型与落地:从指标、链路到告警的实践

做分布式系统运维的人都会有这种感觉:系统规模一上来,排查问题的时间比写业务代码的时间还要长。一个订单服务偶发超时,可能要同时翻网关日志、链路追踪、数据库慢查询和消息队列积压数据,信息分散在十几个界面里,等线…

📰

AI 写的 Redis 分布式锁为什么会超卖:四个错误写法和正确实现

秒杀功能要加个分布式锁。我让 AI 写,它给了一段这个: public boolean tryLock(String key, long timeoutSeconds) {Boolean success redisTemplate.opsForValue().setIfAbsent(key, "1", timeoutSeconds, TimeUnit.SECONDS);return Boolean.…

📰

Go服务集成身份证OCR:风控实名认证的识别与校验方案

做风控开发的同行应该都有同感:实名认证这一关,是合规审查链路里最绕不开的环节。无论是信贷、支付还是租赁场景,用户提交身份证照片的那一刻,你的系统就要开始面对一连串问题——这照片是原件还是复印件?有没有被PS过…

📰

基于MFC的LALR(1)分析表自动构造:从文法到可视化桌面程序

简介:本资源面向编译原理课程学习者与课程设计开发者,提供一套基于MFC实现的LALR(1)分析表自动构造程序,帮助理解并实践从LR(1)项目集规范族到LALR(1)分析表构造的完整流程。压缩包共52个文件,约63.55MB,包含设计报告W…

📰

大四网络工程转型 AI 应用开发:我的 5 个月自学计划(第二周)

从"跟着敲"到"自己搭"这一篇是第二周的记录。第二周我学的东西,比第一周更硬:集合、字典、函数、参数的几种传法、lambda、递归,最后还写了两个完整的系统。上一篇发出去之后,我说尽量每周更一篇。结果假期玩…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬