🎯 本月只剩几天支持 SQLTest.online,帮助我们让 SQL 练习对每个人都免费。 今天捐赠 →
SQL 代码已复制到剪贴板

SQL 课程:从基础到数据分析的免费教程

本课程共 12 章、74 节课,带你从第一条 SELECT 学到连接、窗口函数、数据修改和查询性能。每节课用 SQL 示例讲解一个主题,并链接到在真实数据库上进行的练习。

可以按主题或关键词搜索课程,也可以从第 1 章开始学习。

1 SQL入门

  1. 1.1 数据库简介 8 分钟

    数据库是由 DBMS 管理的有组织的数据集合。了解数据库的类型、DBMS 的核心功能,以及为什么 SQL 是通用的数据语言。

  2. 1.2 数据库类型 15 分钟

    主要的数据库类型:关系型、键值、文档、宽列、图、时序和列式数据库,以及它们的区别和适用场景。

  3. 1.3 关系数据库概念 10 分钟

    关系数据库的基本组成:表、列、行、主键和外键,以及 ACID 事务特性,并配有示例。

  4. 1.4 基本数据类型 8 分钟

    SQL 数据类型决定一列可以存储哪些值。学习数值、字符串、日期时间、布尔等类型,并通过实例了解如何选择。

  5. 1.5 复杂数据类型 7 分钟

    简要介绍用于存储结构化数据的 SQL 类型:JSON、XML、数组、ENUM 和 SET、BLOB、UUID、空间类型,以及用于 AI 嵌入向量的 VECTOR。

  6. 1.6 理解 SQL 中的 NULL 值 6 分钟

    NULL 在关系型数据库中意味着什么,它与 0、空字符串和 false 有何不同,哪些列允许 NULL,以及为什么逻辑会变成三值逻辑。

  7. 1.7 SQL 概述 8 分钟

    SQL 是关系数据库的标准语言。了解 SQL 的组成、它的各个子语言,以及一条基本查询是如何构成的。

2 基本数据检索 - SELECT 语句

  1. 2.1 从表中选择数据 6 分钟

    学习 SQL SELECT 的基础:选择全部列或指定列,控制结果中的列顺序,以及用 DISTINCT 去除重复值。

  2. 2.2 过滤数据 6 分钟

    SQL WHERE 子句按条件过滤行。学习比较运算符、BETWEEN、IN、LIKE 模式匹配,以及如何正确处理 NULL。

  3. 2.3 组合多个条件 7 分钟

    学习 SQL WHERE 中的逻辑运算符 AND、OR 和 NOT,运算符优先级、括号,以及 NOT IN 和 NOT LIKE 的实用示例。

  4. 2.4 IS NULL 和 IS NOT NULL 6 分钟

    为什么 WHERE column = NULL 什么也找不到,IS NULL 和 IS NOT NULL 如何工作,以及 NULL 如何在 NOT、<> 和 NOT IN 条件中悄悄丢掉行。

  5. 2.5 列别名 5 分钟

    SQL 列别名为查询结果中的列指定临时名称。学习 AS 关键字、带空格的别名、计算列的别名,以及别名可以在查询的哪些部分使用。

  6. 2.6 排序结果 6 分钟

    SQL ORDER BY 对查询结果排序。学习升序和降序、按多列排序、按表达式和别名排序,以及 NULL 值在排序结果中的位置。

  7. 2.7 使用 LIMIT 和 OFFSET 限制结果 5 分钟

    SQL LIMIT 限制查询返回的行数,OFFSET 跳过若干行。学习前 N 行查询、分页、为什么需要 ORDER BY,以及 TOP 和 FETCH FIRST。

  8. 2.8 综合运用:WHERE、ORDER BY 和 LIMIT 6 分钟

    在一个 SQL 查询中组合使用 WHERE、ORDER BY 和 LIMIT。学习子句的书写顺序、逻辑处理顺序,以及带过滤的前 N 行查询和分页。

