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