{"id":21974129,"url":"https://github.com/javaobjects/oracle","last_synced_at":"2025-03-22T23:25:53.362Z","repository":{"id":105562478,"uuid":"198786318","full_name":"javaobjects/Oracle","owner":"javaobjects","description":"oracle部分习题","archived":false,"fork":false,"pushed_at":"2019-10-23T11:23:12.000Z","size":22286,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-28T03:17:17.681Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PLSQL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/javaobjects.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-07-25T08:03:33.000Z","updated_at":"2019-10-23T11:23:15.000Z","dependencies_parsed_at":null,"dependency_job_id":"c430dee7-41fb-4865-830c-f4d5e0f329fb","html_url":"https://github.com/javaobjects/Oracle","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javaobjects%2FOracle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javaobjects%2FOracle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javaobjects%2FOracle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javaobjects%2FOracle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/javaobjects","download_url":"https://codeload.github.com/javaobjects/Oracle/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245033923,"owners_count":20550358,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-29T15:38:47.692Z","updated_at":"2025-03-22T23:25:53.335Z","avatar_url":"https://github.com/javaobjects.png","language":"PLSQL","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n## 思考题\n\n查询工资比Jones工资高的员工信息？\n\n    select * from emp \n    where sal \u003e (select sal from emp where ename in 'JONES');\n\n![](18-Images/1.png) \n\n查询工资最低的员工姓名？\n\n    select ename from emp\n    where sal = (select min(sal) from emp);\n\n![](18-Images/2.png) \n\n## 练习一\n1. 查询入职日期最早的员工姓名，入职日期\n\n```\nselect ename,hiredate\n\nfrom emp \n\nwhere hiredate = (select min(hiredate) from emp);\n```\n\n![](18-Images/3.png) \n\n2. 查询工资比SMITH工资高并且工作地点在CHICAGO的员工姓名，工资，部门名称\n\n```\nselect ename,sal,dept.dname\n\nfrom emp join dept\n\non emp.deptno = dept.deptno\n\nwhere sal \u003e \n\n(select sal from emp where ename in 'SMITH') \n\nand dept.loc in 'CHICAGO';\n\n```\n\n![](18-Images/4.png)  \n\n3. 查询入职日期比20部门入职日期最早的员工还要早的员工姓名，入职日期\n\n```\n一种解法：\n\nselect ename,hiredate\n\nfrom emp\n\nwhere hiredate \u003c \n\n(select min(hiredate) from emp group by deptno having deptno in 20);\n\n\n另一种解法：\n\nselect ename,hiredate\n\nfrom emp\n\nwhere hiredate \u003c \n\n(select min(hiredate) from emp where deptno in 20);\n```\n\n![](18-Images/5.png)    \n\n4. 查询部门人数大于所有部门平均人数的的部门编号，部门名称，部门人数\n```\n\nselect dept.deptno,dept.dname,count(emp.deptno)\n\nfrom emp join dept\n\non emp.deptno = dept.deptno\n\ngroup by dept.deptno,dept.dname\n\nhaving count(emp.deptno) \u003e \n\n(select avg(count(deptno)) from emp group by deptno);\n```\n\n![](18-Images/6.png)  \n\n## 练习二\n\n1. 查询入职日期比10部门任意一个员工晚的员工姓名、入职日期，不包括10部门员工\n\n```\nselect ename,hiredate\n\nfrom emp\n\nwhere hiredate \u003e \n\nany (select hiredate from emp where deptno in 10) \n\nand deptno \u003c\u003e 10;\n```\n\n\n![](18-Images/7.png) \n\n2. 查询入职日期比10部门所有员工晚的员工姓名、入职日期，不包括10部门员工\n\n```\nselect ename,hiredate\n\nfrom emp\n\nwhere hiredate \u003e \n\nall (select hiredate from emp where deptno in 10)\n\nand deptno \u003c\u003e 10;\n```\n\n![](18-Images/8.png) \n\n3. 查询职位和10部门任意一个员工职位相同的员工姓名，职位，不包括10部门员工\n\n```\nselect ename,job\n\nfrom emp\n\nwhere job =\n\nany (select job from emp where deptno in 10)\n\nand deptno \u003c\u003e 10;\n```\n\n![](18-Images/9.png)  \n\n## 练习三\n1. 查询职位及经理和10部门任意一个员工职位及经理相同的员工姓名，职位，不包括10部门员工\n```\n\nselect ename,job\n\nfrom emp\n\nwhere (job,mgr) in \n\n(select job,mgr from emp where deptno in 10)\n\nand deptno not in 10;\n```\n\n![](18-Images/10.png)   \n\n2. 查询职位及经理和10部门任意一个员工职位或经理相同的员工姓名，职位，不包括10部门员工\n\n```\nselect ename,job\n\nfrom emp\n\nwhere job in \n\n(select job from emp where deptno in 10)\n\nor mgr in\n\n(select mgr from emp where deptno in 10)\n\nand deptno not in 10;\n```\n\n\n![](18-Images/11.png)    \n\n## 练习四\n\n1. 查询比自己职位平均工资高的员工姓名、职位，部门名称，职位平均工资\n```\n此题我不熟练，建议重复练习\n\nselect ename,emp.job,dname,avgSal\n\nfrom emp,\n\n(select job,avg(sal) avgSal from emp group by job) tabjob,\n\ndept\n\nwhere emp.job = tabjob.job \n\nand emp.deptno = dept.deptno \n\nand avgSal \u003c sal;\n```\n  \n    \n![](18-Images/12.png)      \n\n2. 查询职位和经理同员工SCOTT或BLAKE完全相同的员工姓名、职位，不包括SCOOT和BLAKE本人。\n```\n\nselect ename,job\n\nfrom emp\n\nwhere (job,mgr) in (select job,mgr from emp where ename in ('SCOTT','BLAKE'))\n\nand ename not in ('SCOTT','BLAKE');\n```\n\n![](18-Images/13.png)   \n\n3. 查询不是经理的员工姓名。\n\n```\nselect ename \n\nfrom emp\n\nwhere empno not in \n\n(select nvl(mgr,0) from emp);\n```\n\n\n![](18-Images/14.png)   \n\n#### 此处要特别注意只要 (select mgr from emp) 语句返回只要有一条空则\n#### 则会导致主查询没有记录返回。这是因为所有的条件和空值比较结果都是空值。因此无论\n#### 什么时候只要空值有可能成为子查询结果集合中的一部分，就不能使用NOT IN 运算符\n#### 切记！切记！！否则最终会害死自己和同事还有公司的！！！！！！\n\n\n## 练习五\n1. 查询入职日期最早的前5名员工姓名，入职日期。\n```\nselect ename,hiredate \nfrom (select * from emp order by hiredate asc)\nwhere rownum \u003c= 5;\n```\n\n![](18-Images/15.png)   \n\n\n2. 查询工作在CHICAGO并且入职日期最早的前2名员工姓名，入职日期。\n\n```\nselect ename,hiredate\n\nfrom (select ename,hiredate \n\nfrom emp,dept \n\nwhere emp.deptno = dept.deptno \n\nand loc in 'CHICAGO' \n\norder by hiredate asc)\n\nwhere rownum \u003c= 2;\n\n\n\n\n第二种解法：\n\nselect emp.ename,emp.hiredate\n\nfrom emp join dept\n\non emp.deptno = dept.deptno\n\nwhere dept.loc in 'CHICAGO' and rownum \u003c= 2\n\norder by hiredate;\n```\n\n![](18-Images/16.png)   \n\n## 练习六\n1. 按照每页显示5条记录，分别查询第1页，第2页，第3页信息，要求显示员工姓名、入职日期、部门名称。\n```\n第一页\n\nselect ename,hiredate,dname\n\nfrom (select ename,hiredate,dname,rownum rn\n\nfrom emp join dept \n\non emp.deptno = dept.deptno where rownum \u003c 6 )\n\nwhere rn \u003e 0;\n```\n![](18-Images/17.png)   \n\n```\n第二页\n\nselect ename,hiredate,dname\n\nfrom (select ename,hiredate,dname,rownum rn \n\nfrom emp join dept \n\non emp.deptno = dept.deptno where rownum \u003c 11 )\n\nwhere rn \u003e 5;\n```\n![](18-Images/18.png)   \n\n```\n第三页\n\nselect ename,hiredate,dname\n\nfrom (select ename,hiredate,dname,rownum rn\n\nfrom emp join dept \n\non emp.deptno = dept.deptno where rownum \u003c 16 )\n\nwhere rn \u003e 10;\n```\n\n![](18-Images/19.png) \n\n## 练习七\n1. 按照每页显示5条记录，分别查询工资最高的第1页，第2页，第3页信息，要求显示员工姓名、入职日期、部门名称、工资。\n\n```\n-- 第一步：将其所有的结果查出\nselect ename,hiredate,dname,sal\nfrom emp,dept\nwhere emp.deptno = dept.deptno\norder by sal desc;\n-- 第二步：将第一步的结果作为一个表再次进行查询,\n--将将伪列重命名为一个列，此表可以作为制最大数值的表\n\nselect rownum rn tab_allDate.* from \n(select ename,hiredate,dname,sal\nfrom emp,dept\nwhere emp.deptno = dept.deptno\norder by sal desc) tab_allDate;\n-- 比如此处可以添一句where rownum \u003c= maxNum \n-- 而若想分页则可以将以上的集合再判断 rn \u003e minNum\n\n\n\n-- 第三步：以上结果再次作业一个表进行分页\n\n-- 第一页：0~5\nselect * from\n(select rownum rn,tab_allDate.* from \n(select ename,hiredate,dname,sal\nfrom emp,dept\nwhere emp.deptno = dept.deptno\norder by sal desc) tab_allDate\nwhere rownum \u003c= 5)\nwhere rn \u003e 0;\n\n--第二页：5~10\nselect * from\n(select rownum rn,tab_allDate.* from \n(select ename,hiredate,dname,sal\nfrom emp,dept\nwhere emp.deptno = dept.deptno\norder by sal desc) tab_allDate\nwhere rownum \u003c= 10)\nwhere rn \u003e 5;\n-- 第三页: 11~15\nselect * from\n(select rownum rn,tab_allDate.* from \n(select ename,hiredate,dname,sal\nfrom emp,dept\nwhere emp.deptno = dept.deptno\norder by sal desc) tab_allDate\nwhere rownum \u003c= 15)\nwhere rn \u003e 10;\n```\n![](18-Images/100.png)\n\n![](18-Images/101.png)\n\n![](18-Images/102.png)\n\n## 课后作业\n1. 查询工资高于编号为7782的员工工资，并且和7369号员工从事相同工作的员工的编号、姓名及工资。\n\n```\nselect empno,ename,sal,job\nfrom emp \nwhere sal \u003e (select sal from emp where empno in 7782)\nand job in (select job from emp where empno in 7369);\n```\n![](18-Images/103.png)\n\n2. 查询工资最高的员工姓名和工资。 \n\n```\nselect ename,sal\nfrom emp\nwhere sal in (select max(sal) from emp);\n```\n\n![](18-Images/104.png)\n\n3. 查询部门最低工资高于10号部门最低工资的部门的编号、名称及部门最低工资。\n\n```\n--第一步：查询部门最低工资\nselect emp.deptno,dname,min(sal) from emp,dept\nwhere emp.deptno = dept.deptno;\n--第二步：查询10号部门的最低工资\nselect min(sal) from emp where deptno in 10;\n--第三步：解题\n\n--第一种 解题方式：\nselect emp.deptno,dname,min(sal) from emp,dept\nwhere emp.deptno = dept.deptno\ngroup by emp.deptno,dname --group by是所有列必须出现在后边\nhaving min(sal) \u003e (select min(sal) from emp where deptno in 10);\n--第二种 解题方式：\nselect tab_minSal_gb_deptno.deptno,dname,tab_minSal_gb_deptno.minSal_by_deptno\nfrom (select min(sal) minSal_by_deptno,deptno from emp group by deptno) tab_minSal_gb_deptno,\n(select min(sal) minSal_deptno10 from emp where deptno in 10),dept\nwhere tab_minSal_gb_deptno.deptno = dept.deptno \nand minSal_by_deptno \u003e minSal_deptno10;\n```\n\n![](18-Images/105.png)\n\n4. 查询员工工资为其部门最低工资的员工的编号和姓名及工资。\n\n```\n--第一步：先查部门的最低工资\nselect deptno,min(sal) from emp group by deptno;\n--第二步：将上面的结果集作为一个表，进行多表查询\nselect empno,ename,sal \nfrom emp,(select deptno,min(sal) minSal_gb_deptno from emp group by deptno) tab_minSal_gb_deptno\nwhere emp.deptno = tab_minSal_gb_deptno.deptno\nand sal = minSal_gb_deptno;\n```\n![](18-Images/106.png)\n\n5. 显示经理是KING的员工姓名，工资。\n\n```\n--第一步：先查出KING的员工编号\nselect empno from emp where ename in 'KING';\n--第二步：解题 \nselect ename,sal\nfrom emp\nwhere mgr in (select empno from emp where ename in 'KING')\n```\n![](18-Images/107.png)\n\n6. 显示比员工SMITH参加工作时间晚的员工姓名，工资，参加工作时间。\n\n```\n--第一步：先查出SMITH参加工作的时间\nselect hiredate from emp where ename in 'SMITH';\n--第二步：解题 \nselect ename,sal,hiredate\nfrom emp\nwhere hiredate \u003e (select hiredate from emp where ename in 'SMITH');\n```\n![](18-Images/108.png)\n\n7. 使用子查询的方式查询哪些职员在NEW YORK工作。\n\n```\nselect * from emp,dept\nwhere emp.deptno in dept.deptno\nand loc in 'NEW YORK';\n```\n![](18-Images/109.png)\n\n8. 写一个查询显示和员工SMITH工作在同一个部门的员工姓名，雇用日期，查询结果中排除SMITH。\n\n```\nselect ename,hiredate\nfrom emp,dept\nwhere emp.deptno in dept.deptno\nand emp.deptno in (select deptno from emp where ename in 'SMITH')\nand ename not in 'SMITH';\n```\n![](18-Images/110.png)\n\n9. 写一个查询显示其工资比全体职员平均工资高的员工编号、姓名。\n\n```\nselect empno,ename\nfrom emp\nwhere sal \u003e (select avg(sal) from emp);\n```\n![](18-Images/111.png)\n\n\n10. 写一个查询显示其上级领导是King的员工姓名、工资。\n\n```\nselect ename,sal\nfrom emp\nwhere mgr in (select empno from emp where ename in 'KING');\n```\n![](18-Images/112.png)\n\n11. 显示所有工作在RESEARCH部门的员工姓名，职位。\n\n```\nselect ename,job\nfrom emp,dept\nwhere emp.deptno in dept.deptno\nand dname in 'RESEARCH';\n```\n\n![](18-Images/113.png)\n\n12. 查询每个部门的部门编号、平均工资，要求部门的平均工资高于部门20的平均工资。\n\n```\n--第一步：查询第个部门的部门编号，平均工资\nselect deptno,avg(sal) avgSal_gb_deptno\nfrom emp\ngroup by deptno;\n--第二步：查询部门20的平均工资\nselect deptno,avg(sal) avgSal_gb_deptno_20\nfrom emp\ngroup by deptno\nhaving deptno in 20;\n--第三步：解题 \nselect deptno,avg(sal)\nfrom emp\ngroup by deptno\nhaving avg(sal) \u003e \n(select avg(sal)\nfrom emp\ngroup by deptno\nhaving deptno in 20);\n```\n\n![](18-Images/114.png)\n\n13. 查询大于自己部门平均工资的员工姓名，工资，所在部门平均工资，高于部门平均工资的额度。\n\n```\n--第一步：查询自己部门的平均工资\nselect deptno,avg(sal) from emp group by deptno;\n--第二步：将以上结果作为一个表进行多表查询\n\nselect ename,sal,avgSal_gb_deptno,(sal - avgSal_gb_deptno) 高于平均工资的差值\nfrom emp,\n(select deptno,avg(sal) avgSal_gb_deptno from emp group by deptno) tab_gb_deptno\nwhere emp.deptno in tab_gb_deptno.deptno\nand sal \u003e avgSal_gb_deptno;\n```\n![](18-Images/115.png)\n\n14. 列出至少有一个雇员的所有部门\n\n```\nselect deptno,count(1)\nfrom emp\ngroup by deptno\nhaving count(*) \u003e 0;\n```\n![](18-Images/116.png)\n\n15. 列出薪金比\"SMITH\"多的所有雇员\n\n```\nselect * from emp\nwhere sal \u003e (select sal from emp where ename in 'SMITH');\n```\n![](18-Images/117.png)\n\n16. 列出入职日期早于其直接上级的所有雇员\n\n```\nselect worker.ename,worker.hiredate\nfrom emp worker,emp manager\nwhere worker.mgr in manager.empno\nand worker.hiredate \u003c manager.hiredate;\n```\n![](18-Images/118.png)\n\n17. 找员工姓名和直接上级的名字\n\n```\nselect worker.ename 员工姓名,manager.ename 直接上级姓名\nfrom emp worker,emp manager\nwhere worker.mgr in manager.empno(+);\n```\n![](18-Images/119.png)\n\n\n18. 显示部门名称和人数\n\n```\n--第一步：先查出部门人数\nselect count(*) countNum,deptno\nfrom emp\ngroup by deptno;\n--第二步：以上面的查询结果作一个表，多表查询\nselect dname,countNum\nfrom dept,(\nselect count(*) countNum,deptno\nfrom emp\ngroup by deptno) tab_countNum_gb_deptno\nwhere dept.deptno in tab_countNum_gb_deptno.deptno(+);\n```\n\n![](18-Images/120.png)\n\n19. 显示每个部门的最高工资的员工\n\n```\nselect ename,sal,deptno\nfrom emp\nwhere sal in\n(select max(sal) from emp group by deptno);\n```\n\n![](18-Images/121.png)\n\n20. 显示出和员工号7369部门相同的员工姓名，工资\n\n```\nselect ename,sal \nfrom emp\nwhere deptno in (select deptno from emp where empno in 7369);\n```\n![](18-Images/122.png)\n\n21. 显示出和姓名中包含\"W\"的员工相同部门的员工姓名\n\n```\n--第一步：先查出姓名中包含\"W\"的员工部门\nselect deptno from emp where ename like '%W%';\n--第二步：解题 \nselect ename\nfrom emp \nwhere deptno in\n (select deptno from emp where ename like '%W%')\n```\n\n![](18-Images/123.png)\n\n22. 显示出工资大于平均工资的员工姓名，工资\n\n```\nselect ename,sal\nfrom emp \nwhere sal \u003e (select avg(sal) from emp);\n```\n\n![](18-Images/124.png)\n\n23. 显示出工资大于本部门平均工资的员工姓名，工资\n\n```\n--第一步：查询本部门的平均工资\nselect avg(sal),deptno from emp group by deptno;\n--第二步：解题\nselect ename,sal\nfrom emp,(select avg(sal) avgSal_gb_deptno,deptno from emp group by deptno) tab_avgSal_gb_deptno\nwhere emp.deptno in tab_avgSal_gb_deptno.deptno\nand sal \u003e avgSal_gb_deptno;\n```\n![](18-Images/125.png)\n\n24. 显示每位经理管理员工的最低工资，及最低工资者的姓名\n\n```\n--第一步：先查出每位经理管理的员工的最低工资\nselect min(sal),mgr from emp where mgr is not null group by mgr;\n--第二步：解题 \nselect sal,ename\nfrom emp,(select min(sal) minSal,mgr from emp where mgr is not null group by mgr) tab_minSal_gb_mgr\nwhere emp.mgr in tab_minSal_gb_mgr.mgr\nand sal in minSal;\n```\n![](18-Images/126.png)\n\n25. 显示比工资最高的员工参加工作时间晚的员工姓名，参加工作时间\n\n```\nselect ename,hiredate\nfrom emp\nwhere hiredate \u003e (select hiredate from emp where sal in (select max(sal) from emp));\n```\n![](18-Images/127.png)\n\n26. 显示出平均工资最高的的部门平均工资及部门名称\n\n```\n--第一步：先查出部门平均工资及名称\nselect avg(sal) avgSal,deptno from emp group by deptno;\n--第二步：解题 \n--方法一\nselect * from (select dname,avg(sal) avgsal from emp e,dept d where e.deptno = d.deptno group by dname)\nwhere avgsal = (select max(avg(sal)) from emp group by deptno);\n\n--方法二\nselect dname,avg(sal)  from emp e,dept d \nwhere e.deptno = d.deptno \ngroup by dname \nhaving avg(sal) =(select max(avg(sal)) from emp group by deptno);\n```\n![](18-Images/128.png)\n\n==================================================================\n#### 分割线\n==================================================================\n\n**博主为咯学编程：父母不同意学编程，现已断绝关系;恋人不同意学编程，现已分手;亲戚不同意学编程，现已断绝来往;老板不同意学编程,现已失业三十年。。。。。。如果此博文有帮到你欢迎打赏，金额不限。。。**\n\n![](18-Images/pay.png)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjavaobjects%2Foracle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjavaobjects%2Foracle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjavaobjects%2Foracle/lists"}