oracle-数据库03

本文介绍了SQL中几个重要的函数,包括用于分组排序的rank()和dense_rank(),日期格式转换的to_date(),行列转换的pivot(),以及内容合并的listagg()。还详细讲解了每个函数的用法和示例,如rank()的排序,to_date()的时间格式转化,pivot()的行转列操作,listagg()的内容合并,以及数据处理函数如nvl2()的空值处理。
摘要由CSDN通过智能技术生成

本篇主要说明一下几个函数rank(),to_date(),pivot(),listagg()以及函数的使用。

1、rank() —— 分组排序

通过定义一个rank等级字段来为各行进行分组排序

rank、dense_rank:分组

partition、order:排序

select 科目,成绩,rank() over(order by 成绩) as 名次
from sc ;

dense_rank() over(order by ###) as 名次        --简写


--注意partition by之后不能加DESC
rank() over(partition by ##1 order by ###) as 名次 


dense_rank() over(partition by ##1 order by ###) as 名次

结果:

table 1
科目成绩名次
数学1401
语文1401
数学1401
数学1304
语文1205
table 2
科目成绩名次
数学1401
语文1401
数学1401
数学1302
语文1203
table 3
科目成绩名次
数学1401
数学1401
数学1303
语文1401
语文1202
table 4
科目成绩名次
数学1401
数学1401
数学1302
语文1401
语文1202

总结rank()不连续等级、dense_rank()连续等级

            partition by大项排序、order by小项排序

2、to_date() —— 格式转化

将字符串数据按格式改为时间数据

还有to_char()、to_number()等, 主要讲to_date(),顺带上to_char()

(好处是便于对时间的限制)

select to_date(char_time,'yyyy-MM-dd', 'NLS_DATE_LANGUAGE = American') from dual;
 --注意年月日等的写法;可设置语言


to_char(date_time,'yy','NLS_DATE_LANGUAGE = American')
--select省略

各种时间制写法:

分类格式含义显示值
YEARyyyy四位年2023
yyy三位年023
yy两位年23
MONTHmm两位月07
mon字符集表示7月或jul
month字符全集表示7月或jully
DAYdd当月第几日(两位日)11
ddd当年第几日192
dy当周第几天简星期二或tues
day当周第几天全星期二或tuesday
HOURhh12小时进制05
hh2424小时进制17
MINUTEmi60进制(一般的分钟表示)39
SECONDss60进制(一般的秒表示)

46

WEEKw当月第几周2
ww当年第几周28
季度q当年第几季度3

常见用法:

--(1)、求自定义某时间的具体信息[to_char()]
to_char(date_time,'yy')            --''内容为所求值

select to_char(to_date('2023-6-23','yyyy-mm-dd'),'q') from dual;
--结果:3




--(2)、求两天之间的天数[1-2]
floor(date_time1-date_time2)       --floor()是求小于该值的最大整数

select floor(sysdate-to_date('2023-4-3','yyyy-mm-dd')) from dual;
--结果:99

                                   --更改时间显示语言还可以
alter session set nls_date_language='AMERICAN'; 
                                   --可看一些配置属性
select * from nls_session_parameters




--(3)、求月份之差[months_between()]
months_between(date_time1,date_time2)

select months_between(sysdate,to_date('2023-4-3','yyyy-mm-dd')) from dual;
--结果:3.27191382915173




--(4)、next_day()用法
next_day(date_time,day)             --day为当周第几天

select to_char(sysdate,'mm/dd' ) 星期二,
       to_char(next_day(sysdate,1),'mm/dd') 周日,
       to_char(next_day(sysdate,2),'mm/dd') 周一,
       to_char(next_day(sysdate,3),'mm/dd') 周二,
       to_char(next_day(sysdate,4),'mm/dd') 周三,
       to_char(next_day(sysdate,5),'mm/dd') 周四,
       to_char(next_day(sysdate,6),'mm/dd') 周五,
       to_char(next_day(sysdate,7),'mm/dd') 周六
from dual;
--结果:
--星期二 周日   周一   周二  周三  周四   周五  周六
--07/11 07/16 07/17 07/18 07/12 07/13 07/14 07/15

 再解释一下next_day():就是从第二天算起的一整周,通过1-7找周日-六

3、pivot() —— 行转列

将某列的部分值,按其余列值聚合的方式,以字段名出现于表头

uppivot(),列转行,主要讲pivot()

pivot(func(c1) for c2 in(v1,v2,v3))  --func()需为聚合函数
select 学号,语文,数学
from sc pivot(sum(成绩) for 科目 in ('语文' 语文,'数学' 数学))
order by 学号;

学号语文数学
001140130
002120

140

003(null)140

聚合函数在不同情况下的选择不同:

max使用于大部分场景,min容易与else起冲突,avg和数值起冲突,sum和字符起冲突

总结:搞清楚按什么分组,对谁进行行列转换。

4、listagg() —— 合并内容

当其余字段内容一致时,将某一字段的内容按条件合并

group(),确定连接值的顺序

listagg(col,'')within group(order by col)
select 科目,listagg(成绩,',')within group(order by 成绩 DESC) 成绩序列
from sc
group  by 科目;        --需要加group by
科目成绩序列
语文140,120
数学140,140,120

总结:分清要连接内容和连接先后由哪一列决定

5、常用数据处理函数 

floor()对某数值(向下取整)取小于该值的最大整数,还有ceil(),向上取整,主要讲floor()

round()对数据精度值规定,可实现四舍五入,还有trunc(),不能四舍五入,主要讲round()

nvl(exp1,exp2)对空值数据处理,当exp1值为null,则赋值exp2

还有nvl2(exp1,exp2,exp3),当exp1值为null,则赋值exp2,否则赋值exp3,主要讲nvl2()

--(1)、求整
select floor(3.1415926) from dual;
--结果:3



--(2)、规定精度
select round(3.1415926,3) from dual;
--结果:3.142



--(3)、空值处理
select id,name,nvl2(name,'未录入信息','已录入信息') as 录入情况 from Persons;
--结果如下图

 总结floor,ceil取整,round,trunc求精,nvl,nvl2空处理


下期见。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值