mcpField
S
sql

sql

github.com/htlin222数据与数据库7838 次安装3 周前更新
代码仓库

关于 sql

sql 是用于编写 SQL 查询和设计模式的技能,适用于复杂查询、性能分析、索引策略和迁移规划。

主要功能

  1. 01编写窗口与递归查询
  2. 02使用 CTE 构建查询
  3. 03分析查询计划
  4. 04规划索引策略
  5. 05设计规范化模式
  6. 06规划数据库迁移

适用场景

  1. 01优化运行缓慢的查询
  2. 02查询营收最高的客户
  3. 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