09 AI 写 SQL:把需求描述丢进去,生产级SQL就出来了
摘要本文分享了作者作为十年经验后端开发者如何利用AI工具如Cursor高效处理SQL相关工作的实战经验。文章通过四个典型场景——业务需求翻译为SQL、慢查询优化、复杂统计报表编写、SQL与ORM代码互转——展示了AI在SQL编写中“更快、bug更少”的优势并提供了具体的操作示例和优化建议旨在帮助开发者将AI融入日常SQL工作流提升开发效率。先交代一下背景作为一个后端开发我写了十年 SQL。从大学里最简单的SELECT * FROM users到后来业务上需要跨 6 张表的关联查询、多层子查询、窗口函数我自认为 SQL 功底不差。但我还是被 AI 写 SQL 的能力惊到了。不是因为 AI 能写 SQL——它当然能写写。但真正让我改观的是它写的 SQL 比我更快而且 bug 更少。就说上周的事。产品经理给我一个需求统计过去 30 天每个品类下、销量前 10 的商品还要带上库存信息。放以前我得想半天怎么写这个排名加过滤的功能。用窗口函数RANK()还是用子查询 LIMIT怎么写性能才不崩这次我直接打开 Cursor把需求用中文打进去了。AI 三十秒给我方案。我看了一眼加了一句索引提示跑了一下数据对了。全程不到五分钟。今天把这套「AI 写 SQL」的实战技巧写出来分四个场景你遇到哪个直接套用。场景一把业务需求翻译成 SQL这是最日常的场景。产品经理或者运营人员过来说「我要看一个数据」然后你开始想怎么查。正确做法把需求原样告诉 AI让 AI 帮你写 SQL。需求查询过去 7 天每个品类的下单用户数、订单总数、总金额 按金额降序排列。数据库MySQL 8.0。表结构如下 orders (id, user_id, category_id, amount, status, created_at) categories (id, name) status 字段取值0-待支付, 1-已支付, 2-已取消 只统计已支付的订单AI 秒回SELECT c.name AS category_name, COUNT(DISTINCT o.user_id) AS user_count, COUNT(o.id) AS order_count, SUM(o.amount) AS total_amount FROM orders o JOIN categories c ON o.category_id c.id WHERE o.status 1 AND o.created_at CURDATE() - INTERVAL 7 DAY GROUP BY c.id, c.name ORDER BY total_amount DESC;干净、正确、带 GROUP BY 所有非聚合字段符合 ONLYFULLGROUP_BY。我自己手写也就这样了。但 AI 还能做更多——你可以继续问优化一下这个 SQL订单表数据量大概 500 万条AI 会给优化建议建议在 orders 表加联合索引idx_status_created_at_category (status, created_at, category_id) 可以把统计逻辑改成先过滤再 JOIN减少 JOIN 数据量 SELECT c.name, ... FROM ( SELECT category_id, COUNT(DISTINCT user_id) AS user_count, COUNT(id) AS order_count, SUM(amount) AS total_amount FROM orders WHERE status 1 AND created_at CURDATE() - INTERVAL 7 DAY GROUP BY category_id ) o JOIN categories c ON o.category_id c.id ORDER BY total_amount DESC;连索引建议都给你了。你只需要评估一下是否适合你的业务场景然后执行就行。场景二优化慢查询你线上有一个 SQL 跑了 5 秒需要优化。以前的做法EXPLAIN看一下 → 看 extra 字段 → 猜索引怎么加 → 试一次 → EXPLAIN 再看 → 循环。现在你可以直接贴给 AI这条 SQL 在 200 万数据的表上跑了 3.2 秒帮我优化 SELECT u., o.order_count, o.total_amount FROM users u LEFT JOIN ( SELECT user_id, COUNT() as order_count, SUM(amount) as total_amount FROM orders WHERE created_at 2026-06-01 GROUP BY user_id ) o ON u.id o.user_id WHERE u.status 1 ORDER BY o.total_amount DESC NULLS LAST LIMIT 20;AI 分析后告诉你问题分析 1. 子查询扫描全表即使 created_at 有索引也只减少扫描范围 2. ORDER BY total_amount DESC 无法用索引排序造成 filesort 3. LEFT JOIN 后 LIMIT 20但子查询还是全量计算 优化方案 改写为 JOIN 索引加持 SELECT u., o.order_count, o.total_amount FROM users u JOIN orders o2 ON u.id o2.user_id JOIN ( SELECT user_id, COUNT() as order_count, SUM(amount) as total_amount FROM orders WHERE created_at 2026-06-01 GROUP BY user_id ) o ON u.id o.user_id WHERE u.status 1 ORDER BY o.total_amount DESC LIMIT 20; 推荐索引orders(created_at, user_id, amount)AI 不仅分析了问题还给出了索引建议和改写方案。你自己来EXPLAIN 看三次、改两版没 20 分钟搞不定。场景三写复杂统计报表运营要一个「每个月新增用户数按渠道分组再算环比增长」。你想到窗口函数LAG()或者子查询。直接告诉 AIMySQL 8.0。按月统计 2026 年每个渠道的新增用户数并计算环比增长率。 表结构users(id, channel, created_at, status) 环比公式(本月 - 上月) / 上月 * 100% 只统计 status 1 的用户 按月分组的空月份不需要补零AI 给出WITH monthly AS ( SELECT DATE_FORMAT(created_at, %Y-%m) AS month, channel, COUNT(*) AS new_users FROM users WHERE status 1 AND created_at 2026-01-01 AND created_at 2027-01-01 GROUP BY month, channel ) SELECT month, channel, new_users, LAG(new_users) OVER (PARTITION BY channel ORDER BY month) AS prev_month, ROUND( (new_users - LAG(new_users) OVER (PARTITION BY channel ORDER BY month)) / LAG(new_users) OVER (PARTITION BY channel ORDER BY month) * 100, 2 ) AS growth_rate FROM monthly ORDER BY channel, month;CTE 窗口函数写得比我手敲还顺。环比增长率四舍五入了两位小数空值处理也到位了——第一个月没有上月数据prevmonth 自然为 NULLgrowthrate 也为 NULL逻辑上完全正确。场景四把 SQL 翻译成 ORM 代码项目用了 MyBatis Plus但你写好了原生 SQL。想把它转成 MP 的 LambdaQueryWrapper把这个 SQL 转成 MyBatis Plus 的 LambdaQueryWrapper SELECT id, name, email, created_at FROM users WHERE status 1 AND created_at 2026-06-01 AND (name LIKE CONCAT(%, 张, %) OR email LIKE CONCAT(%, 张, %)) ORDER BY created_at DESC LIMIT 20;AI 给出LambdaQueryWrapperUser wrapper new LambdaQueryWrapperUser() .eq(User::getStatus, 1) .ge(User::getCreatedAt, LocalDate.of(2026, 6, 1).atStartOfDay()) .and(w - w.like(User::getName, 张).or().like(User::getEmail, 张)) .orderByDesc(User::getCreatedAt) .last(LIMIT 20); ListUser users userMapper.selectList(wrapper);and()嵌套条件、.last(LIMIT 20)透传、日期处理——全都对。你甚至不需要知道 MyBatis Plus 的这个 API 叫什么。你也可以反过来把已有的 ORM 查询转成原生 SQL方便 DBA 审查。总结AI 写 SQL 这件事已经不只是「能写」的阶段了。它到了比大多数开发写得快、写得好的阶段。四个场景覆盖了日常 80% 的 SQL 需求1.需求翻译→ 把业务需求直接描述AI 给 SQL最适合日常2.慢查询优化→ 贴 EXPLAIN SQLAI 分析问题 给索引建议3.复杂报表→ 窗口函数 CTE手写半小时的 AI 三十秒搞定4.ORM 互转→ SQL ↔ MyBatis Plus/JPA/MPP 一键互转下次产品经理提数据需求别自己手写了。把需求描述打给 AI它在写 SQL 的时候你还可以再喝口水。下一篇预告Spring Boot 大模型——Java 项目接入 AI 的三种姿势私信回复「666」一次性领走面试宝典Java 高频考点速查表、HashMap/ConcurrentHashMap 源码笔记、JVM 调优案例、Spring Boot 面试 50 问AI 编程工具箱Cursor/Copilot/Codex 六工具对比表、10 个 Prompt 模板、Debug 万能公式、Cursor 速查手册、AI 图片生成入门、30 效率工具包一份资料包两个专栏都能用。「唠点键盘之外的」只讲干货。

