一、表展示
二、练习题及答案
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)