SQL函数:
函数一般是在数据上执行的,它给数据的转换和处理提供了方便,只是将取出的数据进行处理,不会改变数据库中的数据。
sql函数可以分成组函数和单行函数。
单行函数
输入一个值,输出一个值
分类: 字符函数,数字函数,日期函数,转换函数和其它函数。
字符函数:
以字符作为参数,返回值分为两类,一类返回字符值,一类返回数字值。
--concat:表示字符串的连接 等同于||
select concat('my name is ', ename) from emp;
--将字符串的首字母大写
select initcap(ename) from emp;
--将字符串全部转换为大写
select upper(ename) from emp;
--将字符串全部转换为小写
select lower(ename) from emp;
--填充字符串
select lpad(ename,10,'*') from emp; --左填充
select rpad(ename,10,'*') from emp; --右填充
--去除空格
select trim(ename) from emp;
select ltrim(ename) from emp; -- 去掉左边的空格
select rtrim(ename) from emp; -- 去掉右边的空格
select ltrim('gao qian jingXXXX','X') text from dual; --删掉左边的x字符串
select rtrim('gao qian jingXXXX','X') text from dual;
--删掉右边的x字符串
--查找指定字符串的位置
select instr('ABABCDEF','A') from emp;
--查看字符串的长度
select length(ename) from emp;
--截取字符串的操作
select substr(ename,0,2) from emp;
--替换操作
select replace('ababefg','ab','hehe') from emp;
数值函数:
数值函数以number类型为参数返回number类型。
--给小数进行四舍五入操作,可以指定小数部分的位数
select round(123.123,2) from dual;
select round(123.128,2) from dual;
select round(-123.128,2) from dual;
--截断数据,按照位数去进行截取,但是不会进行四舍五入的操作
select trunc(123.128,2) from dual;
--取模操作
select mod(10,4) from dual;
select mod(-10,4) from dual;
--向上取整
select ceil(12.12) from dual;
--向下取整
select floor(13.99) from dual;
--取绝对值
select abs(-100) from dual;
--获取正负值
select sign(-100) from dual;
--x的y次幂
select power(2,3) from dual;
日期函数:
select sysdate from dual;
select current_date from dual;
--add_months,添加指定的月份
select add_months(hiredate,2),hiredate from emp;
--返回输入日期所在月份的最后一天
select last_day(sysdate) from dual;
--两个日期相间隔的月份
select months_between(sysdate,hiredate) from emp;
--返回四舍五入的第一天
select sysdate 当时日期,
round(sysdate) 最近0点日期,
round(sysdate,'day') 最近星期日,
round(sysdate,'month') 最近月初,
round(sysdate,'q') 最近季初日期,
round(sysdate,'year') 最近年初日期 from dual;
--返回下周的星期几
select next_day(sysdate,'星期一') from dual;
--提取日期中的时间
select
extract(hour from timestamp '2001-2-16 2:38:40 ' ) 小时,
extract(minute from timestamp '2001-2-16 2:38:40 ' ) 分钟,
extract(second from timestamp '2001-2-16 2:38:40 ' ) 秒,
extract(DAY from timestamp '2001-2-16 2:38:40 ' ) 日,
extract(MONTH from timestamp '2001-2-16 2:38:40 ' ) 月,
extract(YEAR from timestamp '2001-2-16 2:38:40 ' ) 年
from dual;
--返回日期的时间戳
select localtimestamp from dual;
select current_date from dual;
select current_timestamp from dual;
--给指定的时间单位增加数值
select
trunc(sysdate)+(interval '1' second), --加1秒(1/24/60/60)
trunc(sysdate)+(interval '1' minute), --加1分钟(1/24/60)
trunc(sysdate)+(interval '1' hour), --加1小时(1/24)
trunc(sysdate)+(INTERVAL '1' DAY), --加1天(1)
trunc(sysdate)+(INTERVAL '1' MONTH), --加1月
trunc(sysdate)+(INTERVAL '1' YEAR), --加1年
trunc(sysdate)+(interval '01:02:03' hour to second), --加指定小时到秒
trunc(sysdate)+(interval '01:02' minute to second), --加指定分钟到秒
trunc(sysdate)+(interval '01:02' hour to minute), --加指定小时到分钟
trunc(sysdate)+(interval '2 01:02' day to minute) --加指定天数到分钟
from dual;
转换函数:
基本转换函数:
日期指定格式:
number指定格式:
示例:
select '999'+10 from dual; --隐式转换
--date :to_char
select to_char(sysdate,'YYYY-MI-SS HH24:MI:SS') from dual;
-- number : to_char
select to_char(123.456789,'9999') from dual;
select to_char(123.456789,'0000.00') from dual;
select to_char(123.456789,'$0000.00') from dual;
select to_char(123.456789,'L0000.00') from dual;
select to_char(123456789,'999,999,999,999') from dual;
--to_date:转换之后都是固定的格式
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;
其它函数
--条件函数
--decode,case when
--给不同部门的人员涨薪,10部门涨10%,20部门涨20%,30部门涨30%
select ename,sal,deptno,decode(deptno,10,sal*1.1,20,sal*1.2,30,sal*1.3) from emp;
select ename,
sal,
deptno,
case deptno
when 10 then
sal * 1.1
when 20 then
sal * 1.2
when 30 then
sal * 1.3
end
from emp;
组合函数:
组函数基于多行数据返回单个值
/*
组函数,一般情况下,组函数都要和groupby组合使用
组函数一般用于选择列表或者having条件判断
常用的组函数有5个
avg() 平均值,只用于数值类型的数据
min() 最小值,适用于任何类型
max() 最大值,适用于任何类型
count() 记录数,处理的时候会跳过空值而处理非空值
count一般用来获取表中的记录条数,获取条数的时候可以使用*或者某一个具体的列,甚至可以使用纯数字来代替,但是从运行效率的角度考虑,建议使用数字或者某一个具体的列而不要使用*
sum() 求和,只适合数值类型的数据
*/
select avg(sal) from emp;
select min(sal) from emp;
select max(sal) from emp;
select count(sal) from emp;
select sum(sal) from emp;
--group by,按照某些相同的值去进行分组操作
--group进行分组操作的时候,可以指定一个列或者多个列,但是当使用了groupby 之后,
--选择列表中只能包含组函数的值或者group by 的普通字段
--求每个部门的平均薪水
select avg(sal) from emp group by deptno;
--求平均薪水大于2000的部门
select avg(sal),deptno from emp where sal is not null group by deptno having avg(sal) >2000 order by avg(sal);
注意:
1 除了组函数语句外,select语句中的每个列必须在group子句中给出。
2 如果分组列中具有null值,则null将作为一个分组返回,如果列中有多行null,他们会作为一组返回。
3 group by语句chux出现在where子句之后,order by子句之前。
4 where 过滤行,having guol过滤分组。
5 一般在使用group by 子句的时候,应该也给出order by子句。
6 不能再where子句中使用子函数,不能再wewhere子句中限制组,使用having对组进行限制。
基本格式:
SELECT column, group_function
▪ FROM table
▪ [WHERE condition]
▪ [GROUP BY group_by_expression]
▪ [ORDER BY column];
▪ [having condition]
▪ 使用GROUP BY子句将表分成小组
▪ 结果集隐式按降序排列,如果需要改变排序方式可以使用Order by 子句
select子句执行格式:
Sql语句执行过程:
1. 读取from子句中的基本表、视图的数据,[执行笛卡尔积操作]。
2. 选取满足where子句中给出的条件表达式的元组
3. 按group子句中指定列的值分组,同时提取满足Having子句中组条件表达
式的那些组
4. 按select子句中给出的列名戒列表达式求值输出
5. Order by子句对输出的目标表进行排序。