news 2026/5/1 10:00:43

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/5/1 6:05:55

零基础教程:什么是COMDLG32.OCX?如何简单修复?

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 制作一个面向初学者的COMDLG32.OCX修复向导,要求:1.分步骤图文指导 2.一键式修复按钮 3.通俗易懂的错误解释 4.安全验证机制。使用VB.NET开发简单GUI&#…

作者头像 李华
网站建设 2026/5/1 7:10:37

GLADOS在智能家居控制系统中的实战应用

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个智能家居控制系统的原型,使用GLADOS作为核心AI。系统应能通过语音指令控制灯光、温控器和安防设备,支持自然语言交互如GLADOS,把客厅温…

作者头像 李华
网站建设 2026/4/27 9:20:25

传统vs现代:DLL错误修复效率大比拼

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 设计一个ACBRANDRES.DLL修复效率对比工具,能够:1) 模拟传统手动修复流程 2) 实现自动化修复流程 3) 记录两种方法耗时 4) 生成可视化对比图表。要求使用Pyt…

作者头像 李华
网站建设 2026/4/30 11:00:18

Vue3 v-model入门:5分钟学会双向数据绑定

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个面向初学者的Vue3 v-model教学示例,要求:1. 从最简单的input绑定开始 2. 逐步增加checkbox、select等不同表单元素 3. 每个示例都有清晰的代码注释…

作者头像 李华
网站建设 2026/5/1 8:39:05

企业级项目实战:正确处理npm依赖冲突的5个场景

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 构建一个包含5个典型冲突场景的演示项目:1) React 17/18混用 2) TypeScript版本冲突 3) Webpack插件不兼容 4) Babel polyfill问题 5) 私有仓库依赖。每个场景提供可切…

作者头像 李华