单行函数与多行函数【聚合函数】
以下演示将在scott用户下进行;
dual
表示虚表,为了填充语法,没有实际意义
单行函数:作用于一行,返回一个值
一、字符函数【单行函数】
select upper('upper') from dual; -- 变大写
select lower('LOWER') from dual; -- 变小写
练习:根据 API 学习:首字母大写函数、字符串链接函数、字符串截取函数、字符串替换函数、获取字符串长度函数等。
二、数值函数【单行函数】
-- 四舍五入,第二个参数表示保留的位数,
-- 正整数就向小数点后保留,负整数就向小数点前前保留;
-- 不写第二个参数默认保留0位小数
select round(56.16, 1) from dual;
-- 直接截取,与round类似,只是不再四舍五入
select trunc(56.16, -2) from dual;
-- 求余数
select mod(10, 3) from dual;
练习:根据 API 学习:数值截取函数、取余函数等
三、日期函数【单行函数】
sysdate 表示当前系统时间
1). 日期函数的运算
- 日期 – 数字 = 日期
- 日期 + 数字 = 日期
- 日期 – 日期 = 数字
2). 案例演示
--- 查询出emp表中所有员工入职距离现在有多少天
select sysdate - e.hiredate from emp e;
--- 算出明天此刻
select sysdate + 1 from dual;
--- 查询出emp表中所有员工入职距离现在几个月,【只有月有这个函数】
select months_between(sysdate, e.hiredate) from emp e;
--- 查询出emp表中所有员工入职距离现在几年
select months_between(sysdate, e.hiredate)/12 from emp e;
--- 查询出emp表中所有员工入职距离现在几周,四舍五入
select round((sysdate-e.hiredate)/7) from emp e;
四、转换函数【单行函数】
对日期的转换 匹配格式不区分大小写
1). to_char: 将日期转换为字符串
-- 将当前日期转换成字符串
select to_char(sysdate, 'yyyy-mm-dd hh:mi:ss') from dual;
-- fm 取消自动补0
select to_char(sysdate, 'fm yyyy-mm-dd hh:mi:ss') from dual;
-- 24小时计数法
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;
-- 查询所有的雇员将将年月日分开
select
empno,
ename,
to_char(hiredate, 'yyyy') 年,
to_char(hiredate, 'mm') 月,
to_char(hiredate, 'dd') 日
from emp;
2). to_date:将字符串转换为日期类型
模式得对应匹配,比如 fm 24小时制
-- 将字符串转换成日期
select to_date('2019-02-09 16:23:50', 'yyyy-mm-dd hh24:mi:ss') from dual;
五、通用函数【单行函数,常用】
通用,MySQL等关系型数据库中也可以使用
1). 空值null处理nvl
使用
nvl(notNullChoiceMe, ifNullChoiceMe)
进行判断,第一个参数是需要查询的值,如果是null,则使用第二个参数,否则使用本身
select e.sal * 12 + nvl(e.comm, 0) from emp e;
2). case when: 条件表达式
1. 语法
CASE expr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END
2. 案例
- 【等值判断】为查询结果取别名
select e.ename,
case e.ename
when 'SMITH' then '史密斯'
when 'ALLEN' then '爱丽丝'
when 'WARD' then '守卫'
else '无名之辈'
end
from emp e;
- 【范围判断】判断emp表中员工工资,如果高于3000显示高收入,如果咋1500~3000显示中等,其余显示低收入。
select e.ename, e.sal,
case
when e.sal > 3000 then '高收入'
when e.sal > 1500 and e.sal < 3000 then '中等收入'
else '低收入'
end
from emp e;
3). decode函数【Oracle方言,了解】
该函数类型于if...else if...else;不建议使用
1. 语法
DECODE(col/expression, [search1,result1],[search2, result2]....[default])
- 参数介绍
- Col/expression: 列名或表达式
- Search1,search2...: 用于比较的条件
- Result1, result2...: 返回值
- 如果col/expression 和 Searchi匹配就返回resulti,否则返回default的默认值
2. 使用案例
select decode(0, 0, '我是0', 1, '我是1', '我是!0&&!1') resu from dual;
-- 查询出所有雇员的职位中文名
select
ename,
decode( job,
'CLERK', '业务员',
'SALESMAN', '销售',
'PRESIDENT', '总裁',
'MANAGER','经理',
'nothing'
)
from
emp;
六、多行函数
5个聚合函数
-- 查询总数量, count(1)等同于count(主键),count(*)
-- 不建议使用count(*),应为影响性能
select count(1) from emp;
select sum(sal) from emp; -- 总和
select max(sal) from emp; -- 最大值
select min(sal) from emp; -- 最小值
select avg(sal) from emp; -- 平均值