SQL 课程:从基础到数据分析的免费教程
本课程共 12 章、74 节课,带你从第一条 SELECT 学到连接、窗口函数、数据修改和查询性能。每节课用 SQL 示例讲解一个主题,并链接到在真实数据库上进行的练习。
可以按主题或关键词搜索课程,也可以从第 1 章开始学习。
未找到课程,请换个关键词试试。
1 SQL入门
-
1.1
数据库简介
8 分钟
数据库是由 DBMS 管理的有组织的数据集合。了解数据库的类型、DBMS 的核心功能,以及为什么 SQL 是通用的数据语言。
-
1.2
数据库类型
15 分钟
主要的数据库类型:关系型、键值、文档、宽列、图、时序和列式数据库,以及它们的区别和适用场景。
-
1.3
关系数据库概念
10 分钟
关系数据库的基本组成:表、列、行、主键和外键,以及 ACID 事务特性,并配有示例。
-
1.4
基本数据类型
8 分钟
SQL 数据类型决定一列可以存储哪些值。学习数值、字符串、日期时间、布尔等类型,并通过实例了解如何选择。
-
1.5
复杂数据类型
7 分钟
简要介绍用于存储结构化数据的 SQL 类型:JSON、XML、数组、ENUM 和 SET、BLOB、UUID、空间类型,以及用于 AI 嵌入向量的 VECTOR。
-
1.6
理解 SQL 中的 NULL 值
6 分钟
NULL 在关系型数据库中意味着什么,它与 0、空字符串和 false 有何不同,哪些列允许 NULL,以及为什么逻辑会变成三值逻辑。
-
1.7
SQL 概述
8 分钟
SQL 是关系数据库的标准语言。了解 SQL 的组成、它的各个子语言,以及一条基本查询是如何构成的。
2 基本数据检索 - SELECT 语句
-
2.1
从表中选择数据
6 分钟
学习 SQL SELECT 的基础:选择全部列或指定列,控制结果中的列顺序,以及用 DISTINCT 去除重复值。
-
2.2
过滤数据
6 分钟
SQL WHERE 子句按条件过滤行。学习比较运算符、BETWEEN、IN、LIKE 模式匹配,以及如何正确处理 NULL。
-
2.3
组合多个条件
7 分钟
学习 SQL WHERE 中的逻辑运算符 AND、OR 和 NOT,运算符优先级、括号,以及 NOT IN 和 NOT LIKE 的实用示例。
-
2.4
IS NULL 和 IS NOT NULL
6 分钟
为什么 WHERE column = NULL 什么也找不到,IS NULL 和 IS NOT NULL 如何工作,以及 NULL 如何在 NOT、<> 和 NOT IN 条件中悄悄丢掉行。
-
2.5
列别名
5 分钟
SQL 列别名为查询结果中的列指定临时名称。学习 AS 关键字、带空格的别名、计算列的别名,以及别名可以在查询的哪些部分使用。
-
2.6
排序结果
6 分钟
SQL ORDER BY 对查询结果排序。学习升序和降序、按多列排序、按表达式和别名排序,以及 NULL 值在排序结果中的位置。
-
2.7
使用 LIMIT 和 OFFSET 限制结果
5 分钟
SQL LIMIT 限制查询返回的行数,OFFSET 跳过若干行。学习前 N 行查询、分页、为什么需要 ORDER BY,以及 TOP 和 FETCH FIRST。
-
2.8
综合运用:WHERE、ORDER BY 和 LIMIT
6 分钟
在一个 SQL 查询中组合使用 WHERE、ORDER BY 和 LIMIT。学习子句的书写顺序、逻辑处理顺序,以及带过滤的前 N 行查询和分页。
3 使用函数
-
3.1
内置 SQL 函数
8 分钟
了解 SQL 内置函数在 SELECT 和 WHERE 子句中如何工作,并在基于 Sakila 的真实数据分析场景中应用它们。
-
3.2
常见字符串函数
8 分钟
通过 Sakila 示例学习核心的 SQL 字符串函数:在实际查询中清理、拼接和提取文本数据。
-
3.3
核心数学函数
8 分钟
通过 Sakila 示例学习核心 SQL 数学函数:舍入、取模、乘方、开方以及实用的计算场景。
-
3.4
日期和时间函数
8 分钟
SQL 日期和时间函数用于获取当前日期、提取日期的各部分、加减时间间隔、计算日期差和格式化日期。包含 NOW、DATE_ADD、DATEDIFF 示例。
-
3.5
条件运算符
7 分钟
SQL CASE WHEN 为查询添加“如果-那么-否则”逻辑。学习简单 CASE 和搜索 CASE、在 SELECT 中创建分类、自定义排序以及在 WHERE 中使用条件。
-
3.6
JSON 函数
8 分钟
按路径从 JSON 列读取值、按值筛选行、统计数组元素,并用 JSON_VALUE、->>、JSON_OBJECT 和 JSON_ARRAYAGG 构建 JSON。
4 聚合函数和分组
-
4.1
基本聚合函数
8 分钟
通过 Sakila 示例学习核心 SQL 聚合函数:COUNT、SUM、AVG、MIN、MAX,以及 COUNT(*)、COUNT(column) 与 COUNT(DISTINCT ...) 的区别。
-
4.2
分组数据
7 分钟
学习 GROUP BY:语法、规则、按一列或多列分组,以及基于 Sakila 的实用示例。
-
4.3
过滤分组数据
7 分钟
学习 HAVING 子句:语法、WHERE 与 HAVING 的区别、聚合后过滤分组,以及 Sakila 示例。
-
4.4
条件聚合
8 分钟
条件聚合通过对 CASE WHEN 使用 SUM、COUNT 和 AVG,用一个 SQL 查询计算多个指标。学习常用写法、常见错误以及行转列(pivot)。
-
4.5
高级聚合
9 分钟
ROLLUP、CUBE 和 GROUPING SETS 为 GROUP BY 结果添加小计和总计。学习它们的区别、MySQL 中的 WITH ROLLUP 以及 GROUPING() 函数。
5 使用多个表进行操作
-
5.1
SQL 中的 JOIN 基础
8 分钟
SQL JOIN 通过相关列把两张或多张表的行组合起来。在 Sakila 数据上学习 JOIN 的原理、ON 条件和表别名。
-
5.2
INNER JOIN - 组合匹配行
6 分钟
SQL INNER JOIN 只返回在两张表中都有匹配的行。学习语法、表别名、连接三张表,以及没有匹配的行会怎样。
-
5.3
左连接 - 包含左表中的所有记录
7 分钟
SQL LEFT JOIN 返回左表的所有行和右表中匹配的行,没有匹配时为 NULL。学习语法、反连接(anti-join)以及常见陷阱。
-
5.4
右连接 - 包含右表中的所有记录
4 分钟
SQL RIGHT JOIN 返回右表的所有行和左表中匹配的行。学习语法、它与 LEFT JOIN 的镜像关系,以及何时使用它。
-
5.5
FULL OUTER JOIN - 结合两个表的所有内容
6 分钟
SQL FULL OUTER JOIN 返回两张表的所有行,没有匹配时为 NULL。学习语法,以及如何在 MySQL 和 MariaDB 中模拟 FULL OUTER JOIN。
-
5.6
CROSS JOIN - 笛卡尔积
5 分钟
SQL CROSS JOIN 返回两张表中行的所有组合。学习语法、结果的规模,以及如何用它构建报表网格和填补缺失的组合。
-
5.7
自连接 - 将表与自身连接
5 分钟
SQL 自连接把一张表与自身连接,用于比较行或遍历层级结构。了解为什么必须使用别名、如何避免重复的配对,以及员工与经理的示例。
-
5.8
实用的 JOIN 场景和技术
8 分钟
SQL JOIN 实践示例:连接多张表、用 GROUP BY 聚合连接后的数据、查找缺失的行,以及避免合计被放大和外连接丢失行。
-
5.9
连接算法
9 分钟
数据库如何执行连接:nested loop、hash join 和 merge join。了解每种算法的工作原理、查询规划器何时选择它,以及如何在 EXPLAIN 中查看。
-
5.10
数据集操作
8 分钟
集合运算可以合并、求交集和相减多个查询结果。通过 Sakila 示例学习 UNION、INTERSECT 和 EXCEPT。
6 子查询和公共表表达式 (CTEs)
-
6.1
子查询简介
7 分钟
子查询是嵌套在另一条查询中的 SELECT。通过 Sakila 实例学习子查询的类型、执行顺序和内联视图(Inline View)。
-
6.2
WHERE 子句中的子查询
8 分钟
WHERE 中的子查询可以动态过滤数据。通过 Sakila 实例学习 IN、NOT IN、EXISTS、NOT EXISTS、ANY 和 ALL。
-
6.3
相关子查询
6 分钟
SQL 相关子查询会针对每一行使用外层查询的值。学习它的工作原理、如何把行与其所在组比较、EXISTS 的用法以及性能注意事项。
-
6.4
公共表表达式 (CTEs)
8 分钟
SQL CTE 是用 WITH 子句定义的命名临时结果集。学习 CTE 语法、CTE 与子查询的比较、在一个查询中串联多个 CTE,以及实际分析示例。
-
6.5
递归 CTE
9 分钟
SQL 递归 CTE 用 WITH RECURSIVE 遍历层级数据。学习锚点成员和递归成员、组织架构路径、递归深度限制以及循环保护。
-
6.6
应用递归CTE
9 分钟
SQL 递归 CTE 实用示例:生成日期序列填补空缺、汇总分类子树、展开物料清单(BOM),以及在图中查找路线。
7 窗口函数
-
7.1
窗口函数
8 分钟
SQL 窗口函数在相关的行上计算,而不把行合并。学习 OVER、PARTITION BY、ORDER BY、窗口函数与 GROUP BY 的区别,以及占总数的百分比。
-
7.2
使用 ROW_NUMBER、RANK、DENSE_RANK 和 NTILE
8 分钟
SQL 中 ROW_NUMBER、RANK、DENSE_RANK 和 NTILE 的区别:各自如何处理并列、何时使用哪一个,以及 PERCENT_RANK 和 CUME_DIST,基于真实数据。
-
7.3
窗口框架 - 控制窗口边界
8 分钟
窗口框架决定窗口函数使用哪些行。学习 ROWS 与 RANGE、BETWEEN、UNBOUNDED、默认框架、移动平均以及 WINDOW 子句。
-
7.4
LAG、LEAD、FIRST_VALUE 和 LAST_VALUE
9 分钟
学习 LAG、LEAD、FIRST_VALUE 和 LAST_VALUE:语法、常见用途、无需自连接的行间比较,以及 LAST_VALUE 框架的重要细节。
8 数据操作语言 (DML)
-
8.1
INSERT INTO 语句
7 分钟
SQL INSERT INTO 向表中添加新行。学习带列列表的语法、一次插入多行、INSERT INTO ... SELECT、NULL 和 DEFAULT 值,以及常见错误。
-
8.2
UPDATE 语句
7 分钟
SQL UPDATE 修改已有的行。学习 SET 和 WHERE、更新多列、基于当前值计算、根据另一张表更新,以及安全操作的做法。
-
8.3
DELETE 语句
6 分钟
SQL DELETE 从表中删除行。学习 DELETE ... WHERE、根据另一张表删除、外键错误、删除前检查,以及 DELETE 与 TRUNCATE 的区别。
-
8.4
SQL 事务
10 分钟
SQL 事务把多条语句组合成一个整体:要么全部生效,要么全部不生效。学习 COMMIT、ROLLBACK、SAVEPOINT、自动提交和事务隔离级别。
9 数据定义语言 (DDL)
-
9.1
CREATE TABLE 语句
9 分钟
SQL CREATE TABLE 创建表。学习数据类型、PRIMARY KEY、AUTO_INCREMENT,以及 NOT NULL、UNIQUE、DEFAULT、CHECK 和 FOREIGN KEY 约束。
-
9.2
ALTER TABLE 语句
9 分钟
SQL ALTER TABLE 用于修改已有的表。学习在 MySQL 和 PostgreSQL 中添加、修改、重命名和删除列,以及添加或删除约束。
-
9.3
TRUNCATE 和 DROP TABLE 语句
6 分钟
SQL TRUNCATE 清空表,DROP TABLE 删除表。了解它们与 DELETE 在速度、回滚、自增计数器和外键方面的区别。
-
9.4
临时表
7 分钟
SQL 临时表在一个会话中保存中间结果。学习 CREATE TEMPORARY TABLE、AS SELECT、临时表与 CTE 的对比,以及 MySQL 中的陷阱。
-
9.5
视图
8 分钟
学习 SQL 视图:CREATE VIEW 语法、与普通表和临时表的区别、可更新性,以及基于 Sakila 的实用示例。
-
9.6
物化视图
9 分钟
物化视图把查询结果保存在磁盘上,并按需刷新。学习 CREATE 和 REFRESH MATERIALIZED VIEW,以及在 MySQL 中的替代方案。
-
9.7
数据库规范化
10 分钟
数据库规范化把数据拆分到相互关联的表中,让每个事实只存储一次。学习 1NF、2NF、3NF、BCNF、数据异常以及反规范化。
10 查询性能和质量
-
10.1
可读性和可维护性SQL代码的最佳实践
8 分钟
编写可读 SQL 的最佳实践:关键字大小写、换行与缩进、snake_case 命名、清晰的别名、注释,以及整理一条混乱的查询。
-
10.2
编写高效的 SQL 查询
10 分钟
高效的 SQL 查询能减轻服务器负载、加快报表生成。学习过滤、JOIN、SARGable 条件和 LIMIT 的实用技巧。
-
10.3
SQL 索引入门
10 分钟
了解什么是 SQL 索引、它如何影响 SELECT 的性能,以及哪些基本规则能帮你避免常见的查询速度问题。
-
10.4
如何阅读 EXPLAIN
12 分钟
逐步读懂 EXPLAIN 和 EXPLAIN ANALYZE:访问类型、连接顺序、cost 与 rows、估算与实际行数,以及慢 SQL 查询的信号。
-
10.5
B-tree 索引是如何工作的
11 分钟
了解 SQL 中 B-tree 索引的结构、它为何能把查找降到对数复杂度,以及如何在实际查询中使用它。
-
10.6
全文索引
10 分钟
全文索引按单词在文本中查找行,而 LIKE '%单词%' 需要读取整张表。学习 MySQL 的 MATCH AGAINST 和 PostgreSQL 的全文搜索。
11 数据转换和分析操作
-
11.1
SQL 中的实用字符串处理
10 分钟
学习 SQL 中的实用字符串处理:清理文本值、提取邮箱域名、构建标签以及校验数据质量。
-
11.2
日期和时间函数的实际应用
11 分钟
学习 SQL 日期时间函数的实际用法:构建每日和每月指标、计算时间间隔、发现季节性,并准备分析报表。
12 任务分析
-
12.1
最快的航班选项
6 分钟
SQL 题目解析:在 PostgreSQL 中通过 flights 表的自连接和时间间隔运算,找出只中转一次的最快航班。
-
12.2
计算航班的平均占用率
7 分钟
SQL 题目解析:在 PostgreSQL 中用 LEFT JOIN、COUNT FILTER 和两级聚合,按机场和舱位等级计算平均座位上座率。
-
12.3
飞机座位图
5 分钟
SQL 题目解析:用 rtrim 和 right 拆分座位号,再用 json_agg 把字母汇总成 JSON 数组,生成飞机座位图。
-
12.4
第 N 高的薪水
7 分钟
在 SQL 中查找第二高或第 N 高的薪水:MAX 加子查询、LIMIT OFFSET、DENSE_RANK、相关子查询,以及并列、NULL 结果和按部门求解。
-
12.5
查找和删除重复行
7 分钟
如何用 GROUP BY 和 HAVING 查找 SQL 中的重复行,用窗口函数列出每份副本,在保留一行的前提下删除重复数据,并防止再次出现重复。
-
12.6
每组前 N 行
7 分钟
在 SQL 中获取每组的前 N 行:ROW_NUMBER 配合 PARTITION BY,用 RANK 和 DENSE_RANK 处理并列,相关子查询,以及 LATERAL 连接,基于 Sakila 数据。
-
12.7
累计总和
6 分钟
用 SUM() OVER (ORDER BY) 在 SQL 中计算累计总和:按天累计收入、每年重新开始的累计值、ROWS 与 RANGE 的陷阱,以及不用窗口函数的解法。
-
12.8
间隙与岛屿
7 分钟
在 SQL 中解决间隙与岛屿问题:用 ROW_NUMBER 技巧把连续日期分组,用 LEAD 查找缺失区间,并求出每位客户最长的连续天数。
-
12.9
行转列(Pivot)
7 分钟
SQL 中的行转列:用 SUM(CASE ...) 做条件聚合、按月行转列、在 MySQL 中实现动态行转列、PIVOT 运算符以及列转行(unpivot)。