Oracle数据库3--常用函数

1.函数概念

函数一般是在数据上执行的,它给数据的转换和处理提供了方便。只是将取出的数据进行处理,不会改变数据库中的值。

函数根据处理的数据分为单行函数和聚合函数(组函数)。

单行函数对单个数值进行操作,并返回一个值。

组函数又被称作聚合函数,用于对多行数据进行操作,并返回一个单一的结果,组函数仅可用于选择列表或查询的having子句

2.字符相关函数

-- dual用于测试
select * from dual;

-- 1.字符串连接
select concat('aa','12') from dual;
select 'aa'||'12' from dual;

-- 2.首字母大写
select initcap('abc') from dual;
--- 把大写转化小写
select lower('ABc') from dual;
select upper('abc') from dual;

-- 把所有员工的姓名小写输出
select lower(e.ename),e.empno
from emp e

-- 3.填充字符lpad/rpad
select lpad('sxt',5,'*') from dual;
select rpad('sxt',5,'*') from dual;

-- 4.去掉空白字符
select '  kallen' from dual;
select ltrim('  kallen',' ') from dual;
select rtrim('  kallen  ',' ') from dual;
-- trim 删除左右两边的字符
select trim('a' from 'abc') from dual;

-- 5.求子串 substr(str,loc,len)-->loc从1开始
select substr('abcd',2,2) from dual;

-- 6.查找字符串
/*
如果找到返回>=1的索引;如果没找到返回0
*/
select instr('abcd','b') from dual;

-- 7.求长度
select length('abcd') from dual;

3.数值型函数

-- 数值型函数
-- 四舍五入round(x,y)对x保留y为小数
select round(23.652) from dual;
select round(23.652,1) from dual;
select round(25.652,-1) from dual;

-- 返回x按精度y截取后的值
select trunc(23.652) from dual;
select trunc(23.652,2) from dual;
select trunc(23.652,-1) from dual;

-- mod(x,y)求余数
select mod(9,2) from dual;

-- ceil 向上取整
select ceil(1.9) from dual;
-- floor 向下取整
select floor(1.9) from dual;

4.日期时间函数

4.1  日期函数

-- 返回系统当前时间
select sysdate from dual;
-- 返回当前会话时区中的当前日期 
select current_date from dual;

-- 添加月数
select add_months(sysdate,1) from dual;
-- 返回两个时间相差的月数
select months_between(sysdate,add_months(sysdate,2)) from dual;

-- 需求:查询工作年限在30年以上
select e.ename,e.hiredate
from emp e
where months_between(sysdate,e.hiredate)/12 > 30

-- 返回date所在月份最后的一天
select last_day(add_months(sysdate,1)) from dual;
-- next_day(date1,week) 返回date1下周星期几的日期
select sysdate "当时日期",next_day(sysdate,'Monday') "下周星期一" from dual;

-- 查询会话的环境参数
select * from nls_session_parameters;

4.2日期计算函数

两个时间进行四则运算的单位是天。

select sysdate+2 from dual;
select sysdate-2 from dual;

5.转换函数

转换函数就是把字符、日期、数值型数据进行相互转换。类型转换分两种:隐式类型转换和显式类型转换。

5.1隐式类型转换

-- 字符隐式转换成数值
select '100' - 10 from dual;

-- 字符隐式转化为日期
-- DD-MON-RR 默认的日期格式
select 1 from dual
where sysdate > '13-May-19';

-- 查date format格式
select * from nls_session_parameters;

5.2显示类型转换

5.2.1 to_char

把日期转化成字符

把数值格式化成字符串

-- to_char
-- 【1】把日期转化成字符
-- 按照默认格式DD-MON-RR
select to_char(sysdate) from dual;
-- 按指定格式
select to_char(sysdate,'YYYY"年"MM"月"DD"日" HH24:MI:SS') as t from dual;

-- 【2】把数值格式化成字符串
select to_char(12345,'99999.99') from dual;
select to_char(12345,'99,999.99') from dual;
select to_char(12345,'999,999.99') from dual;
-- 不够位置0
select to_char(12345,'000,000.00') from dual;
-- 格式化成美元显示
select to_char(12345,'$000,000.00') from dual;

5.2.2 to_number、to_date

-- to_number
select to_number('$12,345','$99,999') from dual;
select to_number('$12,345.12','$99,999.99') from dual;

-- to_date
select to_date('14-May-19','DD-MON-RR') from dual;
select to_date('2004-09-19','YYYY-MM-DD') from dual;
-- 查询雇用期满6个月的下一个周一的日期。
select e.ename,e.hiredate,next_day(add_months(e.hiredate,6),'Monday')
from emp e
where months_between(sysdate,e.hiredate) > 6

-- 查询公司boss
select e.ename || nvl(to_char(e.mgr),' is boss')
from emp e
where e.mgr is null

5.2.3 decode/case when

decode(条件,值1,“返回值1”, 值2,“返回值2”,,,“默认值”)

-- 需求:查询员工所在的部门名称
select 
e.ename,
e.deptno,
decode(e.deptno,10,'部门1',20,'部门2',30,'部门3','未知')
from emp e;
 

case when:

-- case when
select 
e.ename,
e.deptno,
case e.deptno
  when 10 then '部门1'
  when 20 then '部门2'
  when 30 then '部门3'
  else '未知'
end
from emp e;
-- 需求:对各个部门进行涨薪,10->1.1 20->1.2 30->1.3 其他->1.0
select 
e.deptno,
e.ename,
e.sal "涨薪前",
decode(e.deptno,10,e.sal*1.1,20,e.sal*1.2,30,e.sal*1.3,e.sal) "涨薪后"
from emp e

-- 需求:根据工资分布输出以下信息
/*
 <1000 真屌丝
 (1001,2000] 屌丝
 (2001,3000] 白领 
 (3001,5000] 高富帅
 (5001,10000] 土豪
*/

select 
e.ename "姓名",
e.sal "工资",
case
  when e.sal <= 1000 then '真屌丝'
  when e.sal <= 2000 then '屌丝'
  when e.sal <= 3000 then '白领'
  when e.sal <= 5000 then '高富帅'
  when e.sal <= 10000 then '土豪'
else '未知'
end "描述"
from emp e;

总结:decode 多用于等值匹配;case when可以用于等值,多用于条件分支。

6.组函数

组函数把多行数据经过运算后返回单个值。也称聚合函数。

-- 求公司雇员的数量
select count(*)
from emp e;

select count(e.empno) 
from emp e;

select count(1)
from emp e;

-- avg:对多个记录的某个字段求平均值
-- 需求:求底薪的平均值
select avg(e.sal)
from emp e;


-- 需求:求雇员的最高薪资/最低薪资
select max(e.sal),min(e.sal),avg(e.sal)
from emp e;

-- 需求:求公司一个月的员工基本开销
select sum(e.sal)
from emp e;

注意:

[1] 组函数或聚合函数是对一个数据集(表数据、查询出来的表、分组的表)进行聚合。

[2] 聚合函数对字段是null的值进行忽略。count(*) 

-- 求有津贴的员工的数量
select count(e.comm)
from emp e;

[3] max/min 适合任意数据类型,sum/avg 只适用于数值类型。

聚合函数的结果可以作为其他查询条件。

-- 最早入职的员工
select e.ename,e.hiredate
from emp e
where e.hiredate = (select min(e.hiredate) from emp e);
原文地址:https://www.cnblogs.com/WhiperHong/p/10864757.html