一、建表

create table empgj(empno number(4,0) primary key,ename varchar2(10),
job varchar2(9),mgr number(4,0),hiredate date,sal number(7,2),comm
number(7,2),deptno number(2,0));
--1
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);
commit;
--2
insert into empgj(empno,ename,job,mgr,hiredate,sal,comm,deptno) values
(7499,'allen','salesman',7698,to_date('1981-2-20','yyyy/mm/dd'),
1600.00,'300.00',20);
commit;
--3
insert into empgj(empno,ename,job,mgr,hiredate,sal,comm,deptno) values
(7521,'ward','salesman',7698,to_date('1981-2-22','yyyy/mm/dd'),
1250.00,'500.00',30);
commit;
--4
insert into empgj(empno,ename,job,mgr,hiredate,sal,comm,deptno) values
(7566,'jones','manager',7839,to_date('1981-4-2','yyyy/mm/dd'),
2975.00,'',20);
commit;
--5
insert into empgj(empno,ename,job,mgr,hiredate,sal,comm,deptno) values
(7654,'martin','salesman',7698,to_date('1981-9-28','yyyy/mm/dd'),
1250,'1400.00',30);
commit;
--6
insert into empgj(empno,ename,job,mgr,hiredate,sal,comm,deptno) values
(7698,'blake','manager',7839,to_date('1981-5-1','yyyy/mm/dd'),
2850,'',30);
commit;
--7
insert into empgj(empno,ename,job,mgr,hiredate,sal,comm,deptno) values
(7782,'clark','manager',7839,to_date('1981-6-9','yyyy/mm/dd'),
2450,'',10);
commit;
--8
insert into empgj(empno,ename,job,mgr,hiredate,sal,comm,deptno) values
(7788,'scott','analyst',7566,to_date('1987-4-19','yyyy/mm/dd'),
3000,'',20);
commit;
--9
insert into empgj(empno,ename,job,hiredate,sal,comm,deptno) values
(7839,'king','president',to_date('1981-11-17','yyyy/mm/dd'),
5000,'',10);
commit;
--10
insert into empgj(empno,ename,job,mgr,hiredate,sal,comm,deptno) values
(7844,'turner','salesman',7698,to_date('1981-9-8','yyyy/mm/dd'),
5000,'0.00',30);
commit;
--11
insert into empgj(empno,ename,job,mgr,hiredate,sal,comm,deptno) values
(7876,'adams','clerk',7788,to_date('1987-5-23','yyyy/mm/dd'),
1100,'',20);
commit;
--12
insert into empgj(empno,ename,job,mgr,hiredate,sal,comm,deptno) values
(7900,'james','clerk',7698,to_date('1981-12-3','yyyy/mm/dd'),
950,'',30);
commit;
--13
insert into empgj(empno,ename,job,mgr,hiredate,sal,comm,deptno) values
(7902,'ford','analyst',7566,to_date('1981-12-3','yyyy/mm/dd'),
3000,'',20);
commit;
--14
insert into empgj(empno,ename,job,mgr,hiredate,sal,comm,deptno) values
(7934,'miller','clerk',7782,to_date('1982-1-23','yyyy/mm/dd'),
1300,'',10);
commit;
select empno as "员工ID",ename as "员工姓名", job as "职位",mgr as "员工管理者ID",
hiredate as "入职日期",sal as "薪资",comm as "绩效",deptno as "员工所在部门的ID"
from empgj;  alter session set nls_date_format='yyyy/mm/dd';  create table deptgj(deptno number(2,0),dname varchar2(14),loc varchar2(13));
--1
insert into deptgj(deptno,dname,loc) values(10,'accounting','new york');
commit;
--2
insert into deptgj(deptno,dname,loc) values(20,'research','dallas');
commit;
--3
insert into deptgj(deptno,dname,loc) values(30,'sales','chicago');
commit;
--4
insert into deptgj(deptno,dname,loc) values(40,'operations','boston');
commit; 

二、表展示

三、练习题及答案

1.取得每个部门最高薪水的人员名称

select e.ename,t.maxsal, t.deptnofrom empgj ejoin (select max(sal) as maxsal, deptno from empgj group by deptno) t on t.deptno = e.deptno and e.sal= t.maxsal;

