Oracle系统函数

系统函数 单行函数 数值函数
                  字符函数
                  日期函数
                  转换函数
                  通用函数
         聚合函数
         分析函数
自定义函数
函数的定义:
函数的用法:函数名的写法 参数的个数
参数的类型 返回值的类型
--数值函数
abs(数)绝对值
0的绝对值是0
select abs(123),abs(-23),abs(0) from dual;
mod(数1,数2)取余数
10➗3=3..1
数2为0时 结果是数1
结果的正负和数1一致 和数2无关
select mod(10,3),mod(10,0),mod(-10,3),
       mod(10,-3),mod(-10,-3)
       from dual;
--员工编号奇数男生 偶数女生 查询男员工信息
select *
from emp
where mod (empno,2)=1;
--seil向上取整 和 floor向下取整
select ceil (3.8), ceil (-3.8),
floor(3.6),floor(-3.6)
from dual;
--整数都是它本身
round(数1[,数2]) 四舍五入
数2 保留的小数位数 不写默认保留整数
    小数位数不够 不会补0
    数2为负数时 保留到小数点前几位
select round(54.123456,2),
       round(54.123456,-1),
       round(54.123456),
       round(54.123456,1)
       from dual;
--查询员工姓名和入职日期 根据入职日期 计算年限保留整数
select ename,hiredate,
       round ((sysdate-hiredate)/365) 司龄
from emp;
trunc(数1[,数2])截断 截短 --不进位
select trunc(54.17648),
       trunc(54.87398),
       trunc(54.17648,4),
       trunc(54.17648,-1)
from dual;
sign(数) 判断正负零
select sign(123),sign(-2234),sign(0)
from dual;--整数返回1 负数返回-1 0返回0
--员工编号大于经理编号 就是优秀 查询所有优秀员工
select *
from emp
where sign(empno-mgr)=1;
power(数,数2) 次方和开方
select power(2,3),
       power(2,1/2),--分数是开方
       power(2,-2),--负数是倒数
       power(2,2.5)
       from dual;
--查询工资的(部门编号的1/10)次方
select deptno,power (sal,deptno/10) from emp;
upper (str) 转大写
lower (str) 转小写
initcap (str) 转首字母大写
select upper('apple'),
       lower('APPLE'),
       initcap('apple'),
       initcap('APPLE'),
       initcap('i我like喜欢apple苹果')
       from dual;
--查询员工姓名 员工姓名首字母大写 职位小写
select ename,initcap(ename),
       job,lower(job)
       from emp;
多个单词都转首字母大写 英文字母之间有非英文字母时就看做两个单词
length(str) 字符长度
lengthb(str)字节长度--汉字用lengthb
--一个汉字是两个字节
select length('艾末'),lengthb('艾末') from dual;
--查询员工姓名长度
select ename,length(ename)
from emp;
trim(str) 去两端空格
ltrim(str1,[str2]) 去左端的空格
rtrim(str1,[str2]) 去右端的空格
str2 不写 默认去空格
select trim('        s   b      '),
       ltrim('       s   b      '),
       rtrim('       s   b       ')
       from dual;
select ltrim('aaabbbccc','ab'),
       rtrim('aaabbbccc','bbcc')
       from dual;
--查询员工编号 去掉左边7 再去掉左边8的员工编号
select empno,ltrim(ltrim(empno,7),8) from emp;
--lpad(str1,数,str2) 向左填充
--rpad(str1,数,str2) 向右填充
str1 原字符串
数 填充以后的屏幕显示长度 如果原字符串大于填充后的长度
   会截断(从右往左截断,从左往右保留)
str2 要填充的字符串
--**abc   ABC**
select lpad('abc',5,'*'),rpad('abc',5,'*'),
       lpad('abc',2,'*'),rpad('abc',2,'*')
from dual;
--abc左右各填充两个**
select rpad(lpad('abc',5,'*'),7,'*')
from dual;
--abc左右各填充两个星星
select rpad(lpad('abc',7,'星星'),11,'星星')
from dual;
--员工姓名左右两边填充两个**
select ename,
rpad(lpad(ename,lengthb(ename)+2,'*'),
     lengthb(ename)+4,'*') 花名
from emp;
select ename,'**'||ename||'**'
from emp;
instr (str1,str2,[,数1,[数2]])
str1 原字符串
str2 要找的字符串
数1 从第几位开始找 不写默认从第一位开始找
    数1为负数 从倒数第几位开始找
