【数据库】AI 写查询(SQL)不求人

摘要:用 AI 帮你写出能直接跑的 SQL 查询,告别手写报错。

一、痛点引入

你有没有过这种时候:手头有一张 Access 或 Excel 里的业务表,老板随口问一句"去年每个销售员卖了多少、哪个部门最猛",你心里一咯噔——这要用 SQL(Structured Query Language,结构化查询语言;简单说就是一套"跟数据库对话"的标准语言,你告诉它要什么,它把结果还给你)才查得出来,可自己手写总是报错:少个逗号、拼错表名、两表一关联就出来几万行……

其实你不是不会想,只是不想跟语法死磕。现在有了 AI(咱们这次用网页版 Copilot:浏览器打开 copilot.microsoft.com 即可,无需安装;用 Kimi/智谱清言(GLM)也一样,把提示词原样贴过去即可),你只要用大白话把"想要什么"说清楚,它就能帮你吐出一段能直接跑的查询(query,就是一次"提问",比如"把销售部的人列出来")。本文就带你实战一遍。

二、目标产出

学完这篇,咱们能搞定这几件事:

  • 用 Copilot 写出四种最常用、也最实用的 SQL 查询:SELECT(选列)、WHERE(加条件)、JOIN(两表关联)、GROUP BY(分组汇总);
  • 看得懂 AI 给的 SQL 哪块对应你的哪句需求,不至于"它给了我就信,跑错也不知道为啥";
  • 拿到一段 AI 写的 SQL,能先在小数据上验证、再上真实库,避开最常见的几个坑。

下面全程用一套真实的示例数据,所有 SQL 你拷过去就能跑(标准 SQL 版本;Access 的差异我会在"避坑指南"里单独说)。

三、案例实战

准备:两张示例表

咱们假设一个小公司的场景,有两张表:

  • 员工 表:记录每个同事的工号、姓名、部门、基本工资;
  • 销售记录 表:记录每一笔订单,由谁(工号)卖的、卖了什么、销售额多少、哪天卖的。

先用下面这段标准 SQL 把表建出来、再把数据塞进去(MySQL / SQL Server / PostgreSQL 都能直接跑;SQL Server 注意:若库的排序规则非中文(默认常如此),请把 VARCHAR 改成 NVARCHAR、中文值写成 N'销售部' 这样带 N 前缀,否则中文会被静默存成问号 ?):

sql
-- 建表 CREATE TABLE 员工 ( 工号 VARCHAR(10) PRIMARY KEY, 姓名 VARCHAR(20), 部门 VARCHAR(20), 基本工资 INT ); CREATE TABLE 销售记录 ( 订单号 VARCHAR(10) PRIMARY KEY, 工号 VARCHAR(10), 产品 VARCHAR(20), 销售额 INT, 日期 DATE, FOREIGN KEY (工号) REFERENCES 员工(工号) ); -- 塞数据 INSERT INTO 员工 (工号, 姓名, 部门, 基本工资) VALUES ('E001','张三','销售部',8000), ('E002','李四','销售部',8500), ('E003','王五','技术部',10000), ('E004','赵六','技术部',9500), ('E005','孙七','行政部',7000); INSERT INTO 销售记录 (订单号, 工号, 产品, 销售额, 日期) VALUES ('S001','E001','笔记本',5000,'2024-01-15'), ('S002','E001','台式机',3000,'2024-02-10'), ('S003','E002','显示器',2000,'2024-01-20'), ('S004','E003','服务',8000,'2024-02-05'), ('S005','E002','笔记本',4500,'2024-03-01'), ('S006','E001','显示器',1800,'2024-03-12');

字段就是表的"列",比如"姓名""部门";每条数据是一"行",也叫一条"记录"。这两个词后面会混着用,知道是一回事就行。

第一步:用 AI 写最简单的查询(SELECT + WHERE)

需求:把"销售部"的同事姓名和部门列出来。

给 Copilot 的提示词(直接复制就能用)

