单行函数:
select LOWER('ORACLE SQL') from dual;
dual 是oracle所提供的虚拟表 可以来供我们在测试过程中使用 测试函数
将字符串转换为大写:
select UPPER('oracle sql') from dual;
将每个单词的首字母大写:
select initcap('oracle sql') from dual;
--查询lastname 为De Haan 的雇员信息
select * from employees where last_name= initcap('de haan');
这类函数控制字符:
select concat('hello' ,'world') from dual;
--substr arg1:要截取字符串 arg2:截取的开始位置 arg3:截取的长度
select substr('helloworld',2,5) from dual;
--查找某一个字符或字符串在字符串中出现的位置 如果是一个字符串 则是首字母的位置
--如果查找的字符 或字符串不存在 则返回0
select instr('helloworld','wor') from dual;
--LPAD RPAD 判断字符串的长度是=是否满足给定的长度 如果不足 则在左边或右边使用
--给定的字符来补充
SELECT LPAD('helloworld',15,'*') from dual;
SELECT RPAD('helloworld',15,'*') from dual;
--TRIM 表示去除字符串两端的空格
select length('helloworld ')from dual;
select length(Trim('helloworld ')) from dual;
--REPLACE 替换
select replace('hello world','l','L')from dual;
--ROUND
SELECT ROUND(45.9362,0),ROUND(45.9362,2),ROUND(145.9362,-2) FROM dual;
--TRUNC
SELECT TRUNC(45.9362,0),TRUNC(45.9362,2),TRUNC(145.9362,-2) FROM dual
--MOD
SELECT MOD(1560,200) FROM dual;
--ROUND
SELECT ROUND(-45.9362,0),ROUND(-45.9362,2),ROUND(-145.9362,-2) FROM dual;
--TRUNC
SELECT TRUNC(-45.9362,0),TRUNC(-45.9362,2),TRUNC(-145.9362,-2) FROM dual
--MOD
SELECT MOD(-1560,200) FROM dual;
-- 查看系统当前日期
select sysdate from dual;
返回的结果包含了日期和时间两部分
--查询employees表中每个员工入职的工龄(年)
select first_name,last_name, round((sysdate-hire_date)/365) from employees;
-- 查询employees表中每个员工入职的月数
select first_name,last_name,months_between(sysdate,hire_date) from employees;
--add_months
select add_months(sysdate,3)from dual;
--next_day 下一个星期几(右第二个参数指定)的日期
select next_day(sysdate,'FRIDAY') from dual;
当前月的最后一天的日期
select last_day(sysdate) from dual;
日期时间与字符串 以及字符串与数字之间的相互转换
TO_CHAR(date, 'format_model')
格式:
SELECT TO_CHAR(sysdate,‘yyyy-mm-dd hh:mi:ss’) FROM dual;
日期格式的元素
时间格式
12小时制
hh:mi:ss AM
--12小时制
select to_char(sysdate,'yyyy-mm-dd hh:mi:ss')from dual;
--24小时制
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')from dual;
--查询入职时间为1994年之前的员工 将条件中的日期转换为date在和hiredate进行比较
select first_name,last_name,hire_date from employees where hire_date < to_date('2004-01-01','yyyy-mm:dd');
-- 将hire_date 转换为字符串 之后 在和'2004-01-01'
select first_name,last_name,hire_date from employees where to_char(hire_date,'yyyy-mm-dd') < '2004-01-01';
--特殊格式
select to_char(hire_date,'yyyy-MON-dd') from employees;
--特殊格式
select to_char(hire_date,'yyyy-MONTH-dd') from employees;
练习:返回hire_date 为 ****/**/**的员工信息,使用显示日期表达
TO_CHAR函数对数字的转换
注意对于货币只能使用$ 及L 其他符号不能使用
--查询所有雇员的薪资 并以$符开头 整数部分三位使用千位符进行分隔 小数部分使用00表示
select first_name,last_name,to_char(salary,'L999,999,999,999,999.00')from employees;
TO_NUMBER 函数对字符的转换
select to_number('$123456789123.12','L999999999999999999.00')from dual;
select to_number('$123456789123.12','$999999999999999999.00')from dual;
select to_number('123456789123.12','999999999999999999.00')from dual;
select to_number('123456789123.12')from dual;
这些函数适用于任何数据类型,同时也适用于空值:
这些函数适用于任何数据类型,同时也适用于空值:
NVL (expr1, expr2)
NVL2 (expr1, expr2, expr3)
NULLIF (expr1, expr2)
COALESCE (expr1, expr2, ..., exprn)
–nvl2 第一个参数为null 不论第二个参数是否为null 都取第三个数为结果
– 第一个参数不为null 结果为第二个参数的值
– 前边两个都为null 则取第三个参数的值
NVL2 (expr1, expr2, expr3) : expr1不为NULL,返回expr2;为NULL,返回expr3。
select nvl2(null,null,100)from dual;
--练习:查询员工的奖金率,若为空,返回0.01,若不为空,返回实际奖金率+0.015
select commission_pct,nvl2(commission_pct,commission_pct+0.015,0.01) from employees;
--NULLIF (expr1, expr2) : 相等返回NULL,不等返回expr1
--判断雇员的first_name和last_name的长度 如果长度相同则返回null
--不同则返回first——name的长度
select length(first_name) rexp1,length(last_name) rexp2 ,nullif(length(first_name),length(last_name)) from employees;
-- COALESCE 返回第一个非空的值 如果三个都为空 则返回null
select COALESCE(null,null,null) from dual;
NVL2 (expr1, expr2, expr3)-- 根据第一个值是否为空 来决定 当第一个expr1为空 这返回expr3 否则返回expr2
NULLIF (expr1, expr2)--判断两个值是否相等 如果相等则返回null 否则返回expr1
COALESCE (expr1, expr2, ..., exprn)--在参数列表中寻找第一个非空的值 并返回 如果全部为空 则返回null
在 SQL 语句中使用IF-THEN-ELSE 逻辑
使用两种方法:
CASE 表达式
DECODE 函数
在需要使用 IF-THEN-ELSE 逻辑时:
CASE expr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END
/*练习:查询部门号为 10, 20, 30 的员工信息,
若部门号为 10, 则打印其工资的 1.1 倍,
20 号部门, 则打印其工资的 1.2 倍,
30 号部门打印其工资的 1.3 倍数*/
select first_name,last_name,salary,department_id,
case department_id when 10 then salary * 1.1
when 20 then salary * 1.2
when 30 then salary * 1.3
else salary
end
from employees
where department_id in(10,20,30);
decode() 函数的语法:
Select decode(columnname,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
From talbename
Where
其中:columnname为要选择的table中所定义的column;
缺省值可以是你要选择的column name本身,也可以是你想定义的其他值,比如Other等;
主要作用:相当于IF语句, 将查询结果翻译成其他值。(即以其他形式表现出来)。
在需要使用 IF-THEN-ELSE 逻辑时:
--查询所有的职位 将职位名称全部翻译成中文
select * from jobs;
select job_id,job_title,
decode(job_title,'President','pre',
'Finance Manager','财务总监',
'Sales Manager','销售总监',
'Programmer' ,'程序员',
'other'
)
from jobs;
/*
根据雇员薪资 计算该雇员的个人所得税的税率,个人所得税的起征点为2000,
2000-3000 税率为0.09
3000-5000 税率为0.20
5000-7000 税率为0.30
7000-9000 税率为0.40
9000-12000 税率为0.42
12000-14000 税率为0.44
1400以上税率为0.45
*/
select first_name,last_name,salary,
decode(trunc(salary/2000,0),1,0.09,2,0.20,3,0.30,4,0.40,5,0.42,6,0.44,0.45)
tax_rate
from employees;
单行函数可以嵌套。
嵌套函数的执行顺序是由内到外。
--查询雇员中没有领导的雇员信息,
--如果该雇员没有经理,
--则将manager_id 修改为'No Manager'
--在此处 manager_id为number类型 因此 在使用nvl函数时 必须先转换为字符串
select first_name,last_name,manager_id+100,
nvl(to_char(manager_id),'no manager')||100--隐式转换 将此处的100转换为字符串
from employees;
通过本章学习,您应该学会: