信息技术考核数据库试题.docx
- 文档编号:18337298
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:26
- 大小:25.12KB
信息技术考核数据库试题.docx
《信息技术考核数据库试题.docx》由会员分享,可在线阅读,更多相关《信息技术考核数据库试题.docx(26页珍藏版)》请在冰点文库上搜索。
信息技术考核数据库试题
模块一SQL(DQL)
l基本SQL查询
l运算符与函数
l子查询
l连接查询
建表语句emp.sql
PartI(第一天)
01.查询员工表所有数据,并说明使用*的缺点
答:
select*fromemp;
使用*的缺点有
a)查询出了不必要的列
b)效率上不如直接指定列名
02.查询职位(JOB)为'PRESIDENT'的员工的工资
答:
select*fromempwherejob='PRESIDENT';
03.查询佣金(COMM)为0或为NULL的员工信息
答:
重点是理解0与null的区别
select*fromempwherecomm=0orcommisnull;
04.查询入职日期在1981-5-1到1981-12-31之间的所有员工信息
答:
通过此题掌握常用日期函数
select*fromempwherehiredate
betweento_date('1981-5-1','yyyy-mm-dd')andto_date('1981-12-31','yyyy-mm-dd');
05.查询所有名字长度为4的员工的员工编号,姓名
答:
select*fromempwherelength(ename)=4;
06.显示10号部门的所有经理('MANAGER')和20号部门的所有职员('CLERK')的详细信息
答:
select*fromempwheredeptno=10andjob='MANAGER'ordeptno=20andjob='CLERK';
07.显示姓名中没有'L'字的员工的详细信息或含有'SM'字的员工信息
答:
考察知识点模糊查询
select*fromempwhereenamenotlike'%L%'orenamelike'%SM%';
08.显示各个部门经理('MANAGER')的工资
答:
selectsalfromempwherejob='MANAGER';
09.显示佣金(COMM)收入比工资(SAL)高的员工的详细信息
答:
select*fromempwherecomm>sal;
10.把hiredate列看做是员工的生日,求本月过生日的员工(考察知识点:
单行函数)
答:
select*fromempwhereto_char(hiredate,'mm')=to_char(sysdate,'mm');
11.把hiredate列看做是员工的生日,求下月过生日的员工(考察知识点:
单行函数)
答:
select*fromempwhereto_char(hiredate,'mm')=to_char(add_months(sysdate,1),'mm');
12.求1982年入职的员工(考察知识点:
单行函数)
答:
select*fromempwhereto_char(hiredate,'yyyy')='1982';
13.求1981年下半年入职的员工(考察知识点:
单行函数)
答:
select*fromempwherehiredate
betweento_date('1981-7-1','yyyy-mm-dd')andto_date('1982-1-1','yyyy-mm-dd')-1;
14.求1981年各个月入职的的员工个数(考察知识点:
组函数)
答:
selectcount(*),to_char(trunc(hiredate,'month'),'yyyy-mm')
fromempwhereto_char(hiredate,'yyyy')='1981'
groupbytrunc(hiredate,'month')
orderbytrunc(hiredate,'month');
PartII(第二天)
01.查询各个部门的平均工资
答:
考察知识点:
分组
selectdeptno,avg(sal)fromempgroupbydeptno;
02.显示各种职位的最低工资
答:
考察知识点:
分组
selectjob,min(sal)fromempgroupbyjob;
03.按照入职日期由新到旧排列员工信息
答:
考察知识点:
排序
select*fromemporderbyhiredatedesc;
04.查询员工的基本信息,附加其上级的姓名
答:
考察知识点:
自连接
selecte.*,e2.enamefromempe,empe2wheree.mgr=e2.empno;
05.显示工资比'ALLEN'高的所有员工的姓名和工资
答:
考察知识点:
子查询
select*fromempwheresal>(selectsalfromempwhereename='ALLEN');
分析:
当查询结果是一行一列时,可以将此结果看做一个值,参与条件比较。
06.显示与'SCOTT'从事相同工作的员工的详细信息
答:
考察知识点:
子查询
select*fromempwherejob=(select*fromempwhereename='SCOTT');
分析:
同第5题
07.显示销售部('SALES')员工的姓名
答:
考察知识点:
连接查询
selectenamefromempe,deptdwheree.deptno=d.deptnoandd.dname='SALES';
08.显示与30号部门'MARTIN'员工工资相同的员工的姓名和工资
答:
考察知识点:
子查询
selectename,salfromemp
wheresal=(selectsalfromempwheredeptno=30andename='MARTIN');
分析:
同第5题
09.查询所有工资高于平均工资(平均工资包括所有员工)的销售人员('SALESMAN')
答:
考察知识点:
子查询
select*fromempwherejob='SALESMAN'andsal>(selectavg(sal)fromemp);
10.显示所有职员的姓名及其所在部门的名称和工资
答:
考察知识点:
表连接
selectename,job,dnamefromempe,deptdwheree.deptno=d.deptno;
11.查询在研发部('RESEARCH')工作员工的编号,姓名,工作部门,工作所在地
答:
考察知识点:
表连接
selectempno,ename,dname,locfromempe,deptd
wheree.deptno=d.deptnoanddanme='RESEARCH';
12.查询各个部门的名称和员工人数
答:
考察知识点:
子查询,表连接
select*from(selectcount(*)c,deptnofromempgroupbydeptno)e
innerjoindeptdone.deptno=d.deptno;
分析:
主要思路是要将子查询结果看做一个临时表,此临时表又可以与其他表做表连接
13.查询各个职位员工工资大于平均工资(平均工资包括所有员工)的人数和员工职位
答:
考察知识点:
子查询
selectjob,count(*)fromempwheresal>(selectavg(sal)fromemp)groupbyjob;
分析:
查询结果是一行一列,可以将查询结果看做一个值,进行条件比较
14.查询工资相同的员工的工资和姓名
答:
考察知识点:
子查询
select*fromempewhere(selectcount(*)fromempwheresal=e.salgroupbysal)>1;
分析:
此题目类似于17题,见17题分析。
15.查询工资最高的3名员工信息
答:
考察知识点:
子查询,rownum
select*from(select*fromemporderbysaldesc)whererownum<=3;
分析:
见21题要点一
16.按工资进行排名,排名从1开始,工资相同排名相同(如果两人并列第1则没有第2名,从第三名继续排)
答:
考察知识点:
子查询
selecte.*,(selectcount(*)fromempwheresal>e.sal)+1rankfromempeorderbyrank;
分析:
此题的要点在于理解selectcount(*)fromempwheresal>e.sal+1的含义,e.sal代表当前员工,
该子查询的含义就是求比当前员工工资高的人数个数:
比此员工工资高的人数个数如果为
0,表示此人排名第一,比此员工工资高的人数个数如果为1,表示此人排名第二…所以该
子查询结果就表示排名。
17.求入职日期相同的(年月日相同)的员工
答:
考察知识点:
子查询
select*fromempewhere(selectcount(*)fromempwheree.hiredate=hiredate)>1;
分析:
常见的一个误解就是把此题当做自连接做:
select*fromempe1,empe2wheree1.hiredate=e2.hiredateande1.empno<>e2.empno;
这样做的结果中对于只有两个日期相等的没有错误,查询结果有2条,但如果有三个日期相等的查询结果就是6条,其中3条是重复的。
要点也是理解子查询的含义selectcount(*)fromempwheree.hiredate=hiredate,代表取得与当
前员工入职日期相等的人数个数,如果个数大于1表示此日期有相等的。
18.查询每个部门的最高工资
答:
考察知识点:
分组
selectdeptno,max(sal)maxsalfromempgroupbydeptnoorderbydeptno;
19.查询每个部门,每种职位的最高工资
答:
考察知识点:
分组
selectdeptno,job,max(sal)fromempgroupbydeptno,joborderbydeptno,job;
分析:
要点是理解多列分组:
部门与职位都相同的分为一组,求每组的最高工资,其实就是
表示每个部门,每种职位的最高工资
20.查询每个员工的信息及工资级别(用到表Salgrade)
答:
考察知识点:
不等值连接
select*fromsalgrade;
selecte.*,sg.gradefromempe,salgradesgwheresalbetweenlosalandhisal;
21.查询工资最高的第6-10名员工
答:
考察知识点:
子查询,rownum
select*from(
selecte.*,rownumrnfrom
(select*fromemporderbysaldesc)e
whererownum<=10)
wherern>5;
分析:
要点一是rownum不能直接和orderby连用,因为rownum先产生,orderby后执行,因此
需要将
select*fromemporderbysaldesc
先排序之后的结果看做一个临时表,再对此临时表产生rownum编号。
要点二是rownum不能用作>或>=的比较条件,因此不能够直接这样写
selecte.*from
(select*fromemporderbysaldesc)e
whererownum>5andrownum<=10;
因此需要将
selecte.*,rownumrnfrom
(select*fromemporderbysaldesc)e
whererownum<=10
查询结果看做一个临时表,这个临时表除了有表e中的所有列之外,多添加一个rownum列
并取别名为rn,这时rn已经作为临时表中一个真实的列存在了,因此可以使用>或>=比较
条件:
select*from(
selecte.*,rownumrnfrom
(select*fromemporderbysaldesc)e
whererownum<=10)
wherern>5;
两次查询示例图如下:
第一次取前10条,第二次排除前5条
22.查询各部门工资最高的员工信息
答:
考察知识点:
子查询
select*fromempewheree.sal=(selectmax(sal)fromempwhere(deptno=e.deptno));
分析:
要点同样是理解子查询selectmax(sal)fromempwhere(deptno=e.deptno)获取当前部
门(e.deptno)的最高工资,再将此最高值与当前工资(e.sal)进行比较。
思路2:
selecte.*from(selectmax(sal)maxsal,deptnofromempgroupbydeptno)b,empe
wheree.deptno=b.deptnoandb.maxsal=e.sal;
将子查询看做一个临时表,临时表中有最高工资列maxsal,以及deptno列,此临时表与真
实表emp做表连接,连接条件为emp表中的工资要等于临时表的最高工资并且两表的部门
编号要相等。
23.查询每个部门工资最高的前2名员工
答:
考察知识点:
子查询
select*fromempewhere
(selectcount(*)fromempwheresal>e.salande.deptno=deptno)<2
orderbydeptno,saldesc;
分析:
此题类似于第16题,需要理解selectcount(*)fromempwheresal>e.salande.deptno=
deptno的含义:
求工资大于当前员工工资(e.sal)并且部门编号等于当前员工部门编号
(e.deptno)的员工的个数,此个数+1表示排名,<2表示取前两名。
思路2:
使用oracle提供的分析函数rank:
select*from(
selectrank()over(partitionbydeptnoorderbysaldesc)rank,e.*fromempe
)whererank<3;
rank函数的作用是产生排名,与普通函数不同,高亮部分都是函数语法部分,其中over是
关键字,总体意思是指按部门编号分组(partitionbydeptno),按工资降序(orderbysaldesc)
排名。
思路3:
步骤1:
按照部门,工资降序排列,并产生编号
selecte.*,rownumrnfrom(select*fromemporderbydeptno,saldesc)e;
步骤2:
在此基础上再按照部门编号分组,求每组的编号的最小值
selectmin(rn)minrank,deptnofrom
(selecte.*,rownumrnfrom(select*fromemporderbydeptno,saldesc)e)
groupbydeptno;
步骤3:
将两步产生的结果看做是临时表分别称为t1,t2,做连接,连接条件时t1表中
部门编号等于t2部门编号且t1.rn>=t2.minrankandt1.rn<=t2.minrank+1
selectt1.*from
(selecte.*,rownumrnfrom(select*fromemporderbydeptno,saldesc)e)t1,
(selectmin(rn)minrank,deptnofrom
(selecte.*,rownumrnfrom(select*fromemporderbydeptno,saldesc)e)
groupbydeptno)t2
wheret1.deptno=t2.deptnoandt1.rn>=t2.minrankandt1.rn<=t2.minrank+1;
24.查询出有3个以上下属的员工信息
答:
考察知识点:
自连接,子查询
select*fromempewhere
(selectcount(*)fromempwheree.empno=mgr)>2;
分析:
关键是理解连接条件e.empno=mgr是表示连接当前员工(e.empno)和他的下属(mgr)
25.查询所有大于本部门平均工资的员工信息()
答:
考察知识点:
子查询
select*fromempewheresal>
(selectavg(sal)fromempwhere(deptno=e.deptno))
orderbydeptno;
分析:
思路与22题相同。
26.查询平均工资最高的部门信息
答:
考察知识点:
子查询,组函数,连接查询
selectd.*,avgsalfromdeptd,(selectavg(sal)avgsal,deptnofromempgroupbydeptno)se
whereavgsal=(selectmax(avg(sal))fromempgroupbydeptno)andd.deptno=se.deptno;
分析:
步骤1:
求每个部门的平均工资:
selectavg(sal)avgsal,deptnofromempgroupbydeptno;
步骤2:
求最高的平均工资:
selectmax(avg(sal))fromempgroupbydeptno;
步骤3:
求平均工资最高的部门信息,连接步骤1产生的临时表与真实表dept:
selectd.*,avgsalfromdeptd,(selectavg(sal)avgsal,deptnofromempgroupbydeptno)se
whereavgsal=(selectmax(avg(sal))fromempgroupbydeptno)andd.deptno=se.deptno;
27.查询大于各部门总工资的平均值的部门信息
答:
考察知识点:
子查询,组函数,连接查询
selectd.*,sumsalfromdeptd,(selectsum(sal)sumsal,deptnofromempgroupbydeptno)se
wheresumsal>(selectavg(sum(sal))fromempgroupbydeptno)andse.deptno=d.deptno;
分析:
步骤1:
求每个部门总工资
selectsum(sal)sumsal,deptnofromempgroupbydeptno;
步骤2:
求每总工资平均值
selectavg(sum(sal))fromempgroupbydeptno;
步骤3:
求大于总工资平均值的部门信息,连接步骤1产生的临时表与真实表dept:
selectd.*,sumsalfromdeptd,(selectsum(sal)sumsal,deptnofromempgroupbydeptno)se
wheresumsal>(selectavg(sum(sal))fromempgroupbydeptno)andse.deptno=d.deptno;
28.查询大于各部门总工资的平均值的部门下的员工信息(考察知识点:
子查询,组函数,连接
查询)
答:
考察知识点:
子查询,组函数,连接查询
selecte.*,sumsalfromempe,(selectsum(sal)sumsal,deptnofromempgroupbydeptno)se
wheresumsal>(selectavg(sum(sal))fromempgroupbydeptno)andse.deptno=e.deptno;
分析:
类似于26题,27题
29.查询没有员工的部门信息
答:
考察知识点:
表连接
selectd.*fromdeptdleftjoinempeon(e.deptno=d.deptno)whereempnoisnull;
分析:
利用了左外连接的特点,部门连接员工时,没有匹配记录的部门对应的员工编号列肯
定为null
30.查询用户(users表)huxz所下所有订单编号,下单日期,总价格(orders表),并包括订
单中的商品数量(orderitem表),名称(product表),价格(product表)
答:
考察知识点:
多表连接
selectu.username,o.orderid,o.orderdate,o.totalprice,p.productname,p.price,i.qty
fromusersuinnerjoinordersoon(u.username=o.username)
innerjoinorderitemion(o.orderid=i.orderid)
innerjoinproductpon(p.productid=i.productid)
whereu.username
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息技术 考核 数据库 试题
![提示](https://static.bingdoc.com/images/bang_tan.gif)