我有一张叫"员工"的表,字段有:工号、姓名、部门、基本工资。请用 SQL 查出部门等于"销售部"的员工,只显示"姓名"和"部门"两列。

Copilot 会吐出这段 SQL

sql
SELECT 姓名, 部门 FROM 员工 WHERE 部门 = '销售部';

跑出来的结果:

姓名 部门
张三 销售部
李四 销售部

这里三个关键词先记住:SELECT(选哪些列)、FROM(从哪张表)、WHERE(加筛选条件)。WHERE 里字符串要用单引号 '销售部',这是 SQL 的规矩,漏了就报错。

第二步:加上更灵活的条件(WHERE)

需求:查"基本工资高于 9000"的人。

提示词

在"员工"表里,查出基本工资大于 9000 的员工,显示姓名、部门、基本工资。

SQL

sql
SELECT 姓名, 部门, 基本工资 FROM 员工 WHERE 基本工资 > 9000;

结果:王五(技术部,10000)、赵六(技术部,9500)。

小提醒:WHERE 里比较数字不用加引号,比较文字才加单引号。这是新手最容易踩的一个小坑。

第三步:把两张表拼起来(JOIN)

单独看员工表或销售表都不够用——老板要的是"每笔订单是谁卖的、卖了多少"。这就得把两张表按"工号"连起来。

JOIN(连接)=把两张表按某个共同字段拼到一起。这里的共同字段就是 工号:销售记录里有工号,员工表里也有工号。

提示词

把"销售记录"表和"员工"表用"工号"关联起来,列出每笔订单的订单号、销售员姓名、销售额。

SQL

sql
SELECT 销售记录.订单号, 员工.姓名, 销售记录.销售额 FROM 销售记录 INNER JOIN 员工 ON 销售记录.工号 = 员工.工号;

结果(6 笔订单都有对应员工):

订单号 姓名 销售额
S001 张三 5000
S002 张三 3000
S003 李四 2000
S004 王五 8000
S005 李四 4500
S006 张三 1800

INNER JOIN ... ON 的意思是:只保留两张表里工号能对上的行。注意字段前加了 表名.,因为"工号""销售额"这种名字两张表都有,不写清楚 SQL 会犯迷糊。

第四步:分组汇总(GROUP BY + 聚合函数)

老板换个问法:"每个部门分别多少人、工资总额多少、平均工资多少?"

这里要用 GROUP BY(分组)=按某个字段分组,然后每组算一个汇总值;配合聚合函数(把一堆数算成一个数的函数,比如求和 SUM、计数 COUNT、平均 AVG)。

提示词

在"员工"表里,按"部门"分组,统计每个部门的人数、工资总额、平均工资。

SQL

sql
SELECT 部门, COUNT(*) AS 人数, SUM(基本工资) AS 工资总额, AVG(基本工资) AS 平均工资 FROM 员工 GROUP BY 部门;

结果:

部门 人数 工资总额 平均工资
销售部 2 16500 8250
技术部 2 19500 9750
行政部 1 7000 7000

COUNT(*) 数这一组有几行,SUM 求和,AVG 求平均,AS 是给算出来的列起个别名好显示。关键点:SELECT 里只要出现了"非聚合"的列(这里是"部门"),它就必须在 GROUP BY 里出现,否则 SQL 会报错。

第五步:综合起来(JOIN + WHERE + GROUP BY)

最后来个实战大综合:统计 2024 年 2 月 1 日之后,每个部门的总销售额。

这一步把前面全用上了,咱们拆成两步想:

  1. 先把两张表 JOIN 起来,并只留日期够新的订单(WHERE);
  2. 再按部门 GROUP BY 求和。

提示词

关联"销售记录"和"员工"两张表(按工号),只保留日期在 2024-02-01 及之后的订单,按部门分组,算出每个部门的总销售额。

SQL