数2 第几次出现 不写默认从第一次出现开始找
--查找名字里第二个字母是是L的员工信息
可以用模糊查询like 可以用instr
select *
from emp
where ename like '_L%';
select *
from emp
where instr(ename,'L')=2;--找不到返回0
--查找'helloworld'中l第一次和第二次出现的位置
select instr('helloworld','l',1,1),
       instr('helloworld','l',1,2)
       from dual;
--查找员工姓名和姓名中A第一次第二次出现的位置(没有A的不显示)
select ename,instr(ename,'A',1,1) 第一次,
       instr(ename,'A',1,2) 第二次
from emp
where ename like '%A%';--instr(ename,'A')!=0也行
substr(str,数1[,数2]) 截取字符串
      str 原字符串
      数1 从第几位开始截 负数从倒数截取
      数2 截取几位 不写默认截取到最后
--从'helloworld'截取owo,截取最后三位,截取3-5位,截取出hrld
select substr('helloworld',5,3) a,
       substr('helloworld',-3) b,
       substr('helloworld',3,3) c,
       substr('helloworld',1) ||substr('helloworld',-3)d
       from dual;
--截取员工姓名从A的位置开始到最后
select ename,substr(ename,instr(ename,'A',1))
from emp
where instr(ename,'A')!=0;
--I LOVE EAT RICE AND NODDLES 截取出 E EAT RICE
select substr('I LOVE EAT RICE AND NODDLES',6,1) a,
       substr('I LOVE EAT RICE AND NODDLES',8,3) b,
       substr('I LOVE EAT RICE AND NODDLES',12,4) c
       from dual;
--replace(str1,str2[,str3])整体替换
str3 不写默认换空
--把'helloworld'里的l替换成* o换成%
select replace(replace('helloworld','l','*'),'o','%') a
from dual;
--translate(str1,str2,str3) 逐一替换
把str1里面的str2逐一替换成str3
--把'helloworld'里的l替换成* 0替换%
select translate('helloworld','lo','*%')
from dual;
参数3的位数比参数2的位数多的时候 参数3多出来无效
参数2的位数比参数3的位数多的时候 参数2多出来的会替换成空
参数2和参数3为空格时 结果不变 空 结果为空
多次替换只有第一次有效
--把员工姓名中AMS三个字母替换成空
select ename,translate(ename,'*AMS','*')
from emp;
--concat(str1,str2) 连接字符串
只能是两个字符串 如果要连接多个 需要嵌套
select concat('hello','world')
from dual;
to_single_byte(str) 转半宽半角 半型
to_multi_byte(str)  转全宽全角 全型--全宽粗一些
--查询emp中姓名和职位有相同字母的员工信息
select *
from emp
where ename!=translate(ename,'*'||job,'*');
SELECT *
FROM emp
WHERE ename!=TRANSLATE(ename,'*'||job,LPAD('*',LENGTH(job)+1,'*'));
--日期函数
sysdate 当前系统函数
日期运算:日期±数字=日期±天数
          日期-日期=相差天数
--查询一天后 一小时后 一分钟后 一秒后
select sysdate,
       sysdate+1,--一天后
       sysdate+1/24,--一小时后
       sysdate+1/24/60,--一分钟后
       sysdate+1/24/60/60--一秒后
from dual;
--查询今年2月的天数
select date'2022-3-1'-date'2022-2-1'
from dual;
--距离2023年的元旦还有多少天
select round(date'2023-1-1'-sysdate)
from dual;
--查询一千天之后的日期
select sysdate+1000
from dual;
--add_months(日期,数)
select add_months(sysdate,1) 一个月后,
       add_months(sysdate,12) 一年后,
       add_months(sysdate,-1) 一个月前,
       add_months(sysdate,-12) 去年
from dual;
--查询三个月前距离今天多少天
select sysdate - add_months(sysdate,-3)
from dual;
--months_between(日期1,日期2) 两个日期相差的月数
oracle算法 把一天当成1/31个月
select months_between(sysdate,date'2022-1-1')
from dual;
--查询2008-8-8距离今天几个月
select months_between(sysdate,date'2008-8-8')
from dual;
--查询2012-12-20距离今天多少年 保留两位小数
select round(months_between(sysdate,date'2012-12-20')/12,2)
from dual;
--把入职日期看成生日 查询每人活了多少年多少月
select ename,hiredate,
       floor(months_between(sysdate,hiredate)/12) 年,
       floor(mod(months_between(sysdate,hiredate),12)) 月,
       floor(sysdate-add_months
       (hiredate,floor(months_between(sysdate,hiredate)))) 天
