【数据库】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:
sqlSELECT 姓名, 部门
FROM 员工
WHERE 部门 = '销售部';跑出来的结果:
| 姓名 | 部门 |
|---|---|
| 张三 | 销售部 |
| 李四 | 销售部 |
这里三个关键词先记住:SELECT(选哪些列)、FROM(从哪张表)、WHERE(加筛选条件)。WHERE 里字符串要用单引号 '销售部',这是 SQL 的规矩,漏了就报错。
第二步:加上更灵活的条件(WHERE)
需求:查"基本工资高于 9000"的人。
提示词:
在"员工"表里,查出基本工资大于 9000 的员工,显示姓名、部门、基本工资。
SQL:
sqlSELECT 姓名, 部门, 基本工资
FROM 员工
WHERE 基本工资 > 9000;结果:王五(技术部,10000)、赵六(技术部,9500)。
小提醒:WHERE 里比较数字不用加引号,比较文字才加单引号。这是新手最容易踩的一个小坑。
第三步:把两张表拼起来(JOIN)
单独看员工表或销售表都不够用——老板要的是"每笔订单是谁卖的、卖了多少"。这就得把两张表按"工号"连起来。
JOIN(连接)=把两张表按某个共同字段拼到一起。这里的共同字段就是 工号:销售记录里有工号,员工表里也有工号。
提示词:
把"销售记录"表和"员工"表用"工号"关联起来,列出每笔订单的订单号、销售员姓名、销售额。
SQL:
sqlSELECT 销售记录.订单号, 员工.姓名, 销售记录.销售额
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:
sqlSELECT 部门,
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 日之后,每个部门的总销售额。
这一步把前面全用上了,咱们拆成两步想:
- 先把两张表 JOIN 起来,并只留日期够新的订单(WHERE);
- 再按部门 GROUP BY 求和。
提示词:
关联"销售记录"和"员工"两张表(按工号),只保留日期在 2024-02-01 及之后的订单,按部门分组,算出每个部门的总销售额。
SQL:
sqlSELECT 员工.部门,
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 给的代码,而不是糊里糊涂地复制粘贴。
五、避坑指南
- 字符串用单引号,数字别加引号。
'销售部'对,销售部错;基本工资 > 9000对,基本工资 > '9000'在有些库里会偷偷转类型、结果诡异。 - JOIN 一定写 ON 连接条件。 忘了写
ON 销售记录.工号 = 员工.工号,两张表会"全乘起来"(笛卡尔积,简单说就是两张表每行无脑两两配对),5 个员工 × 6 笔订单直接变 30 行,数据量一大电脑就卡死。 - GROUP BY 的列要和 SELECT 非聚合列一一对应。 SELECT 里写了"部门",GROUP BY 就必须有"部门";想多显示一个没分组的字段,要么把它加进 GROUP BY,要么用聚合函数包起来。
- 表名/字段名带空格或中文,按数据库加"引号"包裹标识符。 标准 SQL 和 PostgreSQL 用双引号
"员工";MySQL 用反引号`员工`;Access 与 SQL Server 习惯用方括号[员工](SQL Server 默认也接受双引号)。本文示例用了中文名,在多数库能直接跑,但上生产库前最好确认一下你的库到底认哪种引号。 - AI 给的 SQL 先拿小数据验再上真库。 尤其是
DELETE、UPDATE这种会改数据的语句,一定先在测试库跑一遍、看影响行数对不对,再动正式数据。
补充(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(宏)/自动化流程——从"查数据"升级到"数据自己报上来"。