Oracle数据库练习题(3)

一、表展示

Oracle数据库练习题(3)_第1张图片

Oracle数据库练习题(3)_第2张图片

二、练习题及答案

 

 

31.找出有佣金的员工的不同工作,按降序排列

select job, comm from empgj where comm is not null order by comm desc;
select job, comm from empgj where comm != 0 order by comm desc;

SQL中判断非空(null)不能用等号,因为null在SQL中被看作特殊符号,必须使用关键字 is和not,如第一句所示

排序写法:order by +字段名+ 排序方式(asc/desc)
asc:按升序排列,也是默认排序可省略不写
desc:按降序排列

 

32.找出不收取佣金或收取的佣金低于500的员工

select ename, comm
  from empgj
 where nvl(comm, 0) = 0
    or comm < 500;

33.找出各月倒数第3天受雇的所有员工并且按月降序排序

select ename, hirdate
  from empgj
 where last_day(hiredate) - 2 = hiredate
 order by to_char(hiredate, 'mm') desc;

这里to_char()函数取出了雇佣日期的月份,因为在向表插数据时已经规定好了格式:

insert into empgj(empno,ename,job,mgr,hiredate,sal,comm,deptno) values     
 (7369,'smith','clerk',7902,to_date('1980-12-17','yyyy/mm/dd'), 800.00,'',20); 

to_char()函数的用法可参考这里:点击打开链接

last_day()函数的用法可参考这里:点击打开链接

34.找出早于12年前受雇的员工,并且按年来分组,倒序排序

(1)select ename, to_char(hiredate, 'yyyy')
  from empgj
 where to_char(hiredate, 'yyyy') < (to_char(sysdate, 'yyyy') - 13)
 order by to_char(hiredate, 'yyyy') desc;
(2)select ename, to_char(hiredate, 'yyyy')
  from empgj
 where months_between(sysdate, hiredate) / 12 > 12
 order by to_char(hiredate, 'yyyy') desc;

两种写法不同的是计算受雇年限的方法不同,第一种直接算年差,第二种算月差然后除以12得年差
 

34.以首字母大写的方式显示所有员工的姓名

select initcap(ename) from empgj;

initcap() 返回字符串并将字符串的第一个字母变为大写

 

35.显示正好为5个字符的员工的姓名

select ename from empgj where length(ename) = 5;

36.显示不带有"R"的员工的姓名

select ename from empgj where ename not like '%R%';

37.显示所有员工姓名的前三个字符

select substr(ename, 1, 3), ename from empgj;

substr()函数的用法可参考这里:点击打开链接

38.显示所有员工的姓名,用A替换所有"a"

select ename, replace(ename, 'a', 'A') from empgj;

replace()函数用法:replace(原字段,"原字段旧内容","原字段新内容")

39.显示员工的详细资料,按姓名排序

select empno, ename, job, mgr, hiredate, sal, comm, deptno
  from empgj
 order by ename;

40.显示所有员工的姓名、工作和薪金,按工作的降序排序,若工作相同则按薪金排序

select ename, job, sal from empgj order by job desc, sal asc;

order by 后面跟多列时,先按第一列排,再按第二列排,以此类推

order by用法可以参考这里:点击打开链接

41.显示所有员工的姓名、加入公司的年份和月份,按受雇日期所在月排序,若月份相同则将最早年份的员工排在最前面

select ename,
       to_char(hiredate, 'yyyy') as year,
       to_char(hiredate, 'mm') as month
  from empgj
 order by month asc , year asc;

order by可使用字段别名来为字段排序

42.显示在一个月为30天的情况所有员工的日薪金,保留2位小数

select ename, round(sal / 30, 2) dailysal from empgj;

round()函数用法可以参考这里:点击打开链接

43.找出在(任何年份的)2月受聘的所有员工

select ename, hiredate from empgj where to_char(hiredate, 'mm') = 2;

44.对于每个员工,显示其加入公司的天数,不带余数

(1)select ename, (to_date(sysdate) - to_date(hiredate) + 1) from empgj;
(2)select ename, round(sysdate - hiredate, 0) from empgj;

方法(1)的计算可以参考本系列博客--Oracle数据库练习题(2)第21条

45.显示姓名字段的任何位置包含"A"的所有员工的姓名,如果相同位置的按名字排序

select ename from empgj where ename like '%a%' order by ename;

46.显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面

select ename, hiredate
  from empgj
 order by months_between(sysdate, hiredate) / 12 desc;
select ename, hiredate from empgj order by hiredate;

Oracle数据库练习题(1)

Oracle数据库练习题(2)

 

 

 

你可能感兴趣的:(学习积累)