统一知识骨架
所有数据库按相同的十一个公共维度讲解:定位与家族、核心实体、查询能力、事务与一致性、索引与搜索、JSON 支持、扩展复制分片、高可用部署、安全权限模型、连接串与驱动生态。
22 款可本地运行的数据库 · 浏览器实验 · Docker 验证证据 · 横向选型指南
前 5 个为高频使用场景的代表性产品,其余 17 款可在导航栏「更多」下拉中查看完整列表。
| 数据库 | 类型 | 核心价值 | 快速开始 |
|---|---|---|---|
| PostgreSQL 🦄 | SQL 关系型 | 功能最全面、ACID 标准实现、扩展丰富 | 查看详情 → |
| MySQL ❤️ | SQL 关系型 | Web 应用事实标准、性能优秀、生态成熟 | 查看详情 → |
| DuckDB 🦆 | 分析型 | MPP 列式存储、嵌入式分析、SQL 兼容性强 | 查看详情 → |
| MongoDB 🧬 | NoSQL 文档 | JSON 文档模型、横向扩展能力强、开发友好 | 查看详情 → |
| Redis 🚀 | NoSQL KV | 内存高性能、多种数据结构、持久化策略 | 查看详情 → |
包括 Oracle、MariaDB、SQLite、SQL Server、ClickHouse、TiDB、CockroachDB、CouchDB、Valkey、Cassandra、ScyllaDB、Elasticsearch、OpenSearch、Neo4j、InfluxDB、TimescaleDB 等可自托管、嵌入式或浏览器本地运行的产品
SQLite、DuckDB、PGlite、SurrealDB 在线编辑器实时试写 SQL,查看执行计划与结果集
IndexedDB 原理与实践、OPFS 存储配额、离线优先架构与本地同步机制
各数据库在核心功能上的支持方式不同——「关系型」不等于「只能存表格」,「NoSQL」也不等于「没有 ACID」。
| 能力 | PostgreSQL | MySQL | DuckDB | MongoDB | Redis |
|---|---|---|---|---|---|
| ACID 事务 | ✅ 完整支持 | ✅ 完整支持 (InnoDB) | ❌ 无事务 | ✅ 单文档原子性 | ⚠️ 多命令原子性 (MULTI/EXEC) |
| JSON 支持 | ✅ jsonb + GIN | ✅ JSON + 全文索引 | ⚠️ 简单解析 | ✅ 原生 BSON | ❌ 需字符串序列化 |
| 行级锁 | ✅ ROW LEVEL SECURITY | ⚠️ 应用层实现 | ❌ 无 | ❌ 无 | ❌ 无 |
| 分区表 | ✅ 声明式分区 | ⚠️ 分区仅用于分区表 | ❌ 无 | ❌ 无 | ❌ 无 |
| 物化视图 | ✅ 原生支持 | ❌ 需外部插件 | ✅ 自动缓存 | ❌ 无 | ❌ 无 |
| 流式复制 | ✅ WAL 流复制 | ✅ Binlog 流复制 | ❌ 不适用 | ✅ Replica Set | ✅ Master-Slave |
| WASM 版本 | ❌ PGlite 实验 | ❌ 无 | ✅ DuckDB-Wasm | ✅ MongoDB Atlas Wasm | ❌ 无 |
完整选型建议见 数据库对比矩阵。
以下数据库可直接在浏览器中运行,无需安装任何软件:
适合目标读者:全栈开发者、前端工程师、数据库初学者、技术爱好者。
如果你是数据库新手,建议按以下顺序学习:
/#sql-query) —— SELECT、WHERE、ORDER BY/#sql-joins) —— GROUP BY、INNER/LEFT JOIN/#sql-advanced-query) —— WITH、ROW_NUMBER、RANK/#sql-schema) —— CREATE TABLE、PRIMARY KEY、FOREIGN KEY/#sql-transactions) —— BEGIN、COMMIT、ISOLATION LEVEL/#sql-indexes-explain) —— B-Tree、HASH、EXPLAIN ANALYZE适合目标读者:希望系统掌握 SQL 语法的开发者。
git clone https://github.com/xy2401/hello-sql.git && cd hello-sql
npm install
npm run docs:dev # 默认 http://127.0.0.1:5173,以终端输出为准以上命令在 hello-sql 仓库根目录执行。环境要求:Node.js 20.19+(20.x)或22.16+,与 package.json 的 engines 一致。按 Ctrl+C 停止开发服务。浏览器需支持本页所用的 WebAssembly 和存储 API。
可以从 WASM 数据库实验台 直接开始运行示例。
理解 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT 的逻辑顺序,比背书写顺序更重要。列别名通常不能直接在 WHERE 使用,就是因为过滤发生在投影之前。
NULL 表示未知或缺失。比较需要 IS NULL,布尔表达式采用三值逻辑。NOT IN 子查询一旦包含 NULL,常产生意外结果;存在性判断优先考虑 EXISTS。
SELECT title, category, score
FROM lessons
WHERE score >= 90
ORDER BY score DESC
LIMIT 10;💡 在线运行:可在 SQLite 在线工作台 直接执行并观察此 SQL 的结果集。
每一行代表什么,是写聚合查询前必须回答的问题。GROUP BY 决定结果粒度;JOIN 前若两边都不是唯一键,行数可能乘法增长。
INNER JOIN 保留匹配组合。LEFT JOIN 保留左侧粒度,右侧缺失补 NULL。EXISTS,反连接通常用 NOT EXISTS。CREATE TABLE IF NOT EXISTS enrollments (
lesson_id INTEGER,
learner TEXT,
completed INTEGER
);
DELETE FROM enrollments;
INSERT INTO enrollments VALUES (1, 'Alice', 1), (2, 'Alice', 1), (3, 'Bob', 0);
SELECT l.category,
COUNT(e.learner) AS enrollments,
SUM(CASE WHEN e.completed = 1 THEN 1 ELSE 0 END) AS completed
FROM lessons AS l
LEFT JOIN enrollments AS e ON e.lesson_id = l.id
GROUP BY l.category
ORDER BY enrollments DESC;💡 在线运行:可在 SQLite 在线工作台 体验多表连接与条件聚合。
CTE 给复杂查询命名,但它是否物化取决于数据库和提示。窗口函数不会像 GROUP BY 那样折叠行,而是在分区内计算排名、累计、移动平均和前后值。
PARTITION BY 决定分组,ORDER BY 决定窗口顺序,Frame 决定当前行看到的范围。默认 Frame 在有重复排序键时可能不是“截至当前物理行”,应显式理解 ROWS 与 RANGE。
WITH ranked AS (
SELECT title, category, score,
DENSE_RANK() OVER (
PARTITION BY category
ORDER BY score DESC
) AS category_rank
FROM lessons
)
SELECT * FROM ranked
ORDER BY category, category_rank;💡 在线运行:可在 SQLite 在线工作台 执行窗口排名查询。
Schema 不只是存储布局,也是数据契约。NOT NULL、CHECK、UNIQUE、外键和正确的数据类型,应尽量在数据库边界表达。
CREATE TABLE IF NOT EXISTS learners (
id INTEGER PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
display_name TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
);
INSERT OR IGNORE INTO learners(id, email, display_name)
VALUES (1, 'alice@example.com', 'Alice');
SELECT * FROM learners;💡 在线运行:可在 SQLite 在线工作台 验证 DDL 与唯一约束。
事务把一组读写变成一个失败边界。ACID 并不意味着所有并发异常自动消失;隔离级别、锁粒度、MVCC 快照和业务重试共同决定可见行为。
BEGIN;
UPDATE lessons SET score = score + 1 WHERE category = 'SQL 基础';
SELECT title, score FROM lessons WHERE category = 'SQL 基础';
ROLLBACK;
SELECT title, score FROM lessons WHERE category = 'SQL 基础';💡 在线运行:可在 SQLite 在线工作台 验证事务原子回滚。
索引是额外维护的数据结构,用写入、存储和缓存换取特定访问路径。组合索引的列顺序应服务过滤、连接和排序,而不是按字段“重要程度”排列。
CREATE INDEX IF NOT EXISTS idx_lessons_category_score
ON lessons(category, score DESC);
EXPLAIN QUERY PLAN
SELECT title, score
FROM lessons
WHERE category = 'SQL 基础'
ORDER BY score DESC;💡 在线运行:可在 SQLite 在线工作台 查看执行计划与索引命中。