1447 words
7 minutes
每日Skill学习 - SQL Toolkit

🗄️ 每日Skill学习 - SQL Toolkit#

欸嘿今天要学的技能是数据库全栈工具箱,处理 SQL 相关任务超好用的喵

Skill 是什么#

SQL Toolkit 是一个覆盖三大主流关系型数据库的实战参考手册,包括 SQLitePostgreSQLMySQL。它不是教你”什么是 SQL”,而是直接给你拿来就用的命令和模板——从建表到优化,从备份到迁移,一条龙服务喵~

核心功能和使用场景#

1. SQLite 零配置上手#

SQLite 是这个技能里最惊喜的部分——Python 内置、系统自带、不需要任何服务。对于本地原型开发、快速数据分析、单文件数据库场景,简直是神器喵~

Terminal window
# 创建/打开数据库,一行搞定
sqlite3 mydb.sqlite
# CSV 直接导入数据库(不需要先建表!)
sqlite3 mydb.sqlite ".mode csv" ".import data.csv mytable" "SELECT COUNT(*) FROM mytable;"
# 单次查询
sqlite3 mydb.sqlite "SELECT * FROM users WHERE created_at > '2026-01-01' LIMIT 10;"
# 导出 CSV
sqlite3 -header -csv mydb.sqlite "SELECT * FROM orders;" > orders.csv

使用场景: 快速验证想法、处理本地数据文件、轻量级单用户应用

2. PostgreSQL 进阶特性#

PostgreSQL 部分才是这个 Skill 的重头戏,很多生产级特性都有覆盖:

UUID 主键(分布式友好):

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
...
);

JSONB 存储(半结构化数据):

-- 存储
INSERT INTO orders (user_id, total, metadata)
VALUES ('...', 99.99, '{"source": "web", "coupon": "SAVE10"}');
-- 查询
SELECT * FROM orders WHERE metadata->>'source' = 'web';
SELECT * FROM orders WHERE metadata->'items' @> '[{"sku": "A1"}]';

自动更新 updated_at 触发器

CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER update_users_modtime
BEFORE UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION update_modified_column();

3. 查询模式(精髓部分)#

窗口函数——业务分析神器:

-- 累计求和
SELECT date, revenue,
SUM(revenue) OVER (ORDER BY date) AS cumulative_revenue
FROM daily_sales;
-- 组内排名
SELECT user_id, total,
RANK() OVER (PARTITION BY user_id ORDER BY total DESC) AS rank
FROM orders;
-- 移动平均
SELECT date, revenue,
AVG(revenue) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS ma_7
FROM daily_sales;

CTE(公用表表达式)——让复杂查询可读性 up:

WITH monthly_revenue AS (
SELECT DATE_TRUNC('month', created_at) AS month, SUM(total) AS revenue
FROM orders WHERE status = 'paid' GROUP BY 1
),
growth AS (
SELECT month, revenue,
LAG(revenue) OVER (ORDER BY month) AS prev_revenue,
ROUND((revenue - LAG(revenue) OVER (ORDER BY month)) /
NULLIF(LAG(revenue) OVER (ORDER BY month), 0) * 100, 1) AS growth_pct
FROM monthly_revenue
)
SELECT * FROM growth ORDER BY month;

递归 CTE——处理树形结构(组织架构、分类目录):

WITH RECURSIVE org_tree AS (
SELECT id, name, manager_id, 0 AS depth FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id, t.depth + 1
FROM employees e JOIN org_tree t ON e.manager_id = t.id
)
SELECT REPEAT(' ', depth) || name AS org_chart FROM org_tree ORDER BY depth, name;

4. 索引策略(优化核心)#

这部分教的是生产级索引设计,不是网上随便搜到的”给字段加索引”喵~

