Oracle第四章单行函数理解+剖析

Oracle第四章单行函数理解+剖析

闲话不多说,开始主题

练习1写一个查询,用首字母大写,其它字母小写显示雇员的 ename,显示名字的长度,并给每列一个适当的标签,条件是满足所有雇员名字的开始字母是J、A 或 M 的雇员,并对查询结果按雇员的ename升序排序。(提示:使用initcap、length、substr)

select nls initcap(enama) 姓名,length(ename) 姓名长度
from emp
where substr(ename,1,1) in('A','J','M')
order by ename asc;

练习2.1 查询员工姓名中中包含大写或小写字母A的员工姓名

select ename 员工姓名 from emp where ename like '%A%' or ename like '%a%'
练习2.2 查询部门编号为10或20,入职日期在81年5月1日之后,并且姓名中包含大写字母A
 的员工姓名,员工姓名长度(提示,要求使用INSTR函数,不能使用like进行判断)
select ename 员工姓名,length(ename) 姓名长度,hiredate 入职时间,deptno 部门编号
from emp
where deptno in(10,20) and hiredate>to_date('1981-05-01','yyyy-mm-dd') and instr(ename,'A',1,1)>0;

练习2.3 查询每个职工的编号,姓名,工资要求将查询到的数据按照一定的格式合并成一个字符串。
前10位:编号,不足部分用填充,左对齐
中间10位:姓名,不足部分用
填充,左对齐
后10位:工资,不足部分用*填充,右对齐

select LPAD(empno,10,'*') 编号,LPAD(ename,10,'*') 姓名,RPAD(sal,10,'*')
from emp

练习3.1写一个查询,分别计算100.456 四舍五入到小数点后第2位,第1位,整数位的值。

select round(100.456,2),round(100.456,1) from dual;

练习3.2 写一个查询,分别计算100.456 从小数点后第2位,第1位,整数位截断的值。

select trunc(100.456,2),trunc(100.456,1) from dual;

练习4.1 查询每个员工截止到现在一共入职多少天?

select trunc(sysdate-hiredate) 共入职天数 from emp;

练习5.1查询服务器当前时间

select sysdate 当前时间 from dual;

练习5.2 查询部门10,20的员工截止到2000年1月1日,工作了多少个月,入职的月份。

(提示:使用months_between,extract)

select months_between(to_date('2000-01-01','yyyy-mm-dd'),hiredate),extract(month from hiredate)
from emp
where deptno in(10,20);

练习5.3如果员工试用期6个月,查询职位不是MANAGER的员工姓名,入职日期,转正日期,入职日期后的第一个星期一,入职当月的最后一天日期。

(提示:使用add_months,next_day,last_day)

select ename 员工姓名,hiredate 入职日期,add_months(hiredate,6) 转正日期,next_day(hiredate,'星期一') 入职后的第一个星期, last_day(hiredate)
from emp
where job <> 'MANAGER';

练习6.1 显示服务器系统当前时间,格式为2007-10-12 17:11:11(提示:使用to_char函数)

select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual;
	 (注意:to_date函数不支持括号里出现两次格式代码,比如mm,
	 如果mm代表月,然后又在分钟里面用mm表示,则会报错,所以mi替代mm表示分钟
	 如果是to_char函数,在分钟里面用mm的话,虽然不会报错,但是结果是错的,
	 它返回的分钟是默认的初始值,而不是我们想要的当前的分钟值)

练习6.2 显示ename、hiredate 和 雇员开始工作日是星期几,列标签DAY(提示:使用to_char函数)

select ename,hiredate,to_char(hiredate,'day') from emp;

练习6.3查询员工姓名,工资,格式化的工资(¥999,999.99) (提示:使用to_char函数)

select ename 姓名,sal 工资,to_char(sal,'$999,999.99') from emp;

练习6.4 把字符串2015-3月-18 13:13:13 转换成日期格式,并计算和系统当前时间间隔多少天。(提示:使用to_date函数)

select to_date('2015-3月-18 13:13:13','yyyy-mm"月"-dd hh24:mi:ss'),trunc(sysdate-to_date('2015-3月-18 13:13:13','yyyy-mm"月"-dd hh24:mi:ss')) 
from dual

—课后作业-----
1.计算2000年1月1日到现在有多少月,多少周(四舍五入)。

select round(months_between(sysdate,to_date('2000-01-01','yyyy-mm-dd'))) 相隔月,round(months_between(sysdate,to_date('2000-01-01','yyyy-mm-dd'))/7) 相隔周
from emp

2.查询员工ENAME的第三个字母是A的员工的信息(使用2个函数)。

select ename
from emp
where ename like '__A%' and instr(ename,'A',1,1)=3;

4.将员工工资按如下格式显示:123,234.00 RMB 。

select to_char(sal,'999,999.00')||RAM 员工工资 from emp;

–5.查询员工的姓名及其经理编号,要求对于没有经理的显示“No Manager”字符串。
(注意:如果nvl括号里面的数据类型不一致,那么会转换成前一个。)

select ename 员工姓名,nvl(to_char(mar),'NO Manager') 经理编号 from emp;

6.将员工的参加工作日期按如下格式显示:月份/年份。

select to_char(hiredate,'mm/yyyy') from emp;

7.在员工表中查询出员工的工资,并计算应交税款:如果工资小于1000,税率为0,如果工资大于等于1000并小于2000,税率为10%,如果工资大于等于2000并小于3000,税率为15%,如果工资大于等于3000,税率为20%。

select sal 员工工资,
case
	when sal<1000 then sal*0
	when sal>=1000 and sal<2000 then sal*0.1
	when sal>=2000 and sal<3000 then sal*0.15
	when sal>=3000 then sal*0.2
end 应交税
from emp

8.创建一个查询显示所有雇员的 ename和 sal。格式化sal为 15 个字符长度,用 $ 左填充,列标签 SALARY。

select ename,sal,lpad(sal,15,'$) from emp

版权声明:本文为weixin_44366366原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。