MySQL SQL基础练习:从入门到实战100题 1. MySQL SQL基础练习的价值与适用场景对于任何需要与数据库打交道的开发者来说SQL都是必须掌握的看家本领。我见过太多简历上写着精通MySQL的候选人面对简单的多表联查时却手足无措。这100道基础练习题就像武术中的马步训练看似枯燥却能夯实你的底层能力。这套练习特别适合三类人群刚学完SQL语法但缺乏实战的新手建议先掌握SELECT/INSERT/UPDATE/DELETE等基础语法准备数据库相关面试的求职者覆盖80%的初级SQL面试题工作中需要偶尔写SQL但总记不住语法的非专职DBA我在带团队时有个习惯让所有新人在入职第一周完成这100题并讲解思路。这个简单的测试能快速暴露SQL思维的薄弱环节比如有人对JOIN的理解停留在理论层面有人面对复杂条件查询就本能地想写多个简单查询。2. 练习环境快速搭建指南2.1 MySQL安装方案选型虽然练习题可以在任何MySQL环境完成但我推荐使用Docker快速搭建隔离的练习环境docker run --name mysql-practice -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 -d mysql:8.0为什么选择这个方案版本统一避免我本地是5.7但生产用8.0的兼容性问题隔离性不会污染本地已有的MySQL实例可销毁练习完直接docker rm -f mysql-practice不留痕迹注意生产环境务必使用更复杂的密码这里仅为练习方便2.2 初始化练习数据库我准备了一个经典的员工管理数据库模型包含以下表employees员工基本信息departments部门信息salaries薪资记录dept_emp部门-员工关系titles职称记录执行以下命令获取并初始化数据wget https://example.com/employee_db.sql # 示例URL实际需替换 mysql -h 127.0.0.1 -P 3306 -u root -p123456 employee_db.sql3. 核心练习题分类解析3.1 单表查询基础20题这部分看似简单却暗藏玄机重点训练SELECT字段选择与别名使用WHERE条件组合特别是BETWEEN、IN、LIKE等易错操作符DISTINCT去重的实际应用场景ORDER BY多字段排序策略典型题目示例-- 找出1990年后入职的女性员工按部门分组统计人数 SELECT d.dept_name, COUNT(*) AS female_count FROM employees e JOIN dept_emp de ON e.emp_no de.emp_no JOIN departments d ON de.dept_no d.dept_no WHERE e.gender F AND e.hire_date 1990-01-01 GROUP BY d.dept_name HAVING COUNT(*) 5;3.2 多表连接实战30题JOIN是SQL的核心难点这部分重点训练INNER JOIN与LEFT JOIN的本质区别建议用Venn图辅助理解多表连接的执行顺序与性能影响自连接的特殊应用场景如查找同一部门的员工对避坑指南永远明确指定JOIN条件避免笛卡尔积多表连接时使用表别名提高可读性超过3个表连接时考虑使用WITH子句拆分逻辑3.3 聚合函数与分组统计20题从简单计数到复杂分析GROUP BY与HAVING的配合使用窗口函数初探RANK、DENSE_RANK等ROLLUP实现多级分组统计典型错误案例-- 错误SELECT列表包含非聚合字段 SELECT dept_no, emp_no, -- 这里会报错 AVG(salary) FROM salaries GROUP BY dept_no;3.4 子查询与复杂逻辑20题包括EXISTS与IN的性能对比相关子查询执行机制使用派生表简化复杂查询优化技巧将深度嵌套的子查询重构为JOIN使用CTEWITH子句提高可读性避免在WHERE子句中对字段使用函数3.5 数据修改与事务控制10题实战重点UPDATE使用JOIN实现跨表更新事务的ACID特性验证实验悲观锁与乐观锁模拟重要提醒-- 永远先写SELECT确认再转为UPDATE -- 错误示范缺少WHERE条件 UPDATE employees SET salary salary * 1.1; -- 全表更新4. 高效练习方法论4.1 分阶段练习计划建议的练习节奏基础阶段1-50题每天10题重点理解语法强化阶段51-80题每天5题注重性能分析实战阶段81-100题每题研究多种解法4.2 使用EXPLAIN分析执行计划对每道复杂题目都应查看执行计划EXPLAIN FORMATJSON SELECT ... [你的查询语句];重点关注type列最好达到ref或rangepossible_keys与实际使用的keyExtra列中的Using filesort等警告4.3 建立个人SQL代码库建议用Git管理所有练习答案目录结构示例/sql-100/ ├── /01-basic/ │ ├── 01-select.sql │ └── 02-where.sql ├── /02-join/ ├── /03-aggregation/ └── README.md # 记录学习心得5. 常见问题排错指南5.1 错误代码速查表错误代码典型原因解决方案1064SQL语法错误检查引号、括号是否匹配1146表不存在检查表名拼写和数据库选择1055GROUP BY错误SELECT字段必须出现在GROUP BY或聚合函数中5.2 性能优化检查清单当查询执行缓慢时是否有适当的索引SHOW INDEX FROM table是否扫描了过多行EXPLAIN中的rows列是否可以重写为JOIN替代子查询是否使用了OR条件导致索引失效5.3 数据类型陷阱常见问题VARCHAR比较时注意空格text ! text 日期范围查询包含边界date 2020-12-31是否包含当天浮点数精度问题避免直接等值比较6. 进阶学习路径完成这100题后建议学习索引原理与优化B树、覆盖索引等研究执行计划优化optimizer trace了解MySQL架构连接池、缓冲池等探索分布式数据库中间件如ShardingSphere我个人的经验是当你能把这100题中的复杂查询拆解为清晰的执行流程图时就真正掌握了SQL思维。建议每半年重做一次这些题目每次都会有新的理解。