相关新闻

Talisman API参考手册:所有函数与方法的详细说明

Talisman API参考手册:所有函数与方法的详细说明

Talisman API参考手册:所有函数与方法的详细说明 【免费下载链接】talisman Straightforward fuzzy matching, information retrieval and NLP building blocks for JavaScript. 项目地址: https://gitcode.com/gh_mirrors/tal/talisman 📖 Talis…

2026/10/14 19:41:01 阅读更多 →
rtsp-stream黑名单机制:如何防止恶意请求与资源保护

rtsp-stream黑名单机制:如何防止恶意请求与资源保护

rtsp-stream黑名单机制:如何防止恶意请求与资源保护 【免费下载链接】rtsp-stream Out of box solution for RTSP - HLS live stream transcoding. Makes RTSP easy to play in browsers. 项目地址: https://gitcode.com/gh_mirrors/rt/rtsp-stream 在RTSP流…

2026/10/10 2:14:17 阅读更多 →
实战idevicerestore:突破iOS固件恢复的技术边界

实战idevicerestore:突破iOS固件恢复的技术边界

实战idevicerestore:突破iOS固件恢复的技术边界 【免费下载链接】idevicerestore Restore/upgrade firmware of iOS devices 项目地址: https://gitcode.com/gh_mirrors/id/idevicerestore 当iOS设备陷入白苹果循环,当测试环境需要特定固件版本&a…

