——离开桌面,走进账本真正的住址
引子:那个按钮,你等过多久
先看一个场景。
领导要一个数:华东区、上半年、含税金额前二十的客户。流水在 ERP 里。你打开系统,翻菜单,找不到现成报表;找到"自定义查询",字段拼不出来;提需求给 IT,回复"排期,下周三"。
最后你老老实实点了"导出",拉出一百六十万行的 CSV,Excel 打开转圈两分钟,然后开始拉辅助列。
停下来想一个问题:你导出的那一百六十万行,是数据库里多少数据的一个切片?
ERP、金蝶、用友、SAP——这些系统只是前台,账本身上住在后台的数据库里。你每一次"导出",都是别人从数据库里替你抄了一份摘录;你提的每一个"取数需求",都是让别人替你写一条查询语句。
而这条查询语句,就是 SQL——它的全部工作,是把"给我华东区上半年含税前二十的客户"这句话,用数据库听得懂的语言说出来。这句话你说了半辈子,只是从前一直托人翻译。
一、SQL 是什么:一门"说话"的语言,不是一门编程
很多教程第一页就写"结构化查询语言",然后开始讲语法,把人吓退。先做翻译——你会发现这门语言里全是你认识的东西:
| SQL 里的 | 会计世界的原型 |
|---|---|
| 数据库 | 整套账簿体系 |
| 表 | 一本明细账:凭证表、客户表、科目表 |
| 行 | 一笔分录 |
| 列 | 分录上的要素:日期、科目、金额 |
| SELECT | 取哪几栏 |
| WHERE | 筛哪些行——取数条件 |
| JOIN | 把两本账对上——总账对明细账 |
| GROUP BY | 按科目汇总——科目汇总表 |
| ORDER BY | 排序——余额表从大到小 |
看完这张表,结论可以写在底稿上:SQL 不是编程,是记账语言的另一种拼写。它的可读性确实接近英语——SELECT customer, SUM(amount) FROM sales WHERE year = 2026 读出来就是"从销售表里取 2026 年的客户和金额合计",和你在筛选器里点的动作一一对应。
二、为什么该学:三笔账
第一笔:数据量。 数据库里躺着的行数,单位是百万和亿。Excel 的舒适区在五万行以内,百万行开始卡顿,千万行直接打不开。而 SQL 的世界没有这个天花板——数据库一天处理的就是这个量级。
第二笔:中间人成本。 每次导出都是一次"抄账"。抄账必有损耗:字段被截断、编码被转成数字、日期被拆散、合计行混进明细。你花在"清洗导出数据"上的时间,本质是在替 IT 的导出模板还债。直接对话数据库,等于跳过中间商,从源头取原始凭证。
第三笔:口径权。 这是最要害的一笔。领导要"上半年",是 1-6 月还是 4-9 月?要"客户",按一级客户还是末级?导出按钮不问你这些——它给什么你收什么。SQL 把取数口径的定义权还给你:条件写在哪一行、怎么分组、怎么排序,白纸黑字,写得清清楚楚。
这三笔账,在 2026 年的校招 JD 里已经有了市价:财务数字化、财务 BP 岗位,SQL 和 Excel 并列出现在任职要求里,面试开始考分组计算和多表关联。不是新趋势,是旧趋势的显形。
三、第一课:三个动词
SQL 关键字十几个,日常够用的就三个。每个都配一个你最熟悉的动作。
动词一:SELECT + WHERE——按条件筛分录
场景:取 2026 年 6 月、科目 1122(应收账款)的全部凭证。
SELECT 凭证号, 日期, 借方金额, 贷方金额, 摘要
FROM 凭证表
WHERE 科目编码 = '1122'
AND 日期 >= '2026-06-01'
AND 日期 < '2026-07-01';
读法:从凭证表里,取凭证号到摘要这五栏,条件是科目 1122、六月期间。SELECT 管取哪几栏,WHERE 管留哪几行——你在明细账筛选器里干的活,逐字翻译。
注意两个细节。第一,科目编码 '1122' 加引号——它是文本不是数字,上上篇讲过的类型纪律,在这里是硬约束。第二,日期用 >= 6月1日 AND < 7月1日 而不是 BETWEEN 6月1日 AND 6月30日——后者在时间戳精确到秒的数据库里会漏掉 6 月 30 日 23:59:59 那笔,又一个静默失败的口袋。
动词二:GROUP BY——编科目汇总表
场景:6 月每个科目的发生额合计。
SELECT 科目编码,
SUM(借方金额) AS 借方合计,
COUNT(*) AS 分录笔数
FROM 凭证表
WHERE 日期 >= '2026-06-01' AND 日期 < '2026-07-01'
GROUP BY 科目编码;
GROUP BY 做的事,就是把几十万行分录按科目装进桶里,每个桶吐出一行合计。你做科目汇总表、做透视表,全是这个动作——区别只是从前用鼠标拖字段,现在用一行字说清楚。
这里有一条新手必踩的规矩:GROUP BY 之后,SELECT 里的每一列,要么是分组依据(科目编码),要么包在聚合函数里(SUM、COUNT)。原因很会计:一个科目桶里装着几百条摘要,你说"取摘要"这一栏,机器不知道该取哪一条——就像"应收账款"下面挂着八百笔分录,你不能在汇总表上随便抄一笔的摘要交差。
筛选合计结果用 HAVING,不是 WHERE:
HAVING SUM(借方金额) > 1000000
WHERE 筛的是原始行(结账前的分录),HAVING 筛的是汇总后的桶(结账后的科目)——先筛分录再汇总,还是先汇总再筛科目,时序不能乱,和结账流程一个道理。
动词三:JOIN——总账对明细账
场景:凭证表里只有客户编码,要带出客户名称和行业——上上篇 Power Pivot 里那个问题,在 SQL 里的原生形态:
SELECT v.凭证号, v.借方金额, c.客户名称, c.所属行业
FROM 凭证表 v
JOIN 客户表 c ON v.客户编码 = c.客户编码
WHERE v.日期 >= '2026-01-01';
ON v.客户编码 = c.客户编码 就是在两本账之间牵一根线——和 Power Pivot 里拖连线建关系、和 VLOOKUP 里选匹配列,是同一个动作的三种方言。
但 JOIN 比 VLOOKUP 多给一样东西:对不上的行怎么办,可以自己定。内连接只留两边都有的;左连接凭证全留、客户信息没匹配上的留空;左反连接只留凭证有、客户表里查无此人的——那是什么?那是主数据不完整、需要补录的客户清单。审计里"找差异"这个动作,在 JOIN 这里是一个单词的事。
四、取数守则:只读、限量、留痕
能对话数据库,权限就大了一档——而权限大了一档,内控就得跟上一档。三条守则,写进你自己的部门准则:
第一,只读不写。你需要的动词只有 SELECT。UPDATE、DELETE、INSERT 这三个会改数据的动词,非数据库管理员不得使用——这和"出纳不得兼管稽核、会计档案不得涂改"是同一条内控逻辑。数据库是原始凭证的最终住址,任何人不得直接涂改。
第二,限量取数。不写 SELECT *——一百六十万行全字段拉出来,数据库慢、网络堵、Excel 崩。先想清楚要哪几栏、哪段期间,再开口问。这和查档案一个道理:调卷要说清哪一年哪一册,没有"把档案室全搬过来"这种调法。实在要探数据,先 SELECT TOP 100 看看长相。
第三,查询留痕。每条写过的 SQL,存进文件夹、写上业务背景和日期——它就是你这次取数的"审计轨迹"。下个月同一张表,把语句翻出来改个日期范围就能重跑:上个月你用 Power Query 干的事,现在用一行 WHERE 条件干。口径可复现、结果可核对,这是 SQL 给你的最实在的礼物。
五、避坑清单
四个高频坑,全是静默失败家族的成员:
- JOIN 忘写 ON。两表相乘,十万行变一百亿行——Excel 当场卡死,这是少数会当场喊疼的静默失败。防御:每次 JOIN 后先看行数,和原表对得上才继续;
- NULL 参与计算。金额列里有 NULL(没有发生,不是零),SUM 自动忽略没事,但你拿它做除法、做拼接,结果就是 NULL——一整列悄悄变空。防御:用 COALESCE(金额, 0) 先补位;
- GROUP BY 之后选了非分组列。有的数据库不报错,随机给你一行——数字看着挺像那么回事。防御:规矩写死——要么分组列,要么进聚合;
- 时间条件漏边界。前面说过的 BETWEEN 问题。防御:一律用
>= 起点 AND < 终点,期初含、期末不含,写进条文。
六、什么时候用哪个:一张分工表
SQL 不是 Excel 的替代品,是分工表上多出来的一行:
| 环节 | 主责工具 | 理由 |
|---|---|---|
| 从 ERP 取数 | SQL | 数据住在数据库,直取不走中间人 |
| 百万行筛选汇总 | SQL | 数据库天生干这个 |
| 清洗与加工 | Power Query | 上篇的管道还在 |
| 建模与口径 | 数据模型 + DAX | 上上篇的网还在 |
| 分析、试算、呈现 | Excel | 手感活,它的主场 |
一句话分工:SQL 管进门,Excel 管干活。数据从数据库里按你的口径取出来,落到 Power Query 的管道、数据模型的网、Excel 的表——前几篇的一切,一点没浪费,只是源头换成了原始凭证。
结语:口径权,和你的下一个同桌
系列走到第八站,把一条线画完:公式解决一格,函数解决一类,封装解决一套准则,递归解决一层深度,Power Query 解决一个循环,数据模型解决一张网,Power BI 解决一次分发——而 SQL 解决的是最底下那一层:数据从哪儿来。
回头看,这一路你其实只做了一件事:把"别人替你决定的事"一件一件收回来。用 LAMBDA 收回封装权,用 Power Query 收回工序权,用数据模型收回结构权,用 Power BI 收回分发权——今天,用 SQL 收回取数口径权。
母题照例最后说一遍:会计人精通的从来不是工具,是业务。SQL 这门语言里,WHERE 写的是你的取数口径,GROUP BY 写的是你的汇总层级,JOIN 写的是你的勾稽关系——**每个关键字背后,站着的都是一条会计判断。**语法三周能学会,判断你练了十年。这就是为什么这一课对你来说,比谁都近。
系列目录:《Excel 函数的本质》 → 《LAMBDA 实战》 → 《部门函数库》 → 《递归》 → 《Power Query》 → 《Power Pivot 与数据模型》 → 《终点站 Power BI》 → 本篇。