Oracle 函数进阶、xxx() over 分组排序、列转行、行转列、分组统计、cast 类型转换、dbms_random 生成随机数、sys_guid、unistr 将 Unicode 字符串解码
2026/5/12 5:21:50 网站建设 项目流程

目录

row_number() over 唯一分组排序

rank() over 跳级分组排名

dense_rank() over() 连续分组排名

列转行

wm_concat

listagg() within group

xmlagg wellformed

行转列

case when

decode

 pivot

分组统计

cast 数据类型转换

dbms_random 生成随机数

生成随机数字

生成随机字符串

从表中获取随机数据

sys_guid() 生成 UUID

unistr 将 Unicode 字符串解码


~~~ 准备员工表与部门表测试数据

row_number() over 唯一分组排序

函数格式:row_number() over([partition by column1] order by column2) 

高斯、达梦都支持

1、根据 column1 分组,在分组内部根据 column2 排序,返回每组内部排序后的顺序编号(此行号组内连续且唯一)

2、不加 partition by column1 时,表示只排序不分组。

3、特别提醒:select 语句执行顺序:from ...> where ...> group by ...> having ... > select ...> order by ...

使用举例

--查询所有人员,工资由高到低排序,第一列(xh)是行号,从1开始且连续。

select row_number() over(order by t.sal desc) as xh , t.* from emp t ;

--查询所有人员,部门内部员工的工资由高到低排序

select row_number() over(partition by t.deptno order by t.sal desc) as xh , t.* from emp t ;

--查询每个部门中工资最高的人 (这里只是介绍用法,实际中可能存在工资一样的人,此时需要使用 dense_rank() over )

select t2.* from ( select row_number() over(partition by t.deptno order by t.sal desc) as xh , t.* from emp t ) t2 where t2.xh <=1;

--使用 row_number() over 分组排序方式进行分页(只需要嵌套1层子查询)
select t2.* from (select row_number() over(order by t1.empno desc) as xh,t1.* from emp t1) t2 where t2.xh between 6 and 12;

-- 使用 rownum 方式分页,查询员工数据,根据员工编号倒序排序(需要嵌套2层子查询)
select * from (select rownum xh,t2.* from (select * from emp t1 order by t1.empno desc) t2) t3 where t3.xh between 6 and 12;

rank() over 跳级分组排名

dense_rank() over() 连续分组排名

1、rank() over、dense_rank() over(),用法和格式与 row_number() over 完全一样,区别如下:

--查询所有人员,按工资的由高到低排序,不支持并列排名 select row_number() over(order by t.sal desc) as xh , t.* from emp t ; ---查询所有人员,按工资的由高到低排序,支持并列排名,且排名不会跳级 select dense_rank() over(order by t.sal desc) as xh , t.* from emp t ; ---查询所有人员,按工资的由高到低排序,支持并列排名,但是排名会跳级 select rank() over(order by t.sal desc) as xh , t.* from emp t ;

列转行

wm_concat

1、wm_concat 函数oracle12g版本开始不支持,Oracle 官方更推荐使用下面的 listagg() within group 函数。

-- 1、查询员工表中的所有员工姓名,并转为一行,用 "," 隔开,如: 张三,李四,Jock
select wm_concat(ename) as names from emp t;
-- 2、按部门编号分组查看每个部门中的员工姓名
select deptno,wm_concat(ename) as names from emp group by deptno;

-- 3、通过Oracle 系统视图查询 emp 表的所有字段,如:EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO

--这个操作还是非常有用的,比如一个表有几十个或者上百个字段,select x,y,z ...,如果靠人工一个个写,太累而且容易出错
select wm_concat(t.COLUMN_NAME) from user_tab_columns t where t.TABLE_NAME = 'EMP';

listagg() within group

1、Oracle 官方更推荐使用 listagg 函数,格式:listagg(column_nname,delimiter) [within group (order by order_by_column)];

column_nname:待转换的列

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询