from emp;
两个日期相差的
年数     months_between/12
月数     months_between
天数    日期相减
小时数  日期相减*24
分钟数  日期相减*24*60
秒数    日期相减*24*60*60
日期加减
年   add_months(日期,年数*12)
月   add_months(日期,月数)
天   日期±天数
小时  日期±天数/24
分钟  日期±天数/24/60
秒    日期±天数/24/60/60
--next_day(日期,'星期几'/对应的数字) 下个星期几
1 星期日
2 星期一
。。。
7 星期六
select next_day(sysdate,'星期二'),next_day(sysdate,3),
       next_day(sysdate,1)
       from dual;
--2020年第一个星期五  2020年十月第一个星期五
select next_day(date'2019-12-31','星期五'),
       next_day(date'2020-9-30','星期五')
       from dual;
--求下个周的星期五
select next_day(next_day(sysdate-1,6),6)
from dual;
last_day(日期)--日期所在月的最后一天
select last_day(sysdate)
from dual;
--查询今天距离3个月后的月末差多少天
select last_day(add_months(sysdate,3))-sysdate
from dual;
--trunc(日期,'格式') 截取到日期之前
yyyy     一年之初(1月1日)
mm       一月之初(本月1日)
q        一季之初
dd       一天之初(当天0点0分0秒)
day/dy   一周之初(周日)
d        一周之初(周日)
hh/hh12  整小时(12小时制)
hh24     整小时(24小时制)
mi       整分钟
ss       精度错误
select trunc(sysdate,'yyyy'),trunc(sysdate,'dd'),
       trunc(sysdate,'mm'),trunc(sysdate,'q'),
       trunc(sysdate,'hh24'),trunc(sysdate,'mi')
       from dual;
--转换函数
ascii(str) 把一个字符变成阿斯克码 只转换一次
select ascii('A'),ascii('a')
from dual;
chr(数) 把阿斯克码变成对应字符
select chr(55),chr(88)
from dual;
--查询员工姓名S开头的员工信息 4种办法
select *
from emp
where substr(ename,1,1)='S';

select *
from emp
where instr(ename,'S')=1;

select *
from emp
where ascii(ename)=ascii('S');
to_number(str) 纯数字字符变成位数值
select '123',to_number('123')
from dual;
to_date(str.'格式') 按照格式把字符变成日期
yyyy   年
mm     月
dd     天
hh/hh12   12小时制
hh24      24小时制
mi     分
ss     秒
am     上午
pm     下午
select date'2022-1-1',
       to_date('2020-1-1 下午 2:10:15',
       'yyyy mm dd pm hh12:mi:ss')
from dual;
--查询2019-12-2 中午12:00
select date'2019-12-2',
       to_date('2019-12-2 下午 12:00',
       'yyyy-mm-dd pm hh12:mi')
from dual;--①种
select to_date('2019-12-2 12:00',
       'yyyy-mm-dd hh24:mi')
from dual;--②种
--查询今年10月1日 下午2:00
select to_date('2022-10-1 下午 2:00',
       'yyyy-mm-dd pm hh12:mi')
from dual;
格式可以只写一部分
yyyy      本月的1号
mm        本年所给数字的月份1号
dd        本年本月的所给日
am/pm     上下午
hh/mi/ss  本年本月1号0分0秒
select to_date('16:15','hh24:mi')
from dual;
日期的三种表达方式
①date'年-月-日'
②to_date(str,'格式')
③'日-某月-年' '1-1月-2022'--不能写在select后 只能写在where后
--查询1981年6月1号之后入职的员工
select *
from emp
where hiredate>'1-6月-1981';
第一种:to_char(日期,'格式') 提取日期中的元素
yyyy    年
mm      月
q       季度
dd      日
am/pm   上下午
day/dy  周    汉字
d       星期  数字
hh/hh12 12小时的时
hh24    24小时的时
mi      分
ss      秒
sssss   当前秒是今天的第几秒
ddd     所给日期是所在年的第几天
注意:提取日期用汉字做分隔符 汉字要加双引号
select to_char(sysdate,'yyyy"年"mm"月"dd"日" pm hh12:mi:ss dy')
from dual;
select to_char(sysdate,'ddd')
from dual;--从之前到给定时间的天数
--查闰年入职的员工信息 3种办法
SELECT *
FROM emp
WHERE to_char(to_date(to_char(hiredate,'yyyy')||'-12-31','yyyy-mm-dd'),'ddd')=366

