05.单行函数与多行函数【聚合函数】

单行函数与多行函数【聚合函数】

以下演示将在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). 日期函数的运算

  1. 日期 – 数字 = 日期
  2. 日期 + 数字 = 日期
  3. 日期 – 日期 = 数字

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. 案例

  1. 等值判断】为查询结果取别名
select e.ename,
       case e.ename
         when 'SMITH' then '史密斯'
           when 'ALLEN' then '爱丽丝'
             when 'WARD' then '守卫'
               else '无名之辈'
                 end
from emp e;
  1. 范围判断】判断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; -- 平均值

你可能感兴趣的:(05.单行函数与多行函数【聚合函数】)