3 使用函数

  1. 3.1 内置 SQL 函数 8 分钟

    了解 SQL 内置函数在 SELECT 和 WHERE 子句中如何工作,并在基于 Sakila 的真实数据分析场景中应用它们。

  2. 3.2 常见字符串函数 8 分钟

    通过 Sakila 示例学习核心的 SQL 字符串函数:在实际查询中清理、拼接和提取文本数据。

  3. 3.3 核心数学函数 8 分钟

    通过 Sakila 示例学习核心 SQL 数学函数:舍入、取模、乘方、开方以及实用的计算场景。

  4. 3.4 日期和时间函数 8 分钟

    SQL 日期和时间函数用于获取当前日期、提取日期的各部分、加减时间间隔、计算日期差和格式化日期。包含 NOW、DATE_ADD、DATEDIFF 示例。

  5. 3.5 条件运算符 7 分钟

    SQL CASE WHEN 为查询添加“如果-那么-否则”逻辑。学习简单 CASE 和搜索 CASE、在 SELECT 中创建分类、自定义排序以及在 WHERE 中使用条件。

  6. 3.6 JSON 函数 8 分钟

    按路径从 JSON 列读取值、按值筛选行、统计数组元素,并用 JSON_VALUE、->>、JSON_OBJECT 和 JSON_ARRAYAGG 构建 JSON。

4 聚合函数和分组

  1. 4.1 基本聚合函数 8 分钟

    通过 Sakila 示例学习核心 SQL 聚合函数:COUNT、SUM、AVG、MIN、MAX,以及 COUNT(*)、COUNT(column) 与 COUNT(DISTINCT ...) 的区别。

  2. 4.2 分组数据 7 分钟

    学习 GROUP BY:语法、规则、按一列或多列分组,以及基于 Sakila 的实用示例。

  3. 4.3 过滤分组数据 7 分钟

    学习 HAVING 子句:语法、WHERE 与 HAVING 的区别、聚合后过滤分组,以及 Sakila 示例。

  4. 4.4 条件聚合 8 分钟

    条件聚合通过对 CASE WHEN 使用 SUM、COUNT 和 AVG,用一个 SQL 查询计算多个指标。学习常用写法、常见错误以及行转列(pivot)。

  5. 4.5 高级聚合 9 分钟

    ROLLUP、CUBE 和 GROUPING SETS 为 GROUP BY 结果添加小计和总计。学习它们的区别、MySQL 中的 WITH ROLLUP 以及 GROUPING() 函数。

5 使用多个表进行操作

  1. 5.1 SQL 中的 JOIN 基础 8 分钟

    SQL JOIN 通过相关列把两张或多张表的行组合起来。在 Sakila 数据上学习 JOIN 的原理、ON 条件和表别名。

  2. 5.2 INNER JOIN - 组合匹配行 6 分钟

    SQL INNER JOIN 只返回在两张表中都有匹配的行。学习语法、表别名、连接三张表,以及没有匹配的行会怎样。

  3. 5.3 左连接 - 包含左表中的所有记录 7 分钟

    SQL LEFT JOIN 返回左表的所有行和右表中匹配的行,没有匹配时为 NULL。学习语法、反连接(anti-join)以及常见陷阱。

  4. 5.4 右连接 - 包含右表中的所有记录 4 分钟

    SQL RIGHT JOIN 返回右表的所有行和左表中匹配的行。学习语法、它与 LEFT JOIN 的镜像关系,以及何时使用它。

  5. 5.5 FULL OUTER JOIN - 结合两个表的所有内容 6 分钟

    SQL FULL OUTER JOIN 返回两张表的所有行,没有匹配时为 NULL。学习语法,以及如何在 MySQL 和 MariaDB 中模拟 FULL OUTER JOIN。

  6. 5.6 CROSS JOIN - 笛卡尔积 5 分钟

    SQL CROSS JOIN 返回两张表中行的所有组合。学习语法、结果的规模,以及如何用它构建报表网格和填补缺失的组合。

  7. 5.7 自连接 - 将表与自身连接 5 分钟

    SQL 自连接把一张表与自身连接,用于比较行或遍历层级结构。了解为什么必须使用别名、如何避免重复的配对,以及员工与经理的示例。

  8. 5.8 实用的 JOIN 场景和技术 8 分钟

    SQL JOIN 实践示例:连接多张表、用 GROUP BY 聚合连接后的数据、查找缺失的行,以及避免合计被放大和外连接丢失行。

  9. 5.9 连接算法 9 分钟

    数据库如何执行连接:nested loop、hash join 和 merge join。了解每种算法的工作原理、查询规划器何时选择它,以及如何在 EXPLAIN 中查看。

  10. 5.10 数据集操作 8 分钟

    集合运算可以合并、求交集和相减多个查询结果。通过 Sakila 示例学习 UNION、INTERSECT 和 EXCEPT。

