常见字符处理函数
select initcap('hello') from dual;-- 首字母转大写
select lower('ABC') from dual;--转换成小写
select upper('abc') from dual;--转换成大写
--将第一字符串中存在于第二参数匹配的字符串 替换为第三个参数
select replace('tom and jerry','tom','tc') from dual
--查找子字符串第一个出现的位置(从1开始,没有返回0)
select instr('abcdefgcdab','cd') from dual;
--从开始位置(包含) 截取到最后
select substr('abcdefg',2) from dual;
--从开始位置(包含) 截取4个字符
select substr('abcdefg',2,4) from dual;
--将两个字符拼接一起
select concat('abc','efg') from dual
select 'abc'||'efg' from dual
数字函数
--取绝对值
select abs(-23.5) from dual
--向上取整
select ceil(-3.45) from dual
--向下取整
select floor(-3.12) from dual;
--取数据的符号位,正数返回1,负数返回-1,0返回0
select sign(-0) from dual;
--几的几次幂 支持浮点类型
select power(2,-2) from dual;
--取模运算
select mod(5,2.1) from dual;
--四舍五入,一个参数 默认是对小数点第一个四舍五入,如果第二参数为2,保留两个小数点位(从小数点第三个位进行四舍五入)
--第二参数可以为负数 -1:小数点左边第一位进行四舍五入
select round(3.5,0) from dual
--一个参数 默认是截取整数
select trunc(123.523) from dual;
--截取数字,第二个参数表示保留的小数点位数,第二参数支持负数运算
select trunc(123,-2) from dual;
--计算平方根
select sqrt(4) from dual;
日期函数
sysdate-- 系统当前时间
--时间增减,直接+-对天运算,/24对小时运算,24/60对分运算,24/60/60对秒运算
select sysdate,sysdate-1/24/60/60 from dual
--两个时间的月份差(可能是小数,跟天关于),跟月份的天数有关,
select sysdate,sysdate+30, months_between(sysdate,sysdate+31) from dual
--针对月份的增减
select add_months(sysdate,-1) from dual
select sysdate-10 from dual
--获取下一个星期几的时间
select next_day(sysdate-9,'星期二') from dual;
--本月的最后一天
select last_day(sysdate) from dual
--获取上月的开始时间 和 结束时间
select last_day(add_months(sysdate,-2))+1, last_day(add_months(sysdate,-1)) from dual
--获取本月的第一天
select last_day(add_months(sysdate,-1))+1 from dual
--统计本周
select next_day(sysdate-7,'星期日')+1 from dual;
-- round 四舍五入 year:针对年 对月份四舍五入 month:针对月份 对日期四舍五入 day:对星期四舍五入
--下一个星期的开始
select round(sysdate,'day') from dual
格式转化
select to_char(1234) from dual
--根据指定格式转换成字符,支持四舍五入,一般用于金额的转换 可以作为千位符转换
select to_char(123457.125,'9,999,999,999.99') from dual
select ltrim(to_char(123457.125,'9,999,999,999.99'),' ') from dual
--去首尾空格
select trim(' ab c ') from dual
--去掉全部空格
select replace(' a b c ',' ','') from dual;
--将date转换成字符串,可以指定格式
select to_char(sysdate,'yyyy-mm-dd') from dual
--时分秒 MI:分钟 HH24:小时制
select to_char(sysdate,'yyyy-mm-dd HH24:MI:ss') from dual
--yyyy-mm-dd HH24:MI:ss.ff 为毫秒 但是需要使用 systimestamp
select to_char(systimestamp,'yyyy-mm-dd HH24:MI:ss.ff') from dual
--将字符串的时间转换成 需要格式
select to_date('2018-05-10 16:31:34','yyyy-mm-dd HH24:MI:ss') from dual
select to_char(sysdate,'yyyy') from dual; --年
select to_char(sysdate,'Q') from dual; --季
select to_number(to_char(sysdate,'mm')) from dual; --月
select to_char(sysdate,'dd') from dual; --日
--将字符转换成数字
select to_number('0123.9') from dual;
聚合函数
sum() 求和,avg() 求平均,count() 求记录数,max() 求最大,min() 求最小
--如果需要查询列 必须要分组查询
select deptno,
sum(sal + comm),
avg(sal + comm),
count(1),
max(sal),
min(sal)
from teacher
group by deptno
--group by是分组函数,分组之前可以使用where 去筛选数据,分组之后条件筛选使用having并且列需要是聚合函数能查询的列,或分组类
select deptno,
gender,
sum(sal + comm),
avg(sal + comm),
count(1),
max(sal),
min(sal)
from teacher
-- where sal>1000
group by deptno,gender -- 可以按多个字段分组
-- having sal>18000
having avg(sal + comm)>5000
order by max(sal) desc -- 分组之后可以排序
select * from (
--将子查询作为父查询的表,子查询会将结果放在临时表
select deptno,
sum(sal + comm),
avg(sal + comm) avgSal,
count('x'),
max(sal),
min(sal)
from teacher
group by deptno
) t where t.avgSal>200
其他函数
--如果前面的值为null 则使用后面的代替
select tno,tname,nvl(job,'待定') from teacher
--如果job不为空则使用 第二参数 否则使用第三个参数
select tno,tname,nvl2(job,'正式员工','临时工') from teacher
select * from dept
--decode多条件的判断显示 可以避免子查询
select tno,tname,tid,decode(deptno,10,'教学部','有关部门') from teacher
select * from teacher where deptno=10