Oracle函数:
函数一般是在数据中执行的,方便对数据进行转换和处理,只查出的数据新型处理,不改变数据库中的数据
查询出来的数据相当于一张虚拟表
组函数(聚合函数):输入多个参数,得出一个结果
组函数的使用场景:仅可用于选择列或者查询的having子句
-- 查询所有员工月薪水的总和
select sum(sal) from emp;
-- 查询表中有多少条记录
select count() from emp;
-- 按deptno进行分组,并求每个分组的记录数并找出大于3分组
select deptno, count() from emp group by deptno having count(*) > 3;
where只能查询表中实际存在的字段,而聚合函数的结果,where则不适合
单行函数:输入一个值,输出一个值
--字符函数
--concat:表示字符的连接等价 ||
select concat('my name is',ename) from emp;
--将字符串首字母转为大写
select initcap(ename) from emp;
--将字符串转为大写
select upper(ename) from emp;
--将字符串转为大写
select lower(ename) from emp;
--填充字符串 规定长度为10,不足左侧用补全
select lpad(ename,10,'') from emp;
--填充字符串 规定长度为10,不足右侧用补全
select rpad(ename,10,'') from emp;
-- 去除空格
select trim(ename) from emp;
--去左空格
select ltrim(ename) from emp;
--去右空格
select rtrim(ename) from emp;
-- 字符出现的位置
select instr(ename,'A') from emp;
select instr('BBBACCDD','A') from emp; //4
--查看字符串的长度
select length(ename) from emp;
--字符串截取操作
select substr(ename,0,2) from emp;
select substr('aaabbbccc',0,2) from emp;
-- 替换操作
select replace('ababefg','ab','hehe') from emp;
--数值函数
-- 小数四舍五入,指定小数位数为2
select round(123.123,2) from dual;
select round(123.128,2) from dual;
-- 截取两位小数,但不四舍五入
select trunc(123.128,2) from dual
-- 取模操作
select mod(10,4) from dual;
--向上取整
select ceil(12.56) from dual;
select ceil(12.11) from dual;
--向下取整
select floor(13.99) from dual;
-- 求绝对值
select abs(-100) from dual;
--求正负 1表示正 -1表示负 0表示0
select sign(100) from dual;
-- 求2^3
select power(2,3) from dual;
日期函数
-- 查询系统时间
select sysdate from dual;
-- 查询当前日期
select current_date from dual;
-- 查出的月份+2
select add_months(hiredate,2),hiredate from emp;
--返回本月最后一天
select last_day(sysdate) from dual;
--返回的两个时间间隔月份数
select months_between(sysdate,hiredate),sysdate,hiredate from emp;
-- round(sysdate) 最近的0点日期,最近的星期日,最近的月初,最近的季初,最近的年初
select sysdate,round(sysdate),round(sysdate,'day'),round(sysdate,'month'),round(sysdate,'q'),round(sysdate,'year') from dual;
-- 求下周的星期一日期
select next_day(sysdate,'星期一') from dual;
-- 提取日期中得时间
select extract (year from sysdate) year, extract (month from sysdate) month, extract (day from sysdate) day from dual;
select extract (year from date '2015-05-04') year, extract (month from date'2015-05-04') month, extract (day from date '2011-05-04') day from dual;
--- Oracle INTERVAL数据类型 date和timestamp用于存储时间点,interval用于存储时间段
-- interval 使用和含义https://www.yiibai.com/oracle/oracle-interval.html
-- INTERVAL '999' DAY(3) 含义999天
-- INTERVAL '11 10:09' DAY TO MINUTE 11天 10小时09分
-- INTERVAL '09:30' HOUR TO MINUTE 9小时30分钟
--给指定的时间单位添加数值
-- 当前时间+1s
select trunc(sysdate) + (interval '1' second),
-- 当前00点+一小时
trunc(sysdate) + (interval '01:00:00' hour to second),
-- 当前日期+1
trunc(sysdate) + (interval '1' DAY)
from dual;
-- trunc函数的使用 https://blog.csdn.net/qq_29171935/article/details/89478520
--- trunc可截取数值也可截取日期
-- 截取当年第一天
select trunc(sysdate,'yy') from dual;
-- 截取到当月第一天
select trunc(sysdate, 'mm') from dual
--截取到当当前天,也就是当前年月日
select trunc(sysdate,'dd') from dual;
select trunc(sysdate,'d') from dual;
select trunc(sysdate, 'hh') from dual
/**
转换函数:
隐式转换:
显示转换:
虽然有隐式转换,但最好使用显示转换保持可读性
to_char():将日期、数值转为字符串
to_date():将字符串、数值转日期
to_number:将字符串转数值
*/
-- 隐式转换
select '999'-1 from dual;
--显示转换
-- 日期转字符串
select to_char(sysdate,'yyyy-MM-dd') from dual;
select to_char(sysdate,'yyyy-MM-dd HH24:Mi:ss') from dual;
-- 数值转char 转为4位数字,9是控制符,该位没有则不显示
select to_char(123.456789,'9999') from dual;
-- 0是控制字符,该位没有,则强制显示0
select to_char(123.456789,'0000') from dual;
-- 9和.都是控制符 .表示显示小数点
select to_char(123.456789,'9999.999') from dual;
--9999.99') from dual;
--L 显示本地货币符号
select to_char(123.456789,'L9999.99') from dual;
--,表示千分字符
select to_char(123456789,'999,999,999') from dual;
--to_date:转换之后都是固定格式 2019/10/10 10:10:10
select to_date('2019/10/10 10:10:10','YYYY-MM-DD HH24:MI:SS') from dual;
-- to_number(数值字符串,格式)
select to_number('123,456,789','999,999,999') from dual;
-- 显示没有上级管理的首脑 mgr是数值类型,默认值没法是字符串所以做to_char转换
select ename,nvl(to_char(mgr),'boss') from emp where mgr is null;
--显示员工雇佣期满6个月后下个星期五的日期
--显示员工雇佣时间满6个月后,下个星期五日期
-- https://www.cnblogs.com/ray-bk/p/10239119.html
select hiredate,next_day(add_months(hiredate,6),6) from emp;
select hiredate,next_day(add_months(hiredate,6),'星期五') from emp;
/**
条件函数
decode()函数:当列为值1时,值为解码值1,以此类推
decode(列名,值1,解码值1,值2,解码值2,...值n,解码值n)
任何非null值与null求max或min,结果为前者
case when end语句
/
--给不同部门员工涨薪,10部门涨10%,20部门涨20%,30部门涨30%
select deptno,ename,sal,decode(deptno,10,1.1sal,20,1.2sal,30,1.3sal) from emp;
select deptno,ename,sal,case deptno when 10 then 1.1sal when 20 then 1.2sal when 30 then 1.3*sal end from emp;
-- 行转列
create table test(
id number(10) primary key,
type number(10) ,
t_id number(10),
value varchar2(5)
);
insert into test values(100,1,1,'张三');
insert into test values(200,2,1,'男');
insert into test values(300,3,1,'50');
insert into test values(101,1,2,'刘二');
insert into test values(201,2,2,'男');
insert into test values(301,3,2,'30');
insert into test values(102,1,3,'刘三');
insert into test values(202,2,3,'女');
insert into test values(302,3,3,'10');
请写出一条查询语句结果如下:
姓名 性别 年龄
张三 男 50
select max(decode(type,1,value)) 姓名,max(decode(type,2,value)) 性别,max(decode(type,3,value)) 年龄 from test group by t_id;
select min(decode(type,1,value)) 姓名,min(decode(type,2,value)) 性别,min(decode(type,3,value)) 年龄 from test group by t_id;
/**
group by 按照某些相同的值进行分组
group 进行分组操作的时候,可以使用表中实际存在的一个列或者多个列,
但在使用group by之后
选择列表只能包含组函数和group by子句包含的列
例如 ename既不是组函数也不是group by的列,会报错不是group by表达式
select deptno,avg(sal), ename from emp group by deptno having avg(sal) > 2000 ;
group by子句必须在where之后,order by之前
*/
-- 如果分组的列中有null值,null也为一个分组
select deptno from emp group by dempno;
---组函数
select avg(sal) from emp; //avg只适用数值类型
select min(sal) from emp; //min适用任何类型数据
select max(sal) from emp; //max适用任何类型数据
select sum(sal) from emp; //sum只适用数值类型
select count() from emp; //count一般用来获取记录的条数,获取记录条数时可用或者具体列,甚至可用数字,从性能角度推荐适用具体列和数字
-- count函数会跳过null,查询记录数时,使用具体列时需要注意不要选择可能有null值的列
select count(ename) from emp;
select count(1) from emp;
select count(1000) from emp;
-- nvl:空值转换函数,将null转为指定类型的值
select avg(nvl(comm,0)) from emp;
-- 求每个部门的平均薪水
select deptno,avg(sal) from emp group by deptno;
-- 求平均薪水大于1500的部门,此处过滤数据不能用where只能作用表中真实存在的列
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000 ;
/**
select语句的执行顺序
*/
image.png image.png
-- 部门下雇员工资>2000的人数
select deptno,count(1) from emp where sal>2000 group by deptno;
-- 求部门薪水最高的
select deptno,max(sal) from emp group by deptno;
--求部门不同岗位最高工资
select deptno,job,max(sal) from emp group by deptno,job;
网友评论