-->

select e.ename,t.maxsal, d.dnamefrom empgj e
join (select max(sal) as maxsal, deptno from empgj group by deptno) t on t.deptno = e.deptno and e.sal= t.maxsal,deptgj d
where e.deptno = d.deptno;(加上部门名称)

<+>取得sales部门中薪资最高的人名

 Select enamefrom empgjwhere sal = (select max(e.sal)from empgj ejoin deptgj don e.deptno = d.deptnowhere d.dname = 'sales');

2.哪些人的薪水在部门的平均薪水之上

select e.ename, e.sal, t.avgsalfrom empgj ejoin (select avg(sal) as avgsal, deptno from empgj group by deptno) t on t.deptno = e.deptno and e.sal > t.avgsal;

3.不准用组函数(Max),取得最高薪水

select sal from (select sal from empgj order by sal desc) where rownum = 1;

4.取得平均薪水最高的部门的部门编号

select deptnofrom (select avg(sal), deptnofrom empgjgroup by deptnoorder by avg(sal) desc)where rownum = 1;
(ps:这种方法只能查询最高平均薪资只有一个部门的情况,如果两个部门平均薪资一样且都是最高,执行此查询则会漏查,希望有能解决此问题的朋友不吝赐教)

5.取得平均薪水最高的部门的部门名称

(1)select dnamefrom deptgjwhere deptno = (select deptnofrom (select avg(sal), deptnofrom empgjgroup by deptnoorder by avg(sal) desc)where rownum = 1);
(2)select t2.avgsal, t2.deptno, d.dnamefrom (select t.avgsal, t.deptnofrom (select avg(sal) as avgsal, deptnofrom empgjgroup by deptnoorder by avgsal desc) twhere rownum = 1) t2join deptgj d on t2.deptno = d.deptno;

6.取得比普通员工(员工代码没有在mgr字段上出现的)的最高薪水还要低的经理人姓名

select enamefrom empgjwhere sal <(select max(sal)from empgjwhere empno not in(select distinct mgr from empgj where mgr is not null))and job = 'manager';
ps:这里注意not in的用法,其后不能跟有null的数据,注意去除;一般使用not exists

7.取得薪水最高的前五名员工

select ename, salfrom (select ename, sal from empgj order by sal desc)where rownum < 6;

8.取得薪水最高的第六到第十名员工

select ename, salfrom (select ename, sal, rownum rnfrom (select ename, sal from empgj order by sal desc))where rn >= 6and rn <= 10;
ps:有人可能会想,我直接查询rownum大于5小于11不就使查询语句简单些吗,比如:
select ename,sal from
(select ename, sal from empgj order by sal desc)
where rownum >= 6 and rownum <=10;
但是这样尝试的查询并没有结果,这是因为不能对rownum使用>(大于1的数值)、>=(大于或等于1的数值)、=(大于或等于1的数值),否则无结果
这是因为:(1)rownum是伪列,必须要要有返回结果后,每条返回记录就会对应产生一个rownum数值;(2)返回结果记录的rownum是从1开始排序的,因此第一条始终是1;这样,当查询到第一条记录时,该记录的rownum为1,但条件要求rownum>1,因此不符合,继续查询下一条;因为前面没有符合要求的记录,因此下一条记录过来后,其rownum还是为1,如此循环,就不会产生结果按照我所写查询语句是将rownum伪列加入到新表中成为实际列,就可进行某个范围的查询。rownum的其他用法可参考此篇文章进行深入了解点击打开链接点击打开链接

9.取得最后入职的5名员工

select enamefrom (select ename, hiredate from empgj order by hiredate desc)where rownum <= 5;

10.列出所有员工及直接上级的姓名

(1)select a.ename, b.ename from empgj a left join empgj b on a.mgr = b.empno;
(2)select t.ename, e.enamefrom (select ename, mgr from empgj) tleft join empgj e on e.empno = t.mgr;

数据库SQL语句的书写很灵活,有时一个条件会有多种写法的查询语句,除了及时复盘,更应经常训练,才会运用熟练

Oracle数据库练习题(2)

Oracle数据库练习题(3)