6 子查询和公共表表达式 (CTEs)

  1. 6.1 子查询简介 7 分钟

    子查询是嵌套在另一条查询中的 SELECT。通过 Sakila 实例学习子查询的类型、执行顺序和内联视图(Inline View)。

  2. 6.2 WHERE 子句中的子查询 8 分钟

    WHERE 中的子查询可以动态过滤数据。通过 Sakila 实例学习 IN、NOT IN、EXISTS、NOT EXISTS、ANY 和 ALL。

  3. 6.3 相关子查询 6 分钟

    SQL 相关子查询会针对每一行使用外层查询的值。学习它的工作原理、如何把行与其所在组比较、EXISTS 的用法以及性能注意事项。

  4. 6.4 公共表表达式 (CTEs) 8 分钟

    SQL CTE 是用 WITH 子句定义的命名临时结果集。学习 CTE 语法、CTE 与子查询的比较、在一个查询中串联多个 CTE,以及实际分析示例。

  5. 6.5 递归 CTE 9 分钟

    SQL 递归 CTE 用 WITH RECURSIVE 遍历层级数据。学习锚点成员和递归成员、组织架构路径、递归深度限制以及循环保护。

  6. 6.6 应用递归CTE 9 分钟

    SQL 递归 CTE 实用示例:生成日期序列填补空缺、汇总分类子树、展开物料清单(BOM),以及在图中查找路线。

7 窗口函数

  1. 7.1 窗口函数 8 分钟

    SQL 窗口函数在相关的行上计算,而不把行合并。学习 OVER、PARTITION BY、ORDER BY、窗口函数与 GROUP BY 的区别,以及占总数的百分比。

  2. 7.2 使用 ROW_NUMBER、RANK、DENSE_RANK 和 NTILE 8 分钟

    SQL 中 ROW_NUMBER、RANK、DENSE_RANK 和 NTILE 的区别:各自如何处理并列、何时使用哪一个,以及 PERCENT_RANK 和 CUME_DIST,基于真实数据。

  3. 7.3 窗口框架 - 控制窗口边界 8 分钟

    窗口框架决定窗口函数使用哪些行。学习 ROWS 与 RANGE、BETWEEN、UNBOUNDED、默认框架、移动平均以及 WINDOW 子句。

  4. 7.4 LAG、LEAD、FIRST_VALUE 和 LAST_VALUE 9 分钟

    学习 LAG、LEAD、FIRST_VALUE 和 LAST_VALUE:语法、常见用途、无需自连接的行间比较,以及 LAST_VALUE 框架的重要细节。

8 数据操作语言 (DML)

  1. 8.1 INSERT INTO 语句 7 分钟

    SQL INSERT INTO 向表中添加新行。学习带列列表的语法、一次插入多行、INSERT INTO ... SELECT、NULL 和 DEFAULT 值,以及常见错误。

  2. 8.2 UPDATE 语句 7 分钟

    SQL UPDATE 修改已有的行。学习 SET 和 WHERE、更新多列、基于当前值计算、根据另一张表更新,以及安全操作的做法。

  3. 8.3 DELETE 语句 6 分钟

    SQL DELETE 从表中删除行。学习 DELETE ... WHERE、根据另一张表删除、外键错误、删除前检查,以及 DELETE 与 TRUNCATE 的区别。

  4. 8.4 SQL 事务 10 分钟

    SQL 事务把多条语句组合成一个整体:要么全部生效,要么全部不生效。学习 COMMIT、ROLLBACK、SAVEPOINT、自动提交和事务隔离级别。

9 数据定义语言 (DDL)

  1. 9.1 CREATE TABLE 语句 9 分钟

    SQL CREATE TABLE 创建表。学习数据类型、PRIMARY KEY、AUTO_INCREMENT,以及 NOT NULL、UNIQUE、DEFAULT、CHECK 和 FOREIGN KEY 约束。

  2. 9.2 ALTER TABLE 语句 9 分钟

    SQL ALTER TABLE 用于修改已有的表。学习在 MySQL 和 PostgreSQL 中添加、修改、重命名和删除列,以及添加或删除约束。

  3. 9.3 TRUNCATE 和 DROP TABLE 语句 6 分钟

    SQL TRUNCATE 清空表,DROP TABLE 删除表。了解它们与 DELETE 在速度、回滚、自增计数器和外键方面的区别。

  4. 9.4 临时表 7 分钟

    SQL 临时表在一个会话中保存中间结果。学习 CREATE TEMPORARY TABLE、AS SELECT、临时表与 CTE 的对比,以及 MySQL 中的陷阱。

  5. 9.5 视图 8 分钟

    学习 SQL 视图:CREATE VIEW 语法、与普通表和临时表的区别、可更新性,以及基于 Sakila 的实用示例。

  6. 9.6 物化视图 9 分钟

    物化视图把查询结果保存在磁盘上,并按需刷新。学习 CREATE 和 REFRESH MATERIALIZED VIEW,以及在 MySQL 中的替代方案。

  7. 9.7 数据库规范化 10 分钟

    数据库规范化把数据拆分到相互关联的表中,让每个事实只存储一次。学习 1NF、2NF、3NF、BCNF、数据异常以及反规范化。