sql
SELECT 员工.部门, SUM(销售记录.销售额) AS 总销售额 FROM 销售记录 INNER JOIN 员工 ON 销售记录.工号 = 员工.工号 WHERE 销售记录.日期 >= '2024-02-01' GROUP BY 员工.部门;

按前面数据手算验证:2 月 1 日之后的订单是 S002(3000,张三/销售部)、S004(8000,王五/技术部)、S005(4500,李四/销售部)、S006(1800,张三/销售部)。

结果:

部门 总销售额
销售部 9300
技术部 8000

到这儿,SELECT / WHERE / JOIN / GROUP BY / 聚合函数 这套组合拳你就真上手了。

四、原理小结

SQL 是一门"声明式"语言——你不用告诉它"先打开哪张表、再怎么循环",只要声明"我要什么",数据库引擎自己排好执行顺序。一段查询的阅读顺序是:FROM(去哪张表拿数据)→ JOIN(要不要拼别的表)→ WHERE(每行先过一遍筛子)→ GROUP BY(分组)→ SELECT(最后挑要显示的列)。AI(比如 Copilot)做的事,本质就是把你那段大白话需求,翻译成上面这条"固定流水线"里的对应零件;你理解了这条流水线,就能看懂、也能改 AI 给的代码,而不是糊里糊涂地复制粘贴。

五、避坑指南

  1. 字符串用单引号,数字别加引号。 '销售部' 对,销售部 错;基本工资 > 9000 对,基本工资 > '9000' 在有些库里会偷偷转类型、结果诡异。
  2. JOIN 一定写 ON 连接条件。 忘了写 ON 销售记录.工号 = 员工.工号,两张表会"全乘起来"(笛卡尔积,简单说就是两张表每行无脑两两配对),5 个员工 × 6 笔订单直接变 30 行,数据量一大电脑就卡死。
  3. GROUP BY 的列要和 SELECT 非聚合列一一对应。 SELECT 里写了"部门",GROUP BY 就必须有"部门";想多显示一个没分组的字段,要么把它加进 GROUP BY,要么用聚合函数包起来。
  4. 表名/字段名带空格或中文,按数据库加"引号"包裹标识符。 标准 SQL 和 PostgreSQL 用双引号 "员工";MySQL 用反引号 `员工`;Access 与 SQL Server 习惯用方括号 [员工](SQL Server 默认也接受双引号)。本文示例用了中文名,在多数库能直接跑,但上生产库前最好确认一下你的库到底认哪种引号。
  5. AI 给的 SQL 先拿小数据验再上真库。 尤其是 DELETEUPDATE 这种会改数据的语句,一定先在测试库跑一遍、看影响行数对不对,再动正式数据。

补充(Access 用户专属):Access 与标准 SQL 写法主要差在两处——日期字面量批量插入。日期用井号 #2024-02-01# 而非单引号;而且 Access 不支持一次插入多行的那段 INSERT ... VALUES (...),(...),得拆成多条 INSERT INTO ... VALUES (...)。此外 Access 的 LIKE 通配符用 * 而不是 %(例如 WHERE 姓名 LIKE '张*')。SELECT / WHERE / JOIN / GROUP BY 的写法两家基本通用。

六、进阶延展

到这里你已经能"用 AI 写查询、还能自己看明白"了。如果想把 SQL 基础再夯实一遍,可以回看 B13(同系列的数据库基础篇,讲怎么设计数据表),把表结构、主键外键(主键=唯一标识一行,外键=指向另一张表的主键)这些概念吃透,AI 给你的 SQL 你会改得更顺手。

再往下走(L3 层级),咱们可以把"查出来的结果"直接做成动态报表:比如用 Power Query 把数据库/Excel 数据抽进来清洗,再用 PivotTable(数据透视表)拖拽出汇总,或者上 DAX(度量值公式,专门给透视表做复杂计算)做同比环比。到时候 AI 不光能写 SQL,还能帮你搭整个 macro(宏)/自动化流程——从"查数据"升级到"数据自己报上来"。