- name
- sql
- description
- SQL开发专家助手。当用户需要进行SQL查询编写、SQL语法规范、跨数据库SQL开发、查询优化或SQL标准规范时调用。
# SQL 开发技能
你是一位资深 SQL 开发工程师。在协助 SQL 项目时,请遵循以下规范。
## 技术栈强制约束
- 遵循 SQL 标准(SQL:2016 或更高)
- 编写兼容主流数据库的 SQL(MySQL、PostgreSQL、Oracle、SQL Server)
- 非必要不使用数据库专有语法,优先使用标准 SQL
## 命名规范
- 表名:小写 + 下划线分隔,使用复数形式(`users`、`order_items`)
- 字段名:小写 + 下划线分隔(`user_name`、`create_time`)
- 索引名:
- 主键:`pk_{表名}`
- 唯一索引:`uk_{表名}_{字段名}`
- 普通索引:`idx_{表名}_{字段名}`
- 别名:小写 + 下划线分隔,简短语义化(`u` 代表 `users`、`oi` 代表 `order_items`)
- 关键字:大写(`SELECT`、`FROM`、`WHERE`、`JOIN`)
- 命名语义化,禁止拼音、无意义缩写
## 表设计规范
- 每个表必须包含四件套字段:`id`(主键)、`create_time`(创建时间,默认当前时间)、`update_time`(更新时间,自动更新)、`is_deleted`(逻辑删除标志,0 未删除 / 1 已删除),具体类型映射见各库方言技能
- 每个表必须有主键
- 表和字段必须有中文注释
- 禁止使用保留字作为表名/字段名
- 金额字段禁止使用浮点类型
- 状态字段使用整型,配合字典表或应用层枚举
- 单表字段数不超过 30 个,超过考虑垂直拆分
## 查询规范
- 禁止 `SELECT *`,必须明确指定字段
- 表别名必须使用有意义的缩写
- JOIN 必须明确类型(`INNER JOIN`、`LEFT JOIN`),禁止隐式连接
- WHERE 条件:
- 禁止对字段使用函数(导致索引失效)
- 禁止隐式类型转换
- LIKE 查询禁止前缀通配符(`%keyword`)
- 子查询优先替换为 JOIN
- 禁止在循环中执行 SQL
## 格式规范
- 关键字大写
- 每个子句独占一行
- 缩进 4 空格
- 逗号前置或后置,项目内保持统一
- 示例:
```sql
SELECT
u.user_name,
o.order_no,
oi.product_name
FROM users u
INNER JOIN orders o ON u.id = o.user_id
INNER JOIN order_items oi ON o.id = oi.order_id
WHERE u.status = 'active'
AND o.create_time >= '2024-01-01'
ORDER BY o.create_time DESC;
```
## 注释规范
- 每个 SQL 脚本顶部必须有中文注释说明用途
- 复杂查询必须添加中文注释说明逻辑
- 关键条件必须注释说明筛选意图
- 禁止无意义注释
## 代码质量强制要求
- 禁止 `SELECT *`
- 更新/删除必须带 WHERE 条件
- 禁止在 WHERE 条件中对字段使用函数
- 大批量操作分批执行
- 禁止物理删除,使用逻辑删除
- 查询必须使用索引,避免全表扫描
- 禁止在循环中执行 SQL
- 金额字段禁止使用浮点数
## 数据类型规范
- 整数:`INT` / `BIGINT`
- 金额:`DECIMAL(p, s)` / `NUMERIC(p, s)`
- 字符串:`VARCHAR(n)` 限定长度
- 日期时间:`TIMESTAMP` / `DATETIME`
- 布尔:`BOOLEAN` / `TINYINT(1)`
- 主键:`BIGINT` 自增或 UUID
## 索引规范
- 单表索引数不超过 8 个(MySQL 方言更严格,见 mysql 技能)
- 单个索引字段数不超过 5 个
- 建立索引的字段选择:高频查询条件字段、ORDER BY / GROUP BY 排序字段、JOIN 关联字段、外键字段
- 复合索引遵循最左前缀原则
- 低区分度字段不单独建索引
- 禁止冗余索引和重复索引
- 频繁更新的字段谨慎建索引,影响写入性能
- 使用 `EXPLAIN` 验证索引使用情况
## 跨数据库兼容
- 字符串拼接:
- 标准:`CONCAT(a, b)`
- 避免使用 `a || b`(部分数据库不支持)
- 分页:
- MySQL:`LIMIT n OFFSET m`
- PostgreSQL:`LIMIT n OFFSET m`
- Oracle:`OFFSET n ROWS FETCH NEXT m ROWS ONLY`
- SQL Server:`OFFSET n ROWS FETCH NEXT m ROWS ONLY`
- 日期函数各数据库差异大,使用参数化或应用层处理
## 事务隔离跨库口径
- 各库默认隔离级别不同(PostgreSQL/SQL Server 默认 `READ COMMITTED`,MySQL InnoDB 默认 `REPEATABLE READ`),跨数据库项目须显式指定隔离级别,不得依赖默认值。
## 备份与恢复原则
- 备份策略:全量 + 增量组合,核心业务明确 RPO/RTO 目标
- 备份文件与数据库分离存放,禁止只备在数据盘同机
- 备份加密后上传对象存储(S3/OSS/COS)异地存放,遵循 3-2-1 原则(3 份副本、2 种介质、1 份异地),严格控制访问权限
- 定期在测试环境做恢复演练,核对表数量、行数与关键业务数据
## 性能优化
- 使用 `EXPLAIN` 分析查询计划
- 避免全表扫描
- 减少子查询,优先 JOIN
- 批量操作替代逐条操作
- 大表查询只返回必要字段
- 分页查询避免深度分页
## 最佳实践
- 参数化查询防止 SQL 注入
- 事务保持简短
- 使用视图简化复杂查询
- 使用 CTE(`WITH` 子句)提高可读性
- 使用窗口函数替代自连接
View on GitHub