函数
函数一般是在数据上执行的,它给数据的转换和处理提供了方便。只是将取出的数据进行处理,不会改变数据库中的值。
函数根据处理的数据分为单行函数和聚合函数(组函数)
组函数又被称作聚合函数,用于对多行数据进行操作,并返回一个单一的结果,组函数仅可用于选择列表或查询的having子句
单行函数对单个数值进行操作,并返回一个值。
dual是一个系统表。注意用于测试。
字符相关
-- 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;
数值型函数
-- 数值型函数
-- 四舍五入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;
日期函数
-- 返回系统当前时间
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;
转换函数
转换函数就是把字符、日期、数值型数据进行相互转换。类型转换分两种:隐式类型转换和显式类型转换
组函数(A)
组函数把多行数据经过运算后返回单个值。也称聚合函数。
-- 求公司雇员的数量
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);
分组(group by)(A)
在处理统计或聚合数据时,很多时候需要对数据进行分组 语法
select field1,。。。
from tableName
group by field1[,field2,…]
按照field1[,field2,…] 分组,字段值相同的记录分到一组。
group by的工作原理
对数据进行分组后,select语句的字段值只能是分组字段或者聚合函数。
[1]分组和聚合函数
-- 需求:求各个部门的人数
select e.deptno,e.ename
from emp e
group by e.deptno;
-- 需求:统计部门10的人数
select count(1)
from emp e
where e.deptno = 10;
-- 需求:求各个部门的人数
select e.deptno,e.ename
from emp e
group by e.deptno;
-- 需求:求各个部门的平均薪资
select e.deptno,avg(e.sal)
from emp e
group by e.deptno
-- 需求:求各个部门的月收入平均值
select e.deptno,avg(e.sal+nvl(e.comm,0))
from emp e
group by e.deptno
[2]null值归为一组
-- 特例:按照津贴分组
select e.comm,count(1)
from emp e
group by e.comm
having
如果需要对分组的数据进行条件过滤,必须使用having!!!
-- group by having
-- 查询部门平均薪资大于3000的部门
select e.deptno
from emp e
group by e.deptno
having avg(e.sal) > 3000
-- 查询部门薪资大于3000的雇员按部门分组的平均薪资
select e.deptno,avg(e.sal)
from emp e
where e.sal > 3000
group by e.deptno;
注意:
[1] Where过滤行,having过滤分组。
[2] Having支持所有where操作符。