Oracle数据库练习题(1)相关推荐

  1. Oracle数据库练习题(2)

    一.表展示 二.练习题及答案 11.列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称 (1)select t.empno, t.empname, d.dnamefrom (select a. ...

  2. 史上最难oracle数据库练习题(附答案)

    oracle数据库练习题,所有练习数据都来自于安装oracle数据库后,自带的那几张表,EMP,DEPT等. 部分题目答案已给出,若有异议可以私聊一起探讨. 第一题: 统计薪资大于  薪资最高的员工所 ...

  3. ORACLE数据库练习题整理(2)

    阅读目录 1. 2. 3. 4. 5. 6. 7. 8.MySql 9. 1. Oracle数据库的服务: OracleServiceOrcl/OracleServicesid:数据库实例服务,是数据 ...

  4. Oracle数据库练习题及答案大全(包含数据库脚本)

    目录 删表语句 建表语句 插入数据 练习题及答案 整理不易,请仔细阅读,希望对你有帮助 可自行复制粘贴,仅供参考,如有问题请及时私信或评论,我会一一回复 删表语句 drop TABLE STUDENT ...

  5. Oracle数据库练习题

    题目:设计以下表,完成相关问题SQL编写. 学生表 student (sno,sname,sage,ssex) 课程表 course (cno,cname,tno) 成绩表 sc (sno,cno,g ...

  6. oracle数据库经典练习题及答案

    最近下载了一套oracle数据库习题(无答案),本人自己在oracle上练习得到的答案,如果不对的地方,请不要见怪.保存到博客方便自己以后查阅. 相关表: /*学生表*/ create table s ...

  7. oracle数据库课后习题答案,oracle数据库经典练习题及答案

    最近下载了一套oracle数据库习题(无答案),本人自己在oracle上练习得到的答案,如果不对的地方,请不要见怪.保存到博客方便自己以后查阅. 相关表: /*学生表*/ create table s ...

  8. oracle数据库的练习题,《Oracle数据库应用》练习题及答案

    <<Oracle数据库应用>练习题及答案>由会员分享,可在线阅读,更多相关<<Oracle数据库应用>练习题及答案(10页珍藏版)>请在人人文库网上搜索 ...

  9. oracle数据库应用与开发习题,《Oracle数据库应用》练习题及答案.docx

    <Oracle数据库应用> 选择题在Windows操作系统中,Oracle的____服务监听并接受来自客户端应用程序的连接请求.A.OracleHOME_NAMETNSListenerB. ...

最新文章

  1. 现行技术体系的问题总结
  2. 毕业后的五年拉开大家差距的原因在哪里
  3. C 这些东西的内存管理
  4. spring:注解@Resource,实现引用类型的赋值
  5. python open word_使用Python在OpenOffice / Microsoft Word中格式化输出
  6. ViewPager的事件冲突的解决
  7. 【GitHub】用Bash编写的 Linux 资源监视器
  8. 构建幸福婚姻需明白四件事
  9. C# 获取PDF文档的字体信息及指定文字的坐标,宽度和高度
  10. javascript简单介绍总结(二)
  11. w7计算机的工具栏爱那里,win7系统底下任务栏不见了的解决方法
  12. T3批次结存表和库存台账和现存量数量不一致
  13. Windows软件清单
  14. ios制作h5的桌面webapp的详解
  15. oracle 在此 select 语句中缺少 into 子句,Go database/sql文档
  16. 制作的excel表格如何放到微信公众平台文章中?
  17. #VICE对话摄影师# 旅居车是一种生活态度
  18. 解决:小米手机设置全屏后屏幕上方有黑条问题
  19. 推荐一个Windows10下的搜索软件:Everything
  20. 农业温室大棚养殖系统智能监控方案

热门文章

  1. Demo : 人脸5个关键点检测
  2. 2023二建建筑施工备考第二天Day03
  3. C++ std::string::substr()
  4. 02-2017.07-计算机设计大赛《盲人的眼睛》
  5. VS code SSH 反复提示输入密码
  6. django项目内部的views层判断手机访问还是电脑访问
  7. 盘点微软使用火热的编程语言!程序员:你看我还有机会吗?
  8. 三本 计算机专业,四川哪些三本大学的计算机专业最好?
  9. iApp裕v3语言认识us与ug
  10. 教你编写DOTA外挂