关于 sql
sql 是用于编写 SQL 查询和设计模式的技能,适用于复杂查询、性能分析、索引策略和迁移规划。
主要功能
- 01编写窗口与递归查询
- 02使用 CTE 构建查询
- 03分析查询计划
- 04规划索引策略
- 05设计规范化模式
- 06规划数据库迁移
适用场景
- 01优化运行缓慢的查询
- 02查询营收最高的客户
- 03设计数据库模式
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ htlin222/ dotfiles --skill sql安装后在 Claude Code 中输入/sql确认已加载。
详细介绍
SQL 开发
编写高效的 SQL 查询并设计架构。
适用场景
- 编写复杂查询
- 查询优化
- 架构设计
- 索引策略
- 迁移规划
查询模式
窗口函数
-- Running totals
SELECT
date,
amount,
SUM(amount) OVER (ORDER BY date) as running_total,
AVG(amount) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) as moving_avg_7d
FROM transactions;
-- Ranking
SELECT
name,
score,
RANK() OVER (ORDER BY score DESC) as rank,
DENSE_RANK() OVER (ORDER BY score DESC) as dense_rank,
ROW_NUMBER() OVER (ORDER BY score DESC) as row_num
FROM players;
-- Partition by category
SELECT
category,
product,
sales,
sales * 100.0 / SUM(sales) OVER (PARTITION BY category) as pct_of_category
FROM products;
CTE(公用表表达式)
WITH
monthly_sales AS (
SELECT
DATE_TRUNC('month', order_date) as month,
SUM(amount) as total
FROM orders
GROUP BY 1
),
growth AS (
SELECT
month,
total,
LAG(total) OVER (ORDER BY month) as prev_month,
(total - LAG(total) OVER (ORDER BY month)) / NULLIF(LAG(total) OVER (ORDER BY month), 0) * 100 as growth_pct
FROM monthly_sales
)
SELECT * FROM growth WHERE growth_pct < 0;
递归 CTE
-- Hierarchical data (org chart, categories)
WITH RECURSIVE subordinates AS (
SELECT id, name, manager_id, 1 as level
FROM employees
WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id, s.level + 1
FROM employees e
JOIN subordinates s ON e.manager_id = s.id
)
SELECT * FROM subordinates ORDER BY level, name;
查询优化
索引策略
-- Composite index for common queries
CREATE INDEX idx_orders_user_date ON orders(user_id, order_date DESC);
-- Partial index for filtered queries
CREATE INDEX idx_active_users ON users(email) WHERE status = 'active';
-- Check query plan
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 123;
常见问题
| 问题 | 症状 | 解决方案 |
|---|---|---|
| 缺少索引 | 顺序扫描 | 添加合适的索引 |
| N+1 查询 | 多次小型查询 | 使用 JOIN 或批处理 |
| SELECT * | 速度慢且占用内存 | 仅选择所需列 |
| 没有 LIMIT | 结果集过大 | 添加分页 |
| 列上使用函数 | 未使用索引 | 重写条件 |
架构设计
-- Normalized schema
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
total DECIMAL(10,2) NOT NULL,
status VARCHAR(20) DEFAULT 'pending',
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_orders_user ON orders(user_id);
CREATE INDEX idx_orders_status ON orders(status) WHERE status != 'completed';
示例
输入:“优化这个慢查询” **操作:**运行 EXPLAIN,找出瓶颈,添加索引或重写查询
输入:“获取收入最高的前 10 位客户” **操作:**编写包含适当连接、排序和限制的聚合查询
评论
支持 Markdown