新闻详情

新闻详情

首页 / 资讯中心 / 详情

SQL中的函数:从聚合函数到自定义函数的T-SQL实战配置

发布时间:2026/9/26 10:40:02来源:尧图网络
SQL中的函数:从聚合函数到自定义函数的T-SQL实战配置
1. 从一次报表卡顿说起为什么你需要真正理解 T-SQL 函数如果你写过一段时间的 T-SQL大概率遇到过这种场景一个统计报表的存储过程越写越长里面塞满了重复的SUM、AVG计算还有一堆针对不同专业的筛选逻辑。每次需求一变就得在几百行代码里翻找修改点改完还容易漏。我试过最夸张的一次一个销售汇总查询里同样的CASE WHEN逻辑出现了七遍后来加了一个新的产品分类改到怀疑人生。这类问题的根源往往不是 SQL 语法不熟而是没有把「函数」这个工具用到位。T-SQL 里的函数大致分两类一类是系统内置的比如聚合函数SUM、AVG、COUNT日期函数DATEADD、DATEDIFF字符串函数SUBSTRING、CHARINDEX另一类是你自己写的自定义函数包括标量函数、内嵌表值函数和多语句表值函数。聚合函数解决的是「把多行压成一行」的统计问题自定义函数解决的是「把重复逻辑封装起来」的复用问题。两者配合好了查询既能跑得快代码也能维护得动。这篇文章面向的是已经会写基本SELECT、想进一步提升 T-SQL 工程能力的 SQL 开发者和数据分析人员。我会从聚合函数的实战用法讲起再给出三类自定义函数的可复制模板最后补上执行验证和常见报错排查。另外如果你在本地或团队里用 AI 辅助写 SQL我也会给出一份settings.json配置骨架把模型调用通道统一到 TaoToken 的 Key/API 上省得每个工具各配一套密钥。整篇内容都可以直接拿去在 SQL Server 里跑不需要额外环境。2. 聚合函数实战不只是 SUM 和 COUNT2.1 聚合函数的核心行为与 GROUP BY 配合聚合函数的特点是「多行输入单行输出」。你写SELECT AVG(score) FROM sc返回的是一个数你写SELECT cno, AVG(score) FROM sc GROUP BY cno返回的是每个课程号一行。这里的关键是GROUP BY决定了聚合的粒度。很多人初学时会把非聚合列直接写在SELECT里而不加GROUP BYSQL Server 会直接报错-- 错误示例sno 没有出现在 GROUP BY 中 SELECT sno, cno, AVG(score) FROM sc GROUP BY cno;报错信息类似「列 sc.sno 在选择列表中无效因为该列既不包含在聚合函数中也不包含在 GROUP BY 子句中」。修正方式要么把sno加进GROUP BY要么用聚合函数包起来。2.2 常用聚合函数对照与 NULL 处理函数作用对 NULL 的处理SUM求和忽略 NULLAVG求平均忽略 NULL分母不含 NULL 行MIN最小值忽略 NULLMAX最大值忽略 NULLCOUNT(列)统计非 NULL 行数忽略 NULLCOUNT(*)统计所有行数包含 NULL 行这里有个容易踩的坑AVG忽略 NULL所以如果某列有一半是 NULL算出来的平均值只基于另一半非 NULL 值。如果你希望 NULL 按 0 参与平均得用AVG(ISNULL(score, 0))。而COUNT(*)和COUNT(列)的差异在数据质量检查里特别有用——两者差值就是该列的 NULL 行数。2.3 聚合查询示例按课程统计成绩分布下面这段查询统计每门课程的平均分、最高分、最低分和选课人数是一个典型的聚合实战SELECT cno AS 课程号, COUNT(*) AS 选课人数, AVG(score) AS 平均分, MAX(score) AS 最高分, MIN(score) AS 最低分, SUM(CASE WHEN score 60 THEN 1 ELSE 0 END) AS 及格人数 FROM sc GROUP BY cno HAVING AVG(score) 70 ORDER BY 平均分 DESC;注意HAVING和WHERE的区别WHERE在分组前过滤行HAVING在分组后过滤组。上面这个查询先用GROUP BY把每门课聚成一行再用HAVING筛掉平均分不超过 70 的课程。如果你把条件写成WHERE AVG(score) 70SQL Server 会报「聚合函数不能出现在 WHERE 子句中」。3. 自定义函数三类模板标量、内嵌表值、多语句表值3.1 标量函数返回单个值标量函数适合封装「输入几个参数算出一个值」的逻辑。语法骨架如下CREATE FUNCTION dbo.fn_GetCourseAvg ( cno CHAR(6) ) RETURNS FLOAT AS BEGIN DECLARE aver FLOAT; SELECT aver AVG(score) FROM sc WHERE cno cno; RETURN aver; END;调用时必须带所有者名也就是dbo.前缀DECLARE course CHAR(6) C001; SELECT dbo.fn_GetCourseAvg(course) AS 课程平均分;标量函数的一个性能注意点如果在SELECT里对每一行都调用标量函数SQL Server 在旧版本中可能逐行执行数据量大时明显变慢。SQL Server 2019 之后有了标量 UDF 内联优化但也不是所有场景都能命中。所以标量函数更适合逻辑简单、调用次数可控的场景。3.2 内嵌表值函数返回一张表相当于参数化视图内嵌表值函数没有BEGIN...END函数体直接用一个SELECT返回表。它最大的价值是「参数化视图」——视图不能带参数但内嵌表值函数可以。CREATE FUNCTION dbo.fn_StudentsByMajor ( major NVARCHAR(20) ) RETURNS TABLE AS RETURN ( SELECT s.sno, s.sname, sc.cno, sc.score FROM student s INNER JOIN sc ON s.sno sc.sno WHERE s.specialty major );调用方式就是把它当表用SELECT * FROM dbo.fn_StudentsByMajor(N计算机);内嵌表值函数在查询优化器里通常能被展开成等效的连接查询性能比多语句表值函数好所以能用内嵌表值函数解决的优先用它。3.3 多语句表值函数需要中间计算时使用多语句表值函数有BEGIN...END函数体可以往返回的 table 变量里多次插入数据适合需要分步筛选、合并的场景。CREATE FUNCTION dbo.fn_StudentScoreDetail ( sno CHAR(20) ) RETURNS result TABLE ( s_no CHAR(20), s_name NVARCHAR(20), c_name NVARCHAR(20), c_score TINYINT, c_credit TINYINT ) AS BEGIN INSERT INTO result SELECT s.sno, s.sname, c.cname, sc.score, c.credit FROM student s INNER JOIN sc ON s.sno sc.sno INNER JOIN course c ON sc.cno c.cno WHERE s.sno sno; RETURN; END;调用同样用SELECTSELECT * FROM dbo.fn_StudentScoreDetail(201602001);三类函数的选型可以记一个简单原则算一个值用标量返回一张表且逻辑是单个查询用内嵌表值返回一张表但需要多步处理用多语句表值。4. 统一 Key/API 通道settings.json 配置骨架如果你在用 AI 辅助写 T-SQL比如让模型帮你生成聚合查询或自定义函数模板通常会涉及多个工具各自配置 API Key 的问题。把通道统一到 TaoToken 可以减少密钥管理成本。下面是一份settings.json配置骨架适用于支持 OpenAI 兼容接口的编辑器或 CLI 工具{ ai.provider: openai-compatible, ai.baseUrl: https://taotoken.net/api, ai.apiKey: sk-你的TaoToken密钥, ai.model: claude-sonnet-4-20250514, ai.temperature: 0.2, ai.maxTokens: 4096, ai.requestTimeout: 60000, ai.retry: { enabled: true, maxAttempts: 3, backoffMs: 1000 } }几个参数说明baseUrl填https://taotoken.net/api不要带多余路径apiKey从控制台的 API Keys 页面生成temperature写 SQL 建议调低到 0.2 左右减少随机性maxTokens根据你生成的 SQL 长度调整一般 4096 够用。如果你用的是 Claude Code 这类编码 Agent长期跑任务可以考虑 Coding Plan额度更稳定。配置完成后在工具里发一条测试请求比如让它生成一个「按专业统计平均分」的 T-SQL 查询能正常返回就说明通道通了。密钥不要写进版本库用环境变量或本地配置文件隔离。5. 执行验证与常见报错排查5.1 验证自定义函数是否创建成功创建完函数后先用系统视图确认存在SELECT name, type_desc, create_date FROM sys.objects WHERE type IN (FN, IF, TF) AND name LIKE fn_%;FN是标量函数IF是内嵌表值函数TF是多语句表值函数。查到记录说明创建成功。然后分别调用一次确认返回结果符合预期。5.2 常见报错与修正报错一「CREATE FUNCTION 必须是查询批次中的第一个语句」原因是你把CREATE FUNCTION和其他语句写在同一个批次里了。解决办法是在CREATE FUNCTION前面加GO或者单独选中函数定义部分执行。报错二「在函数内无效的语句」函数体里不能做修改数据状态的操作比如INSERT、UPDATE、DELETE目标表、CREATE TABLE、EXEC动态 SQL 等。多语句表值函数里只能往result这个 table 变量插入数据不能操作永久表。报错三「无法在函数中使用的数据类型」标量函数的返回类型不能是TEXT、NTEXT、IMAGE、CURSOR、TIMESTAMP或TABLE。如果你需要返回表用表值函数。报错四调用标量函数时报「不是可以识别的 内置函数名称」多半是忘了加dbo.前缀。自定义标量函数调用时必须带所有者名写成dbo.fn_xxx()。报错五聚合查询报「列在选择列表中无效」检查SELECT里的非聚合列是否都出现在GROUP BY中或者是否被聚合函数包裹。5.3 性能排查小技巧如果发现某个查询变慢先看执行计划里有没有「标量计算」或「表值函数」的逐行调用。把标量函数改写成内嵌表值函数再CROSS APPLY往往能明显提速。另外聚合查询在大表上跑之前确认GROUP BY和WHERE用到的列上有合适索引。6. 把函数用成习惯而不是临时拼 SQL写 T-SQL 时间长了会发现真正拉开效率差距的不是会不会写JOIN而是有没有把重复逻辑沉淀成函数。聚合函数帮你把统计口径固定下来自定义函数帮你把业务规则封装起来两者结合存储过程和报表查询都能瘦一圈。我自己的习惯是同一个计算逻辑在三个地方出现过就抽成函数同一个筛选条件被复制超过两次就做成内嵌表值函数。如果你在配置 AI 辅助通道时遇到密钥或模型调用问题可以直接去 API Keys 页面生成新密钥接入文档里有各语言的最小请求示例。需要验证模型返回的 SQL 是否正确用模型对话跑一遍如果是长期在编辑器里做编码辅助Coding Plan 的额度模型更适合持续使用。把通道配好之后让模型帮你生成函数模板、检查聚合逻辑比手动翻文档快得多。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

MinGW-w64 构建 vlc-qt 全流程:从编译到打包分发实践 2026/9/26 11:31:14

MinGW-w64 构建 vlc-qt 全流程:从编译到打包分发实践

简介:vlc-qt_build_mingw64_install.zip 是在 Windows 64 位环境下使用 MinGW-w64 8.1.0 工具链构建的 Qt 与 VLC 集成编译包,定位为带图形界面的播放器开发基础组件,版本组合为 Qt5.15.2 与 VLC3.0.14。Qt5.15.2 提供稳定的 GUI 框架&#x…

阅读更多 →
Python实战:从椎骨数据到巨齿鲨体长估算的回归建模与可视化 2026/9/26 11:31:14

Python实战:从椎骨数据到巨齿鲨体长估算的回归建模与可视化

刚看到一条关于巨齿鲨体型重建的新闻时,大多数人的第一反应是“这家伙到底能长多大”,而作为经常和数据打交道的开发者,我第一反应却是另一个问题:这个“体长 20 米”的数字到底是怎么算出来的?是直接测量化石吗&#…

阅读更多 →
GCC 11.4.0 源码包编译完整指南:从解压到版本切换 2026/9/26 11:31:14

GCC 11.4.0 源码包编译完整指南:从解压到版本切换

简介:GCC 11.4.0 是 GNU 编译器套件的一个稳定版本,这份源码压缩包面向 Linux/Unix 下的 C/C 开发者、系统管理员以及想深入了解编译器实现和构建流程的进阶学习者,可用于在无预编译包的环境中自行构建整套工具链,也可用于研究编译…

阅读更多 →
从源码编译安装GCC 11.4.0:tar.gz下载、configure配置与排错指南 2026/9/26 11:31:14

从源码编译安装GCC 11.4.0:tar.gz下载、configure配置与排错指南

简介:GCC 11.4.0 源码压缩包(gcc-11.4.0.tar.gz)是 GNU 编译器套件 11.4 分支的完整源代码,面向需要在多操作系统环境下编译、安装及研究 GCC 的开发者,也可用于学习编译原理、构建工具链或定制编译器行为。资源共 200…

阅读更多 →
Deskcomm CRM落地实战:从客户数据统一到自动化流程优化 2026/9/26 11:30:54

Deskcomm CRM落地实战:从客户数据统一到自动化流程优化

一个听起来像“桌面通信客户管理”的CRM名字,其实暗含了一条很关键的产品思路:把企业和客户之间的每一次接触沉淀成可管理、可追踪、可复用的数据资产。我最早接触DeskcommCRM,是在团队同时维护销售线索、售后工单、客服消息三个系统&#xf…

阅读更多 →
从AlexNet到ViT:PyTorch统一训练模板与模型部署实践 2026/9/26 11:30:47

从AlexNet到ViT:PyTorch统一训练模板与模型部署实践

1. 背景与核心概念如果现在要评选过去十年影响最深远的深度学习模型,卷积神经网络(Convolutional Neural Network,CNN)一定是最有竞争力的候选之一。从 2012 年 AlexNet 在 ImageNet 大赛上一举夺冠开始,CNN 逐步成为图…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