news 2026/4/23 15:44:36

Oracle新手必学:LISTAGG函数图文教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Oracle新手必学:LISTAGG函数图文教程

快速体验

  1. 打开 InsCode(快马)平台 https://www.inscode.net
  2. 输入框内输入如下内容:
制作一个面向初学者的LISTAGG教程,包含:1) 函数语法图解 2) 基础示例(单表简单聚合) 3) 常见错误及解决方法 4) 练习题(带答案)。要求使用简单的EMPLOYEE表示例,输出包含分步说明和可视化结果展示。
  1. 点击'项目生成'按钮,等待项目生成完整后预览效果

Oracle新手必学:LISTAGG函数图文教程

最近在学Oracle数据库时,发现LISTAGG函数特别实用,它能把多行数据合并成一个字符串,特别适合做报表统计。今天就把我的学习笔记整理分享给大家,用最简单的例子带你快速掌握这个函数。

LISTAGG函数基础语法

LISTAGG函数的语法结构其实很简单,主要由三部分组成:

  1. 要合并的列名或表达式
  2. 分隔符(用单引号括起来)
  3. 可选的WITHIN GROUP子句指定排序方式

基本格式是这样的:

LISTAGG(column_name, '分隔符') WITHIN GROUP (ORDER BY sort_column)

举个例子,假设我们有个员工表EMPLOYEE,里面有员工ID、姓名和部门字段。如果想按部门把员工姓名合并成逗号分隔的字符串,就可以用LISTAGG。

单表示例演示

让我们用一个简单的员工表来演示。表结构如下:

  • EMP_ID:员工ID
  • EMP_NAME:员工姓名
  • DEPT_ID:部门ID

假设数据是这样的:

EMP_ID | EMP_NAME | DEPT_ID -------+----------+-------- 1 | 张三 | 10 2 | 李四 | 10 3 | 王五 | 20 4 | 赵六 | 20 5 | 钱七 | 20

现在我们要按部门分组,把同部门的员工姓名合并显示:

SELECT DEPT_ID, LISTAGG(EMP_NAME, ',') WITHIN GROUP (ORDER BY EMP_NAME) AS EMPLOYEES FROM EMPLOYEE GROUP BY DEPT_ID;

执行结果会是:

DEPT_ID | EMPLOYEES --------+------------------ 10 | 张三,李四 20 | 王五,钱七,赵六

可以看到,部门10的两个员工姓名被合并成了一个字符串,部门20的三个员工姓名也被合并了,而且都按姓名排序了。

常见错误及解决方法

刚开始用LISTAGG时容易遇到几个问题:

  1. ORA-01489错误:这是最常见的错误,表示合并后的字符串超过了最大长度限制(4000字节)。解决方法:
  2. 使用SUBSTR截取部分结果
  3. 考虑改用XMLAGG等其他聚合函数
  4. 在Oracle 12c及以上版本可以使用ON OVERFLOW TRUNCATE选项

  5. NULL值处理:默认情况下,LISTAGG会忽略NULL值。如果想保留NULL值,需要用NVL或COALESCE函数先转换:sql LISTAGG(NVL(EMP_NAME,'未知'), ',')

  6. 排序问题:如果不指定WITHIN GROUP子句,结果的顺序是不确定的。建议总是明确指定排序方式。

  7. 分组遗漏:忘记写GROUP BY子句会导致整个表合并成一行,而不是按组合并。

实际应用练习

为了巩固学习,这里有几个小练习:

  1. 把员工表按部门分组,用"|"分隔员工姓名,并按员工ID排序sql SELECT DEPT_ID, LISTAGG(EMP_NAME, '|') WITHIN GROUP (ORDER BY EMP_ID) AS EMPLOYEES FROM EMPLOYEE GROUP BY DEPT_ID;

  2. 统计每个部门的员工数量,并列出员工姓名sql SELECT DEPT_ID, COUNT(*) AS EMP_COUNT, LISTAGG(EMP_NAME, ',') WITHIN GROUP (ORDER BY EMP_ID) AS EMPLOYEES FROM EMPLOYEE GROUP BY DEPT_ID;

  3. 处理可能存在的NULL值sql SELECT DEPT_ID, LISTAGG(NVL(EMP_NAME,'(未命名)'), ';') WITHIN GROUP (ORDER BY EMP_NAME) FROM EMPLOYEE GROUP BY DEPT_ID;

学习建议

  1. 先从简单的单表查询开始练习,理解基本用法
  2. 逐步尝试更复杂的场景,比如多表关联后再聚合
  3. 注意结果字符串长度限制,避免生产环境出错
  4. 不同Oracle版本可能有细微差别,注意查阅对应版本的文档

我在InsCode(快马)平台上实践这些SQL示例时,发现它的Oracle环境配置很完善,可以直接运行测试,还能保存自己的代码片段,特别适合学习数据库操作。对于需要持续运行的数据库应用,平台的一键部署功能也很方便,不用自己折腾服务器配置。

希望这篇教程能帮你快速上手LISTAGG函数。这个函数在生成报表、数据导出等场景非常实用,掌握后能大大简化很多数据处理工作。

快速体验

  1. 打开 InsCode(快马)平台 https://www.inscode.net
  2. 输入框内输入如下内容:
制作一个面向初学者的LISTAGG教程,包含:1) 函数语法图解 2) 基础示例(单表简单聚合) 3) 常见错误及解决方法 4) 练习题(带答案)。要求使用简单的EMPLOYEE表示例,输出包含分步说明和可视化结果展示。
  1. 点击'项目生成'按钮,等待项目生成完整后预览效果
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:53:45

传统vsAI:修复ACADRES.DLL错误的时间对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个对比演示应用,展示手动修复ACADRES.DLL错误与AI自动化修复的时间差。应用应包含:1. 模拟手动修复流程;2. 展示AI自动修复过程&#xff…

作者头像 李华
网站建设 2026/4/8 18:16:57

新手必看:谷歌账号注册图解教程(含96831问题)

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个交互式新手教程应用,包含:1) 图文分步指导 2) 96831验证动画演示 3) 常见问题即时解答 4) 注册模拟练习功能 5) 进度保存和继续功能。要求使用Reac…

作者头像 李华
网站建设 2026/4/23 9:56:54

AI万能分类器性能深度评测:与传统机器学习方法对比

AI万能分类器性能深度评测:与传统机器学习方法对比 1. 引言:为何需要AI万能分类器? 在当今信息爆炸的时代,文本数据的自动化处理已成为企业智能化转型的核心需求。无论是客服工单、用户反馈、新闻资讯还是社交媒体内容&#xff…

作者头像 李华
网站建设 2026/4/23 9:58:12

科研演示 “破局者”:虎贲等考 AI PPT,重新定义学术表达新范式

在学术科研的赛道上,从开题报告的思路呈现到答辩环节的成果输出,PPT 始终是连接研究与观众的核心桥梁。但多数科研人都曾遭遇这样的困境:花费数天打磨的演示文稿,要么逻辑混乱难以凸显研究价值,要么数据堆砌缺乏视觉吸…

作者头像 李华
网站建设 2026/4/23 9:57:59

对比:手动下载OpenCV vs 自动化工具效率差异

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个对比测试脚本,分别记录:1. 手动下载OpenCV并配置环境所需的时间;2. 使用自动化工具完成相同任务的时间。脚本应自动记录每个步骤耗时&a…

作者头像 李华