SELECT *
FROM emp
WHERE to_char(to_date(to_char(hiredate,'yyyy')||'-3-1','yyyy-mm-dd')-1,'dd')=29

SELECT *
FROM emp
WHERE MOD(to_char(hiredate,'yyyy'),400)=0 
  OR (MOD(to_char(hiredate,'yyyy'),100)!=0 AND MOD(to_char(hiredate,'yyyy'),4)=0)
--2月天数=29;全年天数=366
select to_char(hiredate,'yyyy')
from emp;
第二种:to_char(数,'格式') 格式化数字 自带四舍五入
9  占位符
0  占位符(用在各位)
$  美元
L  本地货币
select to_char(3.123456,'9.999'),
       to_char(3.12,'9.999'),
       to_char(12345789,'L999,999,999,999,999.999'),
       to_char(0.1234,'9.99'),
       to_char(0.1234,'0.99')
from dual;
第三种:to_char(参数) 把参数转换成字符型
select 123,to_char(123),to_char(sysdate)
from dual;--把系统时间转换成字符型
通用函数
userenv('language') 查看当前客户端的字符集
greatest(参1,参2...) 多个参数中的最大值
least(参1,参2...) 多个参数最小值--参数类型要一致
如果参数中有null 结果为null
--查询员工编号empno经理编号mgr部门编号emptno最大最小值
select empno,mgr,deptno,
       greatest(empno,mgr,deptno),
       least(empno,mgr,deptno)
from emp;
coalesce(参1,参2..) 多个参数中第一个不为空的值
select coalesce(null,1,2,3,4),
       coalesce('a','b',null,'d'),
       coalesce(date'2022-1-1',null,sysdate)
       from dual;
--查询提成 经理编号 工资以及他们中第一个不为空的值
select comm,mgr,sal,
       coalesce(comm,mgr,sal)
       from emp;
--查询每个人的姓名和他们的月薪
select ename,sal+coalesce(comm,0) 月薪
       from emp;--利用coalesce
select ename,sal+nvl(comm,0)
from emp;--利用nvl
nvl(参1,参2..) 参数1为空返回参数2 否则返回参数1
--查询姓名 经理编号 如果经理编号为空返回666
select ename,mgr,nvl(mgr,666)
from emp;--coalesce(mgr,666)也可以
nvl2(参1,参2,参3) 参1空返回参3 否则返回参2
--经理编号为空返回老大 否则返回小弟
select ename,nvl2(mgr,'小弟','老大')
from emp;
--如果comm为空或者为0返回无奖金 否则返回有奖金
select ename,comm,nvl2(replace(comm,0),'有奖金','无奖金')
from emp;
--distinct 去重
--多列去重 只有完全一样才会去重
select distinct deptno
from emp;--emp一共几个部门
select distinct deptno,job
from emp;--emp的部门职位
--排序 order by sac/dsc 默认是升序
第一种:case  列 when 列中值1 then 值1
                 when 列中值2 then 值2
                 ...
                 [else 值n]
        end A
--如果部门编号是10 返回十部门 20 二十部门 30 返回三十部门
select deptno,
       case deptno when 10 then '十部门'
                   when 20 then '二十部门'
                   else '三十部门'
       end
from emp;
--查询员工表的职位和中文职位
select distinct job,
       case job when 'CLERK' then '职员'
                when 'SALESMAN' then '销售员'
                when 'MANAGER' then '经理'
                when 'ANALYST' then '分析员'
                else '董事长'
       end 职位
from emp;
第二种:case when 条件1 then 值1
            when 条件2 then 值2
            ...
            [else 值n]
       end A
--如果部门编号是10 返回十部门 20 二十部门 30 返回三十部门
select deptno,
       case when deptno =10 then '十部门'
            when deptno =20 then '二十部门'
            else '三十部门'--最后一个
       end 部门
from emp;
--查询员工表的职位和中文职位
select distinct job,
       case when job='CLERK' then '职员'
            when job='SALESMAN' then '销售员'
            when job='MANAGER' then '经理'
            when job='ANALYST' then '分析员'
            else '董事长'
       end 职位
from emp;
--如果工资>=3000 返回一级 >=2000 返回二级 >=1000 三级
select sal,
       case when sal>=3000 then '一级'
            when sal>=2000 then '二级'
            when sal>=1000 then '三级'
            else '小可怜'
       end 等级--从大到小
