第三章 单行函数


学习目标:

  • SQL中不同类型的函数
  • 在select语句中使用字符,数字,日期和转换函数
  • 使用条件表达式

两种SQL函数:单行函数和多行函数

单行函数:

  • 操作数据对象
  • 接受参数返回一个结果
  • 只对一行进行交换
  • 每行返回一个结果
  • 可以转换数据类型
  • 可以嵌套
  • 参数可以是一列或一个值

1.字符函数

(1) 大小写控制函数:
select lower ('ATGUIGUJAVA'),Upper('AtGuiGu Java'),initcap('AtGuiGu java')
	from dual;
	-- atguigujava    ATGUIGU JAVA     Atguigu Java
(2) 字符控制函数:
select concat('hello','world'),substr('helloworld',2,4),length('HELLOWORLD')
	from dual;
	--helloworld  ello   10
select instr('helloworld','l') from dual;
--3
select instr('hellojava','w') from dual;
--0
select employee_id ,last_name,ipad(salary,10,'*'),rpad(salary,10,'')
	from employees;
	--ipad:把salary输出,长度为10,从右侧开始输出,用*补全
	--rpad:把salary输出,长度为10,从左侧开始输出,用空格补全
select trim('h','hhhellohworldh') from dual;
--ellohworld,trim消除的是首尾的h
select replace ('abcdab','b','m') from dual;
--replace()用m代替b,替换所有的b
--amcdam

2.数字函数

select round (435.45,2),round(435.45),round(435.45,-2) from dual;
--435.45   435   400
select trunc (435.45,1),trunc(435.45),trunc(435.45,-1) from dual;
--435.4   435   430
select mod(1100,100) from dual;
--0,取余
select mod(1100,300) from dual;
--200

3.日期函数:

函数 描述
MONTHS_BETWEEN 两个日期相差的月数
ADD_MONTHS 向指定日期中加上若干月数
NEXT_DAY 指定日期的下一个星期几对应的日期
LAST_DAY 本月的最后一天
ROUND 日期四舍五入
TRUNC 日期截断

Oracle中的日期型数据实际含有两个值:日期和时间

(1)日期的数学运算:
  • 在日期上加上或减去一个数字结果仍为日期。
  • 两个日期相减返回日期之间相差的天数。日期不允许做加法运算,无意义。
  • 可以用数字除24来向日期中加上或减去天数。
select employee_id,last_name,trunc(sysdate-hiredate) worked_days
	from employees;
select employee_id,last_name,sysdate-hiredate worked_months
	from employees;
select employee_id,last_name,sysdate-hiredate worked_months,months_between(sysdate,hire_date)
	from employees;
select add_months(sysdate,2),add_months(sysdate,-3),next_day(sysdate,'星期一')
	from dual;
	--2020/3/7 13:50:10  2019/10/7 13:50:10  2020/1/13 13:50:10
--来公司的员工中,hire_date是每个月倒数第二天来有哪些?
select last_name,hire_date
	from emlpoyees
	where hire_date=last_day(hire_date);
select round(syssqlate,'month'),round(sysdate,'mm'),trunc(sysdate,'HH')
	from dual;
	--2020/1/1  2020/1/1  2020/1/7 14:00:00
	--round()过半舍掉,trunc()全部舍去
(2)隐式数据类型转换

Oracle自动完成下列转换:

源数据类型 目标数据类型
VARCHAR2 or CHAR NUMBER
VARCHAR2 or CHAR DATE
NUMBER VARCHAR2
DATE VARCHAR2
select '12'+2 from dual;
--14
select sysdate+2 from dual;
--2020/1/9 14:13:00
(3)显示数据类型转换
select employee_id,to_char(hire_date,'yyyy"年"mm"月"dd"日"')
	from employees
	--where hire_date='7-6月-94';
	--where to_char(hire_date,'yyyy-mm-dd')='1994-06-07';
	--where to_date('1994-06-07','yyyy-mm-dd')=hire_date;
	--where to_char(hire_date,'yyyy"年"mm"月"dd"日"')='1994年06月07日';
select to_char(1234567.89,'999,999,999.99')
	from dual;
	-- 1,234,567.89
select to_char(1234567.89,'$000,000,999.99')
	from dual;
	-- $001,234,567.89
select to_char(1234567.89,'l000,000,999.99')
	from dual;
	--¥001,234,567.89
select to_number('¥001,234,567.89','l000,000,999.99') +1
	from dual;
	--1234568.89
(4)通用函数

这些函数适用于任何数据类型,同时也适用于空值:

  • NVL(expr1,expr2)
  • NVL2(expr1,expr2,expr3)
  • NULLIF(expr1,expr2)
  • COALESCE(expr1,expr2,…,expr n)
NVL函数:

将空值转换为一个已知的值:

  • 可以使用的数据类型有日期、字符、数字。

  • 函数的一般形式:

    -NVL(commission_pct,0)

    -NVL(hire_date,‘01_JAN-97’)

    -NVL(job_id,‘No Job Yet’)

--求公司员工的年薪(commission_pct)
select employee_id,last_name,salary*12*(1+nvl(commission_pct,0)) "annual salary"
from employees;
--输出last_name,department_id,当department_id为null时,显示'没有部门'
select last_name,nvl(to_char(department_id,'9999'),'没有部门')
	from employees;
NVL2函数

NVL2(expr1,expr2,expr3):expr1不为NULL,返回expr2;为NULL,返回expr3。

--查询员工的奖金率,若为空,返回0.01,
--若不为空,返回实际奖金率+0.015
select last_name,commission_pct,NVL2(commission_pct,commission_pct+0.015,0.01)
from employees;
NVLLIF函数

NVLLIF(expr1,expr2):相等返回NULL,不等返回expr1

COALESCE函数
  • COALESCE与NVL相比的优点在于COALESCE可以同时处理交替的多个值。
  • 如果第一个表达式为空,则返回下一个表达式,对其他的参数进行COALESCE。
条件表达式
  • 在SQL语句中使用IF-THEN-ELSE逻辑

  • 使用两种方法:

    CASE表达式

    -DECODE函数

--查询部门号为10,20,30的员工信息
--若部门号为10,则打印其工资的1.1倍,
--20号部门,则打印其工资的1.2倍,
--30号部门打印其工资的1.3倍。
select employee_id,last_name,case department_id when 10 then salary*1.1 
											when 20 then salary*1.2 
											else  salary*1.3 end new_sal
	from employees
	where department_id in (10,20,30);
DECODE函数
select employee_id,last_name,department_id,decode(department_id,10,salary*1.1,
                                                 			   20,salary*1.2
                                                 			   salary) new_sal
	from employees
	where department_id in (10,20,30);
发布了8 篇原创文章 · 获赞 11 · 访问量 929

猜你喜欢

转载自blog.csdn.net/qq_41241814/article/details/103877834