10 查询性能和质量

  1. 10.1 可读性和可维护性SQL代码的最佳实践 8 分钟

    编写可读 SQL 的最佳实践:关键字大小写、换行与缩进、snake_case 命名、清晰的别名、注释,以及整理一条混乱的查询。

  2. 10.2 编写高效的 SQL 查询 10 分钟

    高效的 SQL 查询能减轻服务器负载、加快报表生成。学习过滤、JOIN、SARGable 条件和 LIMIT 的实用技巧。

  3. 10.3 SQL 索引入门 10 分钟

    了解什么是 SQL 索引、它如何影响 SELECT 的性能,以及哪些基本规则能帮你避免常见的查询速度问题。

  4. 10.4 如何阅读 EXPLAIN 12 分钟

    逐步读懂 EXPLAIN 和 EXPLAIN ANALYZE:访问类型、连接顺序、cost 与 rows、估算与实际行数,以及慢 SQL 查询的信号。

  5. 10.5 B-tree 索引是如何工作的 11 分钟

    了解 SQL 中 B-tree 索引的结构、它为何能把查找降到对数复杂度,以及如何在实际查询中使用它。

  6. 10.6 全文索引 10 分钟

    全文索引按单词在文本中查找行,而 LIKE '%单词%' 需要读取整张表。学习 MySQL 的 MATCH AGAINST 和 PostgreSQL 的全文搜索。

11 数据转换和分析操作

  1. 11.1 SQL 中的实用字符串处理 10 分钟

    学习 SQL 中的实用字符串处理:清理文本值、提取邮箱域名、构建标签以及校验数据质量。

  2. 11.2 日期和时间函数的实际应用 11 分钟

    学习 SQL 日期时间函数的实际用法:构建每日和每月指标、计算时间间隔、发现季节性,并准备分析报表。

12 任务分析

  1. 12.1 最快的航班选项 6 分钟

    SQL 题目解析:在 PostgreSQL 中通过 flights 表的自连接和时间间隔运算,找出只中转一次的最快航班。

  2. 12.2 计算航班的平均占用率 7 分钟

    SQL 题目解析:在 PostgreSQL 中用 LEFT JOIN、COUNT FILTER 和两级聚合,按机场和舱位等级计算平均座位上座率。

  3. 12.3 飞机座位图 5 分钟

    SQL 题目解析:用 rtrim 和 right 拆分座位号,再用 json_agg 把字母汇总成 JSON 数组,生成飞机座位图。

  4. 12.4 第 N 高的薪水 7 分钟

    在 SQL 中查找第二高或第 N 高的薪水:MAX 加子查询、LIMIT OFFSET、DENSE_RANK、相关子查询,以及并列、NULL 结果和按部门求解。

  5. 12.5 查找和删除重复行 7 分钟

    如何用 GROUP BY 和 HAVING 查找 SQL 中的重复行,用窗口函数列出每份副本,在保留一行的前提下删除重复数据,并防止再次出现重复。

  6. 12.6 每组前 N 行 7 分钟

    在 SQL 中获取每组的前 N 行:ROW_NUMBER 配合 PARTITION BY,用 RANK 和 DENSE_RANK 处理并列,相关子查询,以及 LATERAL 连接,基于 Sakila 数据。

  7. 12.7 累计总和 6 分钟

    用 SUM() OVER (ORDER BY) 在 SQL 中计算累计总和:按天累计收入、每年重新开始的累计值、ROWS 与 RANGE 的陷阱,以及不用窗口函数的解法。

  8. 12.8 间隙与岛屿 7 分钟

    在 SQL 中解决间隙与岛屿问题:用 ROW_NUMBER 技巧把连续日期分组,用 LEAD 查找缺失区间,并求出每位客户最长的连续天数。

  9. 12.9 行转列(Pivot) 7 分钟

    SQL 中的行转列:用 SUM(CASE ...) 做条件聚合、按月行转列、在 MySQL 中实现动态行转列、PIVOT 运算符以及列转行(unpivot)。