from emp;
如果入职日期是1981年前 返回他的部门编号
如果入职日期在1981-1982之间 返回入职年份
如果入职是1982之后 返回入职月份
select hiredate,
       case when hiredate<date'1981-1-1' then deptno
            when hiredate between date'1981-1-1' 
                 and date'1982-12-31' 
               then to_number(to_char(hiredate,'yyyy'))
            when hiredate>date'1982-12-31' 
               then to_number(to_char(hiredate,'mm'))
       end A--后面的值必须一致,也可以把deptno变成char
from emp;
decode(列,列中值1,值1,列中值2,值2...值n)
和case when 第一种可以互换
--如果部门编号是10 返回十部门 20 二十部门 30 返回三十部门
select deptno,
       decode(deptno,10,'十',20,'二十',30,'三十') A
from emp;
nullif(参1,参2) 判断两个字符是否相等 相等返回空 不相等返回1
参数类型一致,参数1不能为空
sql中如果有除法运算 为了防止除数为0报错 可以用nullif
nullif(除数,0)
--查询员工姓名 工资 提成 工资是提成的多少倍
select ename,sal,comm,sal/nullif(comm,0)
from emp;
--null小结
空不占内存 不等于0 不等于空格 也不完全等价于''--空字符串
对一行值进行计算时 单行函数/四则运算 空和任何值计算结果都为空
对一列值 聚合函数/分析函数 空不参与运算
可以使用nvl,nvl2,coalesce处理空值
--聚合函数和分析函数
聚合函数
min(列)max(列)
sum(列)--只能是数值
avg(列)--只能是数值
count(列)
select min(sal),max(sal),sum(sal),
       avg(sal),count(comm),count(*),count(1)--*查有多少行
from emp;
select min(comm),max(comm),sum(comm),
       avg(comm),count(comm)
from emp;
--count(1) count(*) count(列) 的区别
count(列) 不会统计空值
--查询最大最小员工姓名 最大最小入职日期 平均工资 有奖金的人数
select min(ename),max(ename),min(hiredate),max(hiredate),
       avg(sal),count(comm)
from emp;
group by 分组
--查询每个部门的人数和平均工资
select deptno,count(1),avg(sal)
from emp
group by deptno;
--查询每种职位的人数平均工资 最高工资 总工资
select job,count(1),avg(sal),max(sal),min(sal)
from emp
group by job;
--查询每个经理下属人数 有奖金的人数 最低工资
select mgr,count(1),count(replace(comm,0)),min(sal)
from emp--把0换成空可用replace和nullif
group by mgr;
--查询每个部门每种职位中最早和最晚入职的日期
select deptno,job,min(hiredate),max(hiredate)
from emp
group by deptno,job;
--having 分组后筛选--
--查询部门和部门的最高工资 只显示最高工资大于2900的部门
select deptno,max(sal)
from emp
group by deptno
having  max(sal)>2900;
--查询最早入职日期在1981-6-1之前的职位
select job,min(hiredate)
from emp
group by job
having min(hiredate)<date'1981-6-1';
--查询每个经理的下属平均工资 只显示工资在1000-2000的经理
select mgr,avg(sal)
from emp
group by mgr
having avg(sal) between 1000 and 2000;
--order by asc,desc
select * from emp
order by sal;--可写数字 表示第几列

select 要查找的内容     5
from 表                 1
where 条件              2
group by 分组           3
having 分组后筛选       4
order by 排序           6
--查询每个部门的平均工资 按部门升序
select deptno,avg(sal)
from emp
group by deptno
order by 1;
--查询每个职位最高工资 只显示最高工资<2500的 按照最高工资排序
select job,max(sal) A
from emp
group by job
having max(sal)<2500
order by A;
--查询每个部门中名字包含大写A的员工人数 只显示人数<3的
select deptno,count(deptno)
from emp
where ename like '%A%'--可以用instr和substr和阿斯克码
group by deptno
having count(deptno)<3;
--统计员工表每个职位上半年入职的人数 结果只显示人数<3的
select job,count(job)
from emp
where to_char(hiredate,'mm')<7--也可以用 '07'
group by job
having count(job)<3;

wm_concat(列) 分组连接字符串
只能使用分割 不能排序
listagg(列,'分割符')within group(order by 列) 分组连接字符串
可以自己指定分割符 还能排序

