oracle练习题Word文档格式.docx
《oracle练习题Word文档格式.docx》由会员分享,可在线阅读,更多相关《oracle练习题Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
fromemp
groupbydeptno
havingavg(sal)>
2000);
--查询出ward的工作所在地
SELECTloc
WHEREename='
WARD'
--查询出工资比ADAMS高的所有人、部门、所在地
SELECTa.ename,b.dname,a.sal
FROMempa,deptb
WHEREa.deptno=b.deptno
ANDa.sal>
(
SELECTsal
ADAMS'
--查询出工资排名第7的员工信息
FROM(
SELECTrank()OVER(ORDERBYsalDESC)ASrk,emp.*
)
WHERErk=7;
/*minue:
两个结果值相减,
uniou:
两个结果集拼到一起
(1~7)-(1~6)=排名第7
*/
--查询与部门20岗位不同的员工工资
SELECTsal,job,deptno
WHEREjobNOTIN(
SELECTjob
WHEREdeptno=20
--验证--20部门的岗位
/*selectjob
fromemp
wheredeptno=20;
--查询与smith部门岗位完全相同的员工、工作、工资
SMITH'
ANDjobIN(
--查询emp表中的所有信息
select*
fromemp;
--查询emp表中的员工和工资
selectename,sal
--查询emp表中部门编号为20的并且sal大于3000的所有员工信息
wheredeptno=20andsal>
3000;
--查询emp表中部门编号为20的或者sal大于3000的所有员工信息
wheredeptno=20orsal>
--使用betweenand查询工资在2000到4000之间的员工
wheresalbetween2000and4000;
--使用in查询部门编号10,20的所有员工
wheredeptnoin(10,20);
--使用like查询所有名字中包括W的员工信息
select*
whereenamelike'
%W%'
--使用like查询所有员工名字中的第二子字母为W的员工信息
whereenamelike'
_W%'
--查询所有员工信息并按照部门编号和工资进行排序
orderbydeptno,sal;
--显示员工共工资上浮20%的结果
selectsal+sal*0.2
/*最后一题的另一种思路
minue:
--11显示emp表的员工以及工资和奖金的和
--12显示dept表的容,使用别名将表头转换成中文显示
--13查询员工和工资,并按工资从小到大排序
--14查询员工和雇佣日期,并按雇佣日期排序,后雇佣的先显示
--15查询员工信息,先按部门标号从小到大排序,再按雇佣日期的先后排序
多表查询练习
/*多表查询练习*/
select*fromempwherejob='
MANAGER'
select*fromdept;
select*fromsalgrade;
--列出在部门sales工作的员工的
selectename
fromempa,deptb
whereb.dname='
SALES'
anda.deptno=b.deptno;
--列出所有员工的,部门名称和工资
selectename,dname,salfromempa,deptbwherea.deptno=b.deptno;
--列出所有部门的详细信息和部门人数
select*
fromdept
fulljoin(selectdeptno,count(*)fromempgroupbydeptno)bondept.deptno=
b.deptno;
--列出各个部门职位为manager的最低薪金
selectdeptno,min(sal)最低薪金
wherejobin'
groupbydeptno;
--查询出部门人数至少是1的部门名字
selectdname
fulljoin(selectdeptno,count(*)人数fromempgroupbydeptno)bondept.deptno=
b.deptno
where人数>
=1;
--列出工资比smith多的员工
select*fromempwheresal>
(selectsalfromempwhereename='
--列出所有员工的对应领导的
selecta.*,b.ename领导fromempaleftjoinempbonb.empno=a.mgr;
--求出某个员工的领导,并要求这些领导的薪水高于或等于3000
selecta.ename,a.sal
fromempa,empb
wherea.empno=b.mgr
anda.sal>
=3000;
--列出部门名称,和这些部门的员工信息
selectdname,a.*fromempa,deptbwherea.deptno=b.deptno;
--列出所有职位为clerk的员工及其部门名称,部门的人数
SELECTename,dname,a.*,job
FROMemp,deptb
FULLJOIN(SELECTdeptno,COUNT(*)AS人数FROMempGROUPBYdeptno)aONb.deptno=
a.deptno
WHEREemp.deptno=a.deptno
ANDjob='
--列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级
selecte1.ename,dname,e2.ename领导,e1.sal,s.grade
fromempe1,deptd,empe2,salgrades
wheree1.mgr=e2.empno(+)
ande1.deptno=d.deptno
ande1.sal>
(selectavg(sal)fromemp)
ande1.salbetweens.losalands.hisal;
--列出与scott从事相同工作的所有员工共及部门名称
selectename,dname
fromdeptd,empe
whered.deptno=e.deptno
ande.job=(selectjobfromempwhereename='
SCOTT'
--列出薪金大与部门30中的任意员工的薪金的所有员工的和薪金
selectename,sal
wheresal>
ANY(selectsalfromempwheredeptno=30);
--列出薪金大雨部门30中的全部员工的信息的所有员工的和薪金,部门名称
SELECTe.*,dname
FROMempe,deptd
WHEREsal>
ALL(SELECTsalFROMempWHEREdeptno=30)
ANDd.deptno=e.deptno;
--列出每个部门的员工数量,平均工资
SELECTcount(*)人数,avg(sal),deptnoFROMempGROUPBYdeptno;
--列出每个部门的员工数量,平均工资和平均服务期限(月)
selectdeptno,
count(*)员工数量,
trunc(avg(sal+nvl(comm,0)))平均工资,
to_char(to_date('
0001-01'
'
yyyy-mm'
)+avg(sysdate-hiredate)-366-31,
'
yy"
年"
mm"
月'
)平均服务期限
/*selectsysdatesysdate+(sysdate-hiredate),
fromemp*/
--列出各种工作的最低工资及从事工资最低工资的雇员名称
selecte.ename,a.*
fromempe
rightjoin(selectmin(sal)最低工资,jobfromempgroupbyjob)aone.job=
a.job
wheree.sal=a.最低工资;
--求出部门名称带字符‘S’的部门员工,工资合计,部门人数
selectdname,a.*
fromdeptd
fulljoin(selectsum(sal)工资合计,deptnofromempgroupbydeptno)aond.deptno=
wherednamelike'
%S%'
--求出部门平均工资以及等级
selectd.dname,b.*,s.grade
fromsalgrades,
deptd,
(selectavg(sal)平均工资,deptnofromempgroupbydeptno)b
whered.deptno(+)=b.deptno
andb.平均工资betweens.losalands.hisal;
--不使用函数查询工资最高人的信息
=all(selectsalfromemp);
--求出平均工资最高的部门名称
selectd.dname,b.平均工资
fromdeptd,
whered.deptno=b.deptno
andb.平均工资>
=all
(selectavg(sal)平均工资fromempgroupbydeptno);
--求平均工资的等级最低的部门名称
selectdname,b.grade
fromdept,
(selectgrade,deptno
fromsalgrade,
(selectdeptno,avg(sal)平均工资fromempegroupbydeptno)a
wherea.平均工资betweenlosalandhisal)b
whereb.grade=
(selectmin(grade)
wherea.平均工资betweenlosalandhisal)
andb.deptno=dept.deptno;
--部门经理人中平均工资最低的部门名称
(selectavg(sal),rank()over(orderbyavg(sal))rk,deptno
wherejob='
groupbydeptno)a
wherea.rk=1
anddept.deptno=a.deptno;
selectsysdate,sysdate-hiredate,sysdate+(sysdate-hiredate)
selectdeptno,count(*)员工数量,
trunc(avg(sal+nvl(comm,2)))平均工资,
to_char(to_date('
'
)+avg(sysdate-hiredate)-366-31,'
fromempgroupbydeptno;
ddddd"
天'
pl/sql练习题
--1.自定义输入任意员工编号,输出该员工编号、、工资、部门名称、所在地
declare
empnointeger;
enamevarchar2(10);
sal
integer;
dnamevarchar2(20);
loc
varchar2(20);
i
begin
selectempno,ename,sal,dname,loc
intoempno,ename,sal,dname,loc
fromemp,dept
whereemp.deptno=dept.deptno
andempno=&
i;
dbms_output.put_line('
:
'
||ename||chr(13)||'
工资:
||sal||chr(13)||'
部门名称:
||dname||chr(13)||'
所在地:
||loc);
exception
whenno_data_foundthen
工号不存在'
end;
--2.自定义输入任意员工编号,如果该员工入职时间大于10年,则奖金加1W,如果该员工入职时间大于五年,奖金加5000,否则奖金不加,最终输出员工编号、、入职时间、原奖金、现奖金
--【--第六天1.2】
empno
ename
varchar2(10);
hiredatedate;
comm
comm1
years
int;
number;
i:
=&
selectempno,ename,hiredate,comm
intoempno,ename,hiredate,comm
whereempno=i;
selectmonths_between(sysdate,hiredate)
intoyears
员工编号:
||empno||chr(13)||'
||ename||
chr(13)||'
入职时间'
||hiredate||chr(13)||'
原奖金'
||comm||
chr(13));
ifyears/12>
10then
selectcomm+10000intocomm1fromempwhereempno=i;
elsifyears/12>
5then
selectcomm+5000intocomm1fromempwhereempno=i;
endif;
现奖金'
||comm1);
end;
--3.自定义输入部门编号,查询出该部门编号下所有员工信息(、工资、部门编号),并显示信息条数
emp.ename%type;
emp.sal%type;
deptnoemp.deptno%type;
number:
cursorc1is
selectename,sal,deptnofromempwheredeptno=i;
openc1;
loop
fetchc1
intoename,sal,deptno;
ifc1%foundthen
||ename||chr(13)||'
工资'
||sal||
部门编号:
||deptno||chr(13));
else
查询完毕!
共有'
||c1%rowcount||'
条记录'
exit;
endloop;
closec1;
--4.自定义输入员工编号,若该员工工资低于5000,则加奖金500l;
--若员工工资高于5000,则加奖金100;
--最终输出员工编号、、工资、原奖金、先奖金
empnoemp.empno%type;
enameemp.ename%type;
m%type;
comm1m%type;
selectempno,ename,comm,sal
intoempno,ename,comm,