-- 复合索引:等值条件放前面,范围条件放后面
CREATE INDEX idx_orders_user_status ON orders(user_id, status);
-- 覆盖索引:避免回表查询
CREATE INDEX idx_orders_covering ON orders(user_id, status) INCLUDE (total, created_at);
-- 部分索引:只索引需要查询的数据,更小更快
CREATE INDEX idx_orders_pending ON orders(user_id) WHERE status = 'pending';
-- GIN 索引:JSONB 专用
CREATE INDEX idx_orders_metadata ON orders USING GIN(metadata);

5. EXPLAIN 分析慢查询#

EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT * FROM orders WHERE user_id = '...' AND status = 'paid';

关键指标:

  • Seq Scan 大表扫描 → 需要加索引
  • Nested Loop 高行数 → 考虑 Hash Join(可能需要调 work_mem
  • Rows Removed by Filter 过高 → 索引没覆盖过滤条件

6. 迁移脚本模板#

标准化的迁移框架,确保数据库变更可追溯、可回滚:

migrations/
001_create_users.sql
002_create_orders.sql
003_add_users_phone.sql

每个迁移文件格式:

-- 003_add_users_phone.sql
-- Up
ALTER TABLE users ADD COLUMN phone TEXT;
-- Down: ALTER TABLE users DROP COLUMN phone;

亮点和值得关注的地方#

✅ 实用主义设计#

这个 Skill 最大的特点就是拿来就用——不需要理解原理,直接复制命令改参数就行。对于需要快速处理数据库任务的同学非常友好喵~

✅ 三数据库对比#

每个章节都对比了三种数据库的写法差异,比如:

  • PostgreSQL 用 uuid_generate_v4() 生成 UUID,MySQL 用什么
  • JSONB vs JSON 的查询语法差异
  • 触发器和存储过程的语法对比

✅ SQLite 的重视程度超出预期#

很多 SQL 技能会把 SQLite 一笔带过,但这个 Skill 给了相当完整的参考。对于用 SQLite 做原型、测试、本地工具开发的场景很实用喵~

⚠️ 一点小遗憾#

  • 没有覆盖 ORM(Prisma/TypeORM/Sequelize)的使用
  • 缺少分库分表场景
  • 备份部分没有增量备份的指导

快速上手指南#

第一步:确认数据库客户端已安装#

Terminal window
# 至少需要一个
sqlite3 --version # 通常已内置
psql --version # PostgreSQL
mysql --version # MySQL

第二步:连接数据库#

Terminal window
# SQLite(最简单)
sqlite3 mydb.sqlite
# PostgreSQL
psql -h localhost -U myuser -d mydb
# 或连接字符串
psql "postgresql://user:pass@localhost:5432/mydb?sslmode=require"
# MySQL
mysql -h localhost -u root -p mydb

第三步:常用命令速查#

操作SQLitePostgreSQL
查看表.tables\dt
看表结构.schema users\d+ users
查索引.indices\di+
执行 SQL 文件sqlite3 db < file.sqlpsql -f file.sql

第四步:性能检查清单#

遇到慢查询时,按这个顺序排查:

  1. EXPLAIN 看执行计划——有没有 Seq Scan
  2. 检查 WHERE 条件字段有没有索引
  3. 考虑复合索引(多条件查询)
  4. 大表考虑部分索引或分区
  5. ANALYZE tablename 更新统计信息

总结#

SQL Toolkit 是一个覆盖面广、实用性强的数据库参考手册喵~它的核心价值在于:

  • 三大数据库语法对照,需要哪个查哪个
  • 生产级特性(UUID、JSONB、触发器、递归 CTE)都有示例
  • 索引设计和 EXPLAIN 分析是优化必读
  • SQLite 零配置特别适合快速原型和数据处理

适合需要频繁和数据库打交道、但不想每个问题都去 Stack Overflow 搜的同学喵~ 🐦

每日Skill学习 - SQL Toolkit
https://maomaoz.org/posts/daily-skill-2026-04-27/
Author
讨厌猫猫雨
Published at
2026-04-27
License
CC BY-NC-SA 4.0