--where和having的区别:
where是在分组前数据筛选 不能加聚合函数
having在分组后数据筛选 可加聚合函数
执行顺序会影响别名的使用
--分析函数(开窗函数)
聚合函数和分析函数的区别:
聚合函数一个组只能看到一个结果
分析函数既可以看到聚合结果还能看到组内的明细
语法:函数名(列)over([partition by 列] order by 列])
min(列)
max(列)
sum(列)--只能是数值
avg(列)--只能是数值
count(列)
--查询每个部门的最低工资
select deptno,min(sal)
from emp
group by deptno;
--查询每个部门的最低工资 姓名 编号
select deptno,ename,empno,min(sal)over(partition by deptno)
from emp;
--查询每种职位的平均工资 全表有提成的人数
select job,avg(sal)over(partition by job),count(comm)over()
from emp;
/*查询姓名 部门编号 部门经理 部门的最低工资
经理的下属人数 全表最高工资*/
select ename,deptno,mgr,
       min(sal)over(partition by deptno) 部门最低工资,
       count(mgr)over(partition by deptno) 经理下属人数,
       max(sal)over() 全表最高工资
from emp;
--查SMITH姓名 部门编号 部门最高工资 职位工资总和部门最早入职日期
select ename,deptno,
       max(sal)over(partition by deptno) 部门最高工资,
       sum(sal)over(partition by job) 职位工资总和,
       min(hiredate)over(partition by deptno) 部门最早入职日期
from emp
where ename='SMITH';
--如果要求累计值 要在over后加上order by
--按值累加
select sal,sum(sal)over(order by sal),
       avg(sal)over(order by sal)
from emp;
--按行累加 在order by后加上
这一段rows between unbounded preceding and current row
select sal,sum(sal)over(order by sal rows 
           between unbounded preceding and current row) A,
           avg(sal)over(order by sal rows 
           between unbounded preceding and current row) B
from emp;
row_number()over([partition by 列] order by 列])--必须排序
不重复 没有并列的情况 1 2 3 4 5 6 7
rank()over([partition by 列] order by 列])--必须排序
并列跳一级 1 2 2 4 5 5 7
dense_rank()over([partition by 列] order by 列])--必须排序
并列不跳级 1 2 3 3 4 4 5
--查询员工姓名 工资 和工资排名
select ename,sal,row_number()over(order by sal) 排名
from emp;
select ename,sal,rank()over(order by sal) 排名
from emp;
select ename,sal,dense_rank()over(order by sal) 排名
from emp;
--查询每个部门工资排名第一的人
select*
from (select e.*,
      row_number()over(partition by deptno order by sal desc) A
      from emp e)
where A=1;
lead(列[数[,值]])over([partition by 列] order)--必须排序
向上提
值要和原来列中的值要一致
值不写默认是空 数不写默认是1
lag(列[数[,值]])over([partition by 列] order)--必须排序
向下拉
值要和原来列中的值要一致
值不写默认是空 数不写默认是1
--查询每个人的工资和他下个人的工资 下下个人工资
select ename,sal,
       lead(sal)over(order by sal desc) 下个工资,
       lead(sal,2,0)over(order by sal desc) 下下个人
from emp;
--按照工资降序 查询每个人比上个人的工资多多少
select sal,lag(sal)over(order by sal desc) 上个人,
       sal-lag(sal)over(order by sal desc) 多多少
from emp;

wm_concat(列)over() 分组连接字符串
listagg(列,'分割符')within group(order by 列)over() 分组连接字符

--查询每个人的姓名职位员工编号 每种职位对应的人的姓名
select ename,job,empno,
       wm_concat(ename)over(partition by job) 姓名
from emp;
select ename,job,empno,
       listagg(ename,'-')within 
       group(order by sal)over(partition by job) 姓名
from emp;
SELECT e.first_name
      ,e.phone_number
      ,dense_rank()OVER(ORDER BY SUBSTR(e.phone_number,INSTR(e.phone_number,'.',-1)+1)) 几等奖
FROM employees e
WHERE e.phone_number LIKE '%1234' 
   OR e.phone_number LIKE '%2234' 
   OR e.phone_number LIKE '%3234' 

select job_id,avg(salary)over(partition by job_id) 平均工资
from employees
where department_id=50
order by 平均工资;

SELECT e.job_id
      ,AVG(e.salary)
FROM employees e
WHERE e.department_id=50
GROUP BY e.job_id
ORDER BY 2;

那就在这儿结束吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值