SQL 21天自学通:现代版学习路线图
核心理念:
- 动手为主,理论为辅:每天都要写代码,不要只看不练。
- 循序渐进,螺旋上升:每天在巩固前一天知识的基础上,学习新内容。
- 目标导向,解决问题:每天的学习都围绕一个具体的小目标展开。
准备工作 (Day 0)
在开始之前,请确保你已经准备好了以下环境:

- 选择一个数据库管理系统:
- 新手推荐:SQLite,它是一个轻量级的文件数据库,无需安装服务器,非常适合入门练习。
- 进阶推荐:PostgreSQL 或 MySQL,它们是功能强大的开源数据库,更接近生产环境,你可以使用它们的在线版本(如 SQLFiddle, DB Fiddle)或本地安装。
- 安装一个SQL客户端:
- DBeaver (跨平台,功能强大,推荐)
- DataGrip (JetBrains出品,付费,但体验极佳)
- VS Code + SQLTools 插件 (轻量级,适合开发者)
- 准备练习数据:找一个经典的示例数据库,
Sakila(MySQL自带) 或Northwind(微软经典示例),你也可以自己创建一些简单的表来练习。
第一周:SQL基础 - 掌握核心语法
目标: 能够独立完成数据的增、删、改、查,并理解数据表的基本结构。
| 天数 | 学习主题 | 核心知识点 | 实践任务 |
|---|---|---|---|
| Day 1 | SQL简介与环境搭建 | - 什么是SQL? - 数据库、表、行、列的概念 - 安装DBMS和客户端 - 如何连接数据库并执行简单查询 |
- 成功连接到你的数据库。 - 执行 SELECT 1; 或 SELECT 'Hello, SQL!'; 确保环境正常。 |
| Day 2 | 数据查询基础 - SELECT与FROM | - SELECT 子句:选择列- FROM 子句:选择表- 通配符 - 使用 AS 关键字给列起别名 |
- 查询一个表的所有列 (SELECT * FROM table_name;)。- 查询特定列,并为这些列起有意义的别名。 |
| Day 3 | 数据过滤 - WHERE子句 | - WHERE 子句:过滤行- 比较运算符 (, >, <, , <>)- 逻辑运算符 ( AND, OR, NOT) |
- 查询价格大于某个值的产品。 - 查询某个特定类别的客户。 - 组合多个条件,查找“北京”且“信用等级”为“A”的客户。 |
| Day 4 | 结果排序 - ORDER BY子句 | - ORDER BY 子句:对结果排序- ASC (升序) 和 DESC (降序)- 对多列进行排序 |
- 查询所有员工,并按工资从高到低排序。 - 查询订单,先按订单日期排序,再按订单金额排序。 |
| Day 5 | 数据限制 - LIMIT子句 | - LIMIT 子句:限制返回的行数- OFFSET 子句:分页偏移量 |
- 只查询最新的5条订单。 - 实现简单的分页:查询第11到20条记录 (使用 LIMIT 10 OFFSET 10;)。 |
| Day 6 | 数据汇总 - 聚合函数 | - COUNT(): 计数- SUM(): 求和- AVG(): 平均值- MAX() / MIN(): 最大/最小值 |
- 计算总共有多少个客户。 - 计算所有订单的总金额和平均金额。 - 找出最高和最低的产品价格。 |
| Day 7 | 本周总结与练习 | - 复习 SELECT, FROM, WHERE, ORDER BY, LIMIT, COUNT, SUM, AVG, MAX, MIN- 综合运用所有基础查询 |
- 设计一个包含用户、订单、商品三个表的场景。 - 尝试编写5-10个复杂的查询,查找过去一个月消费金额最高的前10名用户。 |
第二周:SQL进阶 - 处理复杂关系与数据
目标: 能够处理多表关联,并对数据进行分组和过滤。
| 天数 | 学习主题 | 核心知识点 | 实践任务 |
|---|---|---|---|
| Day 8 | 多表连接 - JOIN | - INNER JOIN: 内连接,返回匹配的行- LEFT JOIN: 左连接,返回左表所有行和匹配的右表行- RIGHT JOIN: 右连接- FULL OUTER JOIN: 全外连接 |
- 将 Customers 表和 Orders 表连接起来,显示每个客户的订单信息。- 使用 LEFT JOIN 查询所有客户,即使他们没有下过订单。 |
| Day 9 | 连接条件与ON子句 | - ON 子句:指定连接条件- 连接多个表 |
- 在 ON 子句中使用多个条件进行连接。- 连接三个或更多的表(客户 -> 订单 -> 订单详情 -> 商品)。 |
| Day 10 | 数据分组 - GROUP BY子句 | - GROUP BY 子句:将行分组- 结合聚合函数使用 |
- 按产品类别分组,计算每个类别的总销售额。 - 按月份分组,统计每个月的订单数量。 |
| Day 11 | 分组过滤 - HAVING子句 | - HAVING 子句:过滤分组- WHERE vs HAVING 的区别 |
- 找出总销售额超过10000元的商品类别。 - 找出订单数量超过5个的客户。 |
| Day 12 | 集合运算 | - UNION: 合并两个结果集,自动去重- UNION ALL: 合并两个结果集,不去重- INTERSECT: 取交集- EXCEPT / MINUS: 取差集 |
- 将两个表的查询结果合并成一个列表。 - 使用 UNION ALL 合并销售数据和退货数据。 |
| Day 13 | 子查询 | - WHERE 中的子查询- FROM 中的子查询 (派生表)- EXISTS / NOT EXISTS |
- 查询购买了“笔记本电脑”的所有客户。 - 使用 EXISTS 查询至少下过一次订单的客户。 |
| Day 14 | 本周总结与练习 | - 复习 JOIN, GROUP BY, HAVING, UNION, 子查询- 综合运用所有进阶查询 |
- 设计一个更复杂的业务场景(如电商、学校系统)。 - 尝试写出:1. 每个客户及其总消费金额;2. 消费金额排名前20%的客户;3. 没有购买过任何商品的用户。 |
第三周:SQL高级与实战 - 成为SQL高手
目标: 掌握现代SQL的高级特性,并能进行初步的数据分析。
| 天数 | 学习主题 | 核心知识点 | 实践任务 |
|---|---|---|---|
| Day 15 | 表修改 - DML语句 | - INSERT INTO: 插入数据- UPDATE: 更新数据- DELETE: 删除数据- 重要: BEGIN TRANSACTION, COMMIT, ROLLBACK |
- 向表中插入一条新记录。 - 更新某个产品的价格。 - 删除一个特定的订单。 - 在事务中安全地执行修改和删除,并练习回滚。 |
| Day 16 | 表结构管理 - DDL语句 | - CREATE TABLE: 创建表- ALTER TABLE: 修改表结构 (添加/删除列)- DROP TABLE: 删除表- PRIMARY KEY, FOREIGN KEY, NOT NULL, UNIQUE 约束 |
- 创建一个新表,并定义主键和外键。 - 向已存在的表添加一个新列。 |
| Day 17 | 现代SQL神器 - CTE (公用表表达式) | - WITH 关键字- 递归CTE简介 |
- 使用CTE重构一个复杂的子查询,使代码更清晰。 - 尝试用CTE计算每个部门的员工平均工资。 |
| Day 18 | 数据分析利器 - 窗口函数 | - OVER() 子句- PARTITION BY: 分区- ORDER BY: 排序- RANK(), DENSE_RANK(), ROW_NUMBER()- LAG(), LEAD() |
- 为每个订单添加一个序号 (ROW_NUMBER())。- 为每个客户按消费金额进行排名 ( RANK())。- 计算每个客户与上一次消费的间隔天数 ( LAG())。 |
| Day 19 | 条件逻辑与字符串处理 | - CASE WHEN ... THEN ... ELSE ... END- 字符串函数 ( CONCAT, SUBSTRING, LENGTH, TRIM)- 数值和日期函数 |
- 使用 CASE WHEN 对客户进行分级(如消费>10000为VIP)。- 拼接客户姓名和地址。 - 从日期中提取年份和月份。 |
| Day 20 | 索引与性能优化 | - 什么是索引? - 创建索引 ( CREATE INDEX)- 何时使用索引 - 慢查询初步 |
- 为经常用于 WHERE 或 JOIN 的列创建索引。- 使用 EXPLAIN 或 EXPLAIN ANALYZE 分析你的查询计划,理解索引是如何工作的。 |
| Day 21 | 项目实战与未来之路 | - 综合项目:选择一个你感兴趣的数据集(如电影评分、销售数据)。 - 提出至少10个业务问题,并用SQL回答它们。 - 学习成果展示。 |
- 完成你的综合项目,将所有学到的知识融会贯通。 - 将你的SQL代码和结果整理成文档。 - 未来学习:了解NoSQL、数据仓库、BI工具、SQL在不同编程语言中的用法等。 |
学习建议
- 保持耐心:SQL看似简单,但精通需要大量练习,遇到挫折是正常的。
- 建立知识库:把你遇到的问题和巧妙的解决方案记录下来(可以用Markdown或Notion)。
- 阅读优秀代码:去GitHub上找一些开源项目的数据库脚本,看看别人是怎么写的。
- 多思考“为什么”:为什么用
JOIN而不是子查询?为什么HAVING不能直接替换WHERE?理解背后的逻辑比死记硬背更重要。 - 持续学习:21天只是一个开始,SQL的世界非常广阔,还有很多高级主题等待你去探索。
祝你学习顺利,早日成为SQL高手!


版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。