🗄️ SQL 学习路线
146 个互动教程
SQL 入门教程 — 数据库查询语言
从零学习 SQL:了解数据库、写出第一个查询、掌握 SELECT/FROM/WHERE
SQL SELECT 查询数据
SQL SELECT 查询语句
SQL WHERE 条件筛选
SQL WHERE 条件筛选
SQL ORDER BY 排序
SQL ORDER BY 排序
SQL 插入与更新数据
SQL 数据增改:INSERT 与 UPDATE
SQL 字符串函数
学习 UPPER/LOWER/LENGTH/CONCAT/SUBSTR
SQL NULL处理
学习NULL
SQL LIMIT 分页
学习 LIMIT 和 OFFSET 分页
SQL DISTINCT 去重
学习 DISTINCT 和 COUNT DISTINCT
SQL BETWEEN 范围查询
学习 BETWEEN 和 NOT BETWEEN
SQL LIKE 模糊查询
学习 LIKE 和通配符 % _
SQL IN 操作符
学习 IN 和 NOT IN
SQL CREATE TABLE 建表语句完全指南
全面掌握SQL建表语法:数据类型选择、约束定义、主键外键、默认值、自增列、索引创建
SQL INSERT 插入数据
学习INSERT
SQL UPDATE/DELETE
学习修改删除
COALESCE空值处理
学习使用COALESCE函数将NULL替换为默认值,保障数据完整性。
SQL 聚合函数
SQL 聚合函数
SQL JOIN 多表联查
学习 INNER JOIN 连接多张表
SQL 创建表
SQL 创建表 CREATE TABLE
SQL 子查询
学习在 WHERE 中使用子查询
SQL CASE WHEN 条件表达式
学习 CASE WHEN 条件分支
SQL GROUP BY 分组统计
SQL GROUP BY 分组
SQL 事务处理
理解 ACID 和 BEGIN/COMMIT/ROLLBACK
SQL 约束 Constraints
学习 NOT NULL/UNIQUE/PRIMARY KEY/FOREIGN KEY
SQL 日期函数
学习日期和时间处理函数
SQL ALTER TABLE
学习修改表结构
SQL VIEW 视图
学习创建和使用视图
SQL 索引
学习创建索引加速查询
SQL UNION 合并
学习 UNION 和 UNION ALL
SQL 子查询进阶
学习 EXISTS/ANY/ALL 子查询
SQL 类型转换 CAST
学习CAST/CONVERT
SQL CTE 公用表表达式
学习WITH
SQL 窗口函数
学习OVER/PARTITION
SQL 数据透视
学习PIVOT
SQL 递归CTE
学习SQL中SQL 递归CTE — SQL教程的详细用法和最佳实践
SQL 事务隔离级别
学习SQL中SQL 事务隔离级别 — SQL教程的详细用法和最佳实践
SQL 可更新视图
学习视图更新
SQL 保存点
学习SAVEPOINT
SQL 索引实战
学习SQL中SQL 索引实战 — SQL教程的详细用法和最佳实践
SQL 备份与恢复
学习备份
SQL 聚合函数深入
学习聚合函数
NULLIF对比技巧
掌握NULLIF函数用于两值相等时返回NULL,避免除零错误。
LEAST与GREATEST函数
学习在多个值中快速取最小或最大值,简化条件逻辑。
CONCAT_WS字符串拼接
使用CONCAT_WS高效拼接字符串并自动处理分隔符与NULL。
GROUP_CONCAT聚合拼接
将分组内的多行值合并为一个字符串,常用于报表和列表生成。
SQL JOIN 详解
INNER/LEFT/RIGHT/FULL/CROSS JOIN 多表连接
FIND_IN_SET查找
在逗号分隔的字符串中检索特定值,处理简单列表查询。
SQL 索引优化
CREATE INDEX 加速查询,B-tree/唯一索引/复合索引
REGEXP正则匹配
利用正则表达式进行灵活的模式匹配,超越LIKE的限制。
DATE_ADD与DATE_SUB
对日期进行加减运算,轻松实现时间偏移。
TIMESTAMPDIFF时间差
精确计算两个日期之间的差值,单位灵活可选。
EXTRACT提取日期部分
从日期或时间中提取年、月、日、季度等独立部分。
SQL 数据库范式 — 1NF/2NF/3NF
数据库规范化:第一范式1NF(原子性)、第二范式2NF(消除部分依赖)、第三范式3NF(消除传递依赖)、反规范化的权衡、BCNF范式
SQL 物化视图
物化视图概念(将查询结果存储为物理表)、REFRESH MATERIALIZED VIEW刷新、与普通VIEW的区别、适用场景(报表/数据仓库)、不同数据库的实现差异
SQL 窗口函数进阶
SQL窗口函数进阶:FIRST_VALUE/LAST_VALUE/NTH_VALUE位置窗口、PERCENT_RANK/CUME_DIST分布窗口、窗口帧ROWS/RANGE/GROUPS精确控制、命名窗口WINDOW子句
SQL 递归查询实战模式
递归CTE实战:BOM物料清单爆炸、组织架构树、路径查找(地铁换乘)、图遍历、斐波那契数列、日期序列生成
SQL 锁与并发控制
SQL锁:共享锁(S)/排他锁(X)/意向锁(IS/IX)、乐观锁(version字段CAS)、悲观锁(SELECT FOR UPDATE)、死锁排查(SHOW ENGINE INNODB STATUS/LOCK WAIT依赖图)
SQL 集合运算
SQL集合运算:UNION去重合并/UNION ALL全合并不去重、INTERSECT交集、EXCEPT差集(MINUS在Oracle)、集合运算的列数和类型匹配规则、与JOIN的区别(行组合vs行追加)
SQL MERGE UPSERT 操作
SQL MERGE(UPSERT/INSERT OR UPDATE):MERGE INTO target USING source ON condition WHEN MATCHED THEN UPDATE WHEN NOT MATCHED THEN INSERT、不同数据库实现差异(MySQL INSERT...ON DUPLICATE KEY)、PostgreSQL INSERT...ON C
SQL JSON 函数
SQL JSON函数汇总:JSON_EXTRACT/JSON_VALUE/JSON_QUERY/JSON_MODIFY(SQL Server)、JSON_EXTRACT/->/->>/JSON_CONTAINS/JSON_ARRAY/JSON_OBJECT/JSON_TABLE(MySQL)、->/->>/@>/??/jsonb_set/jsonb_build_object(PostgreSQL)
SQL UPSERT 实现方式对比
SQL UPSERT操作(存在则更新/不存在则插入):MySQL INSERT...ON DUPLICATE KEY UPDATE、PostgreSQL/ SQLite INSERT...ON CONFLICT...DO UPDATE SET(UPSERT)、SQL Server/Oracle MERGE INTO、与先SELECT再判断的方案对比(原子性/竞态/性能)
LPAD与RPAD填充
使用指定字符在字符串左侧或右侧填充至固定长度,用于格式化输出。
SQL 生成列 Generated Columns
SQL生成列(虚拟列/计算列不求值/只在查询时计算或STORED物理存储):MySQL GENERATED ALWAYS AS (expression) VIRTUAL/ STORED(5.7+)、PostgreSQL GENERATED ALWAYS AS (expression) STORED(12+)、索引在STORED生成列上创建加速查询、SQLite GENERATED ALWAYS A
SQL 动态SQL与注入防御
动态SQL安全:构建动态SQL查询(拼接表名/列名/条件/排序)时如何防止SQL注入、白名单验证(表名列名/排序方向)、参数化查询的限制(不能参数化表名列名ORDER BY)、ORM安全使用(原生SQL和动态查询/不要直接拼接用户输入)、EXEC vs sp_executesql(SQL Server)、PREPARE/EXECUTE(MySQL/PostgreSQL)
SQL 时态表 Temporal Tables
SQL时态表/系统版本表System-Versioned Temporal Tables:SQL:2011标准、自动记录数据历史版本(valid from/valid to/PERIOD FOR SYSTEM_TIME)、FOR SYSTEM_TIME AS OF/ FROM...TO/BETWEEN...AND/ CONTAINED IN时间旅行查询、MariaDB/DB2/Oracle/SQL
SQL Graph 图查询
SQL图数据库查询:GRAPH_TABLE()图表函数、MATCH子句图模式匹配路径查询、NODE/EDGE表定义(SQL Server Graph/SAP HANA/Oracle Property Graph/PostgreSQL AGE扩展)、与Neo4j对比
CAST类型转换
在不同数据类型之间显式转换,确保计算和比较的正确性。
IFNULL判断
使用IFNULL快速替换NULL为指定值,简化条件表达式。
ROW_NUMBER排名
为结果集中的每一行分配唯一连续编号,常用于分页和去重。
RANK与DENSE_RANK
处理并列排名场景,理解RANK和DENSE_RANK的区别。
SQL ALTER TABLE 修改表结构
ALTER TABLE操作:ADD COLUMN添加列、MODIFY COLUMN修改列类型、DROP COLUMN删除列、ADD/DROP CONSTRAINT约束、RENAME TABLE重命名表
SQL 事务处理 — 保证数据一致性
事务ACID特性、START TRANSACTION/COMMIT/ROLLBACK、SAVEPOINT回滚点、自动提交模式、事务隔离级别(READ UNCOMMITTED/READ COMMITTED/REPEATABLE READ/SERIALIZABLE)
SQL窗口函数:强大的数据分析利器
学习使用ROW_NUMBER、RANK、SUM OVER等窗口函数进行高级数据分析
SQL CTE递归:处理树形与层次数据
使用公用表表达式(CTE)实现递归查询,轻松处理层级关系数据
SQL子查询详解
学习如何使用子查询在SELECT、FROM和WHERE子句中嵌套查询,实现更灵活的数据检索。
SQL窗口函数入门
学习使用ROW_NUMBER、RANK、SUM等窗口函数进行分组排名、滚动计算和移动平均。
查询代价建模:用SQL分析SQL
将查询执行计划转化为成本模型,利用元数据与统计信息进行量化分析。
窗口函数模式挖掘:时间序列中的拐点检测
利用LAG/LEAD与条件聚合在单次扫描中识别数据突变点。
带余数的关系除法:精确匹配与部分满足
使用分组计数与条件聚合实现关系除法,并计算匹配覆盖率。
递归CTE图属性:传递闭包与最短路径计数
用递归CTE计算有向图的传递闭包并统计路径数量。
动态透视:用JSONB聚合代替CASE列转行
利用JSONB对象构建任意列数的动态数据透视表。
半连接与反半连接:用EXISTS和NOT EXISTS优化子查询
深入理解半连接逻辑以及如何手动改写为高性能的JOIN。
范围类型与时间查询:连续区间合并与重叠检测
利用原生范围数据类型进行高效的时间段操作。
有序集聚合函数:百分位数、模式与假设分析
使用PERCENTILE_CONT、MODE和WITHIN GROUP进行高级统计分析。
生成列与约束联动:数据完整性自动保障
利用计算列与检查约束实现业务规则的自强制执行。
MERGE与UPSERT策略深度对比:并发与环境差异
比较MERGE、INSERT ON CONFLICT和NOT EXISTS三种更新插入方式的竞态条件。
窗口帧推理:用SQL分析时间序列中的因果滞后效应
深入讲解利用窗口函数与LAG/LEAD构建推理链,识别数据中隐藏的因果延迟关系,超越简单聚合。
多维汇总组合学:用GROUPING SETS发现交叉维度涌现模式
揭示GROUPING SETS的数学本质,利用组合维度聚合自动发现数据中隐藏的交互效应。
递归CTE中的环路处理:带状态记忆的有向图遍历
处理有环图中的路径追踪,使用深度优先搜索加路径检测避免无限循环。
JSON无模式透视:在动态键值对中执行关系代数
处理完全无固定模式的JSON数据,通过递归键提取和条件聚合实现动态列旋转。
超对数估计算法:用HyperLogLog实现毫秒级基数统计
在SQL中实现近似去重计数,理解HLL的原理与精度权衡。
双时态缓慢变化维度:同时追踪有效时间与事务时间
管理同时具有业务有效期和记录变更历史的数据,实现时间旅行查询。
SQL宏抽象语法树:在查询编译期注入自定义分析逻辑
利用数据库的宏或表达式变换能力,在查询计划生成前修改SQL逻辑。
空间KNN与维度诅咒:高维向量搜索的精度崩溃与解决方法
分析高维空间下欧氏距离失效现象,使用降维和近似索引。
字符串相似度连接:基于Trigram和编辑距离的模糊匹配引擎
在不等连接中应用模糊字符串匹配,处理拼写错误和变体。
范围类型与约束满足:用区间代数解决资源调度冲突
利用原生范围类型和重叠检测,自动发现或避免时间/空间冲突。
递归公共表表达式:生成组织架构树的深度查询
揭示 CTE 递归原理,用于查询树形结构的父子层级数据,适合血缘关系、分类树、报表展开等场景。
窗口函数帧子句精解:动态范围聚合与移动极值
超越 ROWS/RANGE/GROUPS 的区别,掌握帧边界对移动平均、累计求和、滑动中位数等复杂聚合的精确控制。
LATERAL JOIN:破解子查询无法引用同层列的困局
LATERAL 连接允许子查询引用 FROM 左侧表的列,是实现“每行关联复杂子查询”的最优雅方案。
MERGE 语句的 UPSERT 策略:增量同步与冲突消解
深入 MERGE 的 WHEN MATCHED / WHEN NOT MATCHED 分支,结合多条件匹配实现数据仓库增量合并。
JSON 路径与聚合函数:从文档碎片组装复杂报表
结合 JSON_QUERY / JSON_VALUE / JSON_OBJECTAGG 等函数,将关系表数据转为 JSON 嵌套结构并反向解析。
时间范围类型与重叠检测:事件区间的高效建模
利用 PostgreSQL 原生范围类型(daterange、tstzrange)和 GiST 索引实现高性能区间查询与重叠约束。
多列透视与逆透视:用 crosstab 函数重构购物篮数据
使用 tablefunc 扩展的 crosstab 函数实现动态列透视,解决标准 SQL PIVOT 语法缺失或不够灵活的痛点。
键集分页:告别 OFFSET 深分页的性能灾难
基于过滤条件的 keyset pagination(游标分页)实现毫秒级翻页,避免 OFFSET 在大数据量下的全表扫描。
物化视图的增量刷新策略与并发控制
利用物化视图缓存复杂聚合结果,并通过 REFRESH MATERIALIZED VIEW CONCURRENTLY 避免查询阻塞。
部分索引与过滤条件索引:为高频查询定制迷你索引
仅索引满足 WHERE 条件的行,大幅减小索引体积并提升 INSERT/UPDATE 性能,适用于软删除、状态筛选等场景。
SQL中的JSON路径表达式与虚拟列索引优化
深入讲解MySQL 8.0+的JSON路径表达式语法,结合虚拟列索引实现JSON文档的快速查询,避免全表扫描。
递归CTE实现有向无环图的拓扑排序与路径枚举
超越常见的斐波那契数列案例,使用递归公用表表达式(CTE)对DAG进行拓扑排序,并枚举所有从根节点到叶节点的路径。
窗口函数与生成序列实现时间序列数据缺失值填充
利用窗口函数配合递归CTE或数字序列表,自动补全时间序列中缺失的时间点,并向前或向后填充数值。
地理空间SQL:计算两点间球面距离与最近邻搜索
使用PostGIS或MySQL的GEOMETRY类型,计算经纬度点之间的真实球面距离(Great-circle distance),并利用空间索引实现K近邻查询。
动态行列转换:使用CROSSTAB与生成SQL实现任意透视表
超越简单的CASE WHEN静态透视,利用PostgreSQL的tablefunc扩展或动态SQL构造,实现列名不确定的行列转置。
使用位运算与位计数实现高效标签系统与权限管理
利用整型的位域存储多个布尔标签,通过位与、位或和BIT_COUNT进行组合查询,比关联表快数倍。
MERGE/UPSERT与变更数据捕获(CDC)模式实战
讲解MERGE语句的三种动作(INSERT/UPDATE/DELETE)结合OUTPUT子句,实现数据同步场景下的变更日志自动记录。
物化视图的增量更新策略:快照日志与刷新分组
深入Oracle和PostgreSQL的物化视图机制,使用快速刷新(fast refresh)和物化视图日志实现近乎实时的聚合数据更新。
强制查询计划:JOIN顺序与索引提示的攻防实战
当优化器选择错误计划时,使用查询提示(SQL Hint)强制指定JOIN顺序、索引选择、以及扫描方式,并分析cost与实际执行时间的差异。
应用时段表(Temporal Table)实现数据版本控制与回溯查询
利用SQL标准中的SYSTEM_TIME和APPLICATION_TIME功能(如MariaDB或SQL Server 2016+),自动维护数据的历史版本并支持AS OF查询。
窗口函数的时间旅行:用 LAG/LEAD 分析数据状态链
深入理解 LAG 和 LEAD 函数如何构建数据的时间序列分析,并利用窗口帧实现复杂的状态变化追踪。
递归CTE图遍历:社交网络中的最短路径与闭环检测
用递归公用表表达式(CTE)实现有向图的无环遍历、最短路径查找以及环形依赖检测。
动态列转行:打破PIVOT的静态局限与反模式
当行列转置的列名不固定时,如何使用纯SQL生成动态列并避免游标或临时表。
物化视图的智能刷新:增量维护与依赖链管理
摒弃全表刷新,用物化视图日志(MQT)实现增量合并,并解决级联物化视图的刷新顺序问题。
位图索引与位运算:在海量标签系统中实现闪电查询
用位图索引原理和SQL位运算(&、|、#)对千万级用户标签进行交集、并集、差集运算。
系统版本化时态表:像Git一样管理数据历史
利用SQL:2011标准中的时态表(SYSTEM_VERSIONED)实现数据自动版本追踪、闪回查询和时点恢复。
JSON模式验证与路径查询:在关系型数据库中处理半结构化数据
使用JSON Schema约束、JSON路径表达式和索引技术,在SQL中高效验证和检索复杂嵌套文档。
窗口帧排除子句:精准控制聚合范围中的边界值
利用EXCLUDE CURRENT ROW、EXCLUDE GROUP等帧排除选项,在移动平均及异常值分析中剔除干扰行。
管道表函数:用SQL实现流式ETL与异步数据生成
通过管道表函数(Oracle/PostgreSQL)实现数据的分批处理、状态保持和零内存溢出ETL。
假设索引:在不下发索引的情况下评估性能增益
利用数据库的假设索引(Hypothetical Index)功能预测创建索引后的执行计划,避免盲目建索引。
MERGE INTO:优雅的合并更新与插入
深入讲解SQL中的MERGE语句(也称为UPSERT),如何在单条语句中根据条件决定插入、更新或删除数据,避免重复操作。
LATERAL JOIN:在FROM子句中引用前表列
详解LATERAL连接(横向连接)如何允许子查询引用前面表的列,实现复杂的行级计算和JSON展开,远超普通JOIN的能力。
行转列与列转行:高级PIVOT/UNPIVOT实现
超越简单的CASE WHEN,掌握标准SQL的PIVOT和UNPIVOT操作,以及如何在MySQL/SQLite中模拟实现多列动态转换。
递归CTE:层级查询与图遍历
深入递归公用表表达式(RECURSIVE CTE),讲解如何处理树形结构(如组织架构)、血缘关系乃至有向图的无环遍历。
窗口函数帧子句:滑动的秘密
讲解窗口函数中ROWS/RANGE/GROUPS帧定义,如何控制滑动窗口实现移动平均、累计和、滚动排名等高级分析。
SQL中的JSON导航:提取、变换与聚合
现代数据库对JSON的原生支持,重点讲解JSON路径表达式、JSON_TABLE以及如何将文档内容高效地映射为关系数据。
读懂执行计划:发现慢查询的根源
教授如何获取和解释SQL执行计划(EXPLAIN ANALYZE),识别全表扫描、索引缺失、连接顺序错误等性能瓶颈。
时态表与系统版本化:追踪数据历史
介绍SQL:2011标准中的系统版本化时态表,自动记录每一行数据的变化历史,实现时间旅行查询而不需要手动审计日志。
集合运算符(EXCEPT/INTERSECT)的深度应用
超越UNION,讲解EXCEPT和INTERSECT在数据清洗、差异比较和权限交集分析中的巧妙用途,以及它们与ALL变体的区别。
约束排除与分区裁剪:智能扫描技术
深入数据库内部优化机制——约束排除(Constraint Exclusion)和分区裁剪(Partition Pruning),学习如何利用CHECK约束和表分区使查询只扫描必要的数据块。
LATERAL JOIN:在时间轴中逐行追溯状态变迁
利用 PostgreSQL 的 LATERAL 子查询,在对每行记录进行子查询时引用外层列,实现“针对当前行查询其前后状态”的闭环分析。
范围类型与重叠约束:用数据库原生语法管理时间段冲突
利用 PostgreSQL 的 range 类型(daterange, tsrange)及 @>、&& 操作符,确保排课、会议室预订等场景中时间段不重叠。
递归CTE + 环检测:在社交网络图中避免无限循环
使用递归 CTE 遍历有向图时,用数组或路径字符串检测环,防止递归无限膨胀。
CROSSTAB 透视表:将行转列并处理多列聚合
使用 tablefunc 扩展的 crosstab 函数,将分类汇总结果从行形式转为列形式,解决标准 SQL 无法动态列名的痛点。
窗口帧进阶:EXCLUDE 子句与滑动排除规则
PostgreSQL 14+ 窗口帧支持 EXCLUDE CURRENT ROW / GROUP / TIES,让移动平均、排名统计时可精准排除自身或同类。
JSONB 路径查询:用 SQL/JSON 路径表达式深挖嵌套文档
利用 PostgreSQL 的 jsonb_path_query 和 @@ 操作符,以类似 XPath 的语法从复杂 JSON 中提取满足条件的深层节点。
MERGE 条件更新:在 UPSERT 中根据数据新旧选择字段
使用 SQL MERGE 语句(PostgreSQL 15+)对源表和目标表匹配时,可对不同字段分别判断是否更新,实现细粒度合并。
多列关联子查询:用行值构造器解决复杂过滤
利用 SQL 的行值比较语法 (col1, col2) IN (subquery),避免多个 EXISTS 或 JOIN,实现基于组合键的高效过滤。
生成列与表达式索引:让计算字段自动推导且可索引
使用 GENERATED ALWAYS AS 创建虚拟/存储列,利用表达式索引加速 JSON 字段内数值、日期运算等常见过滤。
TABLESAMPLE 与统计采样:不扫描全表快速估算聚合
利用 TABLESAMPLE (BERNOULLI / SYSTEM) 随机采样行,结合聚合函数快速估算整个表的统计量,适合大数据预览。