2026/10/14 17:51:49 阅读更多 →

最新新闻

iso8211lib解析S-57电子海图:从二进制格式到坐标提取指南

iso8211lib解析S-57电子海图:从二进制格式到坐标提取指南

简介:ISO8211lib是一套解析和生成ISO 8211标准数据文件的C库,主要面向GIS、地球科学、遥感与测绘领域的开发者和数据专业人员,解决不同系统间多元地理数据交换与集成的读取、写入和操作问题。ISO 8211标准定义了地质、气候、地形等数据的组织…

2026/10/14 19:40:51 阅读更多 →
Qwen3-Omni全模态模型RL后训练实战:VeRL-Omni的GSPO/DAPO/DPO训练配方完整解析

Qwen3-Omni全模态模型RL后训练实战:VeRL-Omni的GSPO/DAPO/DPO训练配方完整解析

【免费下载链接】verl-omni Multimodal RL training framework for diffusion & omni models 项目地址: https://gitcode.com/gh_mirrors/ve/verl-omni 点击查看 免费下载 本文带你用 VeRL-Omni 多模态强化学习训练框架,对 Qwen3-Omni 全模态模型进…

2026/10/14 19:40:51 阅读更多 →
自动驾驶与具身智能通吃模型:架构、数据与部署实战

自动驾驶与具身智能通吃模型:架构、数据与部署实战

1. 从两个场景说起:为什么大家开始琢磨“一套模型通吃”自动驾驶和具身智能,表面上看是两个赛道,但如果你真正在一线做过感知、规划或者机械臂控制,就会发现它们最近一年在技术路线上越来越像。自动驾驶那边,端到端方案…

2026/10/14 19:40:51 阅读更多 →
Lua脚本驱动消息队列:热更新路由与性能调优实战

Lua脚本驱动消息队列:热更新路由与性能调优实战

1. 为什么要在消息队列里嵌入Lua脚本引擎第一次接触“用Lua脚本驱动消息队列”这个思路,是在一个需要频繁调整消息路由规则的场景里。当时业务方几乎每周都要改一次消息分发逻辑——今天要把订单消息同时推给风控和报表两个服务,明天又要求根据订单金额分…

2026/10/14 19:40:51 阅读更多 →
0胶水不等于0甲醛、无甲醛,家用环保床垫怎么选?为什么高环保可拆洗静音床垫更值得推荐?

0胶水不等于0甲醛、无甲醛,家用环保床垫怎么选?为什么高环保可拆洗静音床垫更值得推荐?

在居家软装中,床垫是陪伴我们每日时长最久的家具,其环保安全性与睡眠体验,直接影响全家人的居住品质。大多数消费者选购床垫时,最纠结、最关心的核心问题集中在三点:床垫是否存在甲醛隐患、使用过程是否会产生异味、夜…

2026/10/14 19:40:51 阅读更多 →
Andersen Consulting携手TalentSmartEQ,推动领导力发展与业务转型

Andersen Consulting携手TalentSmartEQ,推动领导力发展与业务转型

Andersen Consulting与TalentSmartEQ签署合作协议,拓展其人力资本服务能力。TalentSmartEQ总部位于圣迭戈,专注于情商(EQ)与领导力发展,致力于打造实用、生动且便于学以致用的学习体验。 二十多年来,Talen…

2026/10/14 19:39:50 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →