oracle复杂查询的练习题

练习一、列出薪金高于在部门30工作的所有员工的薪金的员工的姓名、薪金、部门名称、部门人数

思考步骤:

1、确定需要使用的数据表

一、emp:员工的姓名、薪金

二、dept : 部门表:部门名称

三、emp: 部门人数:需要使用统计字段

2、确定已知的关联字段

关联字段:emp.deptno=dept.deptno

1、查询出部门30工作的所有员工的薪金

select sal from emp where deptno=30;   ---查询出来的数据为多行单列数据,需要大于这里面的所有数据,需要  all

2、找出大于以上条件的所有的人员信息

select ename ,sal

from emp

where sal >all(select sal from emp where deptno=30)    ---重点:>all   where 子句嵌套

3、显示部门名称---需要关联dept表

select e.ename ,e.sal ,d.dname

from emp e,dept d

where e.sal >all(

select sal from emp where deptno=30 )

and e.deptno=d.deptno;                                -----注意,在from后面的逗号,不能多加逗号

4、统计部门人数:

select e.ename ,e.sal ,d.dname, temp.count

from emp e,dept d,(

select deptno,count(empno)count  from emp group by deptno) temp

where e.sal >all(

select sal from emp where deptno=30 )

and e.deptno=d.deptno

and e.deptno=temp.deptno;

----注意两点:如果需要统计人数,则需要进行分组

但是在使用分组的时候,select子句中只能出现分组的字段与统计函数,而不能出现其他我们需要的字段,因此,我们采用from的子句进行操作,现将其分组后作为一个临时表再进行关联操作

注意,有几个关联的动作就需要做几次字段关联来消除笛卡尔积

练习二:列出与‘Scott’从事相同工作的所有员工及部门名称、部门人数、领导姓名。

确定要使用的数据表:

1、emp:确定工作、员工姓名、领导姓名需要根据编码显示出来

2、dept:确定部门的名称

3、部门人数

确定已知的关联字段:

emp.deptno=dept.deptno

二、列出与‘Scott’从事相同工作的所有员工及部门名称、部门人数、领导姓名。

确定要使用的数据表:

1、emp:确定工作、员工姓名、领导姓名需要根据编码显示出来

2、dept:确定部门的名称

3、部门人数

确定已知的关联字段:

emp.deptno=dept.deptno

emp.mgr=emp.empno ---自身关联很重要

1.试下怎样找出该员工的领导,找出scott的领导

select mgr from emp where ename=‘SCOTT‘;

SELECT ename FROM EMP where empno=(select mgr from emp where ename=‘SCOTT‘);

2、找出与scott工作相同的同事

select job from emp where ename =‘SCOTT‘;

SELECT ename FROM EMP WHERE JOB =(select job from emp where ename =‘SCOTT‘);

SELECT ename mgrname FROM EMP where empno=(select MGR from emp where ename =‘SCOTT‘);

3、部门名称,需要关联另一张表

SELECT e.empno, e.ename ,d.dname

FROM EMP e,dept d

WHERE JOB =(select job from emp where ename =‘SCOTT‘)

and e.deptno=d.deptno;

4.部门人数,部门人数需要将数据进行分组,分组后统计

select count(empno) from emp group by deptno; ---将其分组后作为一个新的函数进行关联

SELECT e.empno, e.ename ,d.dname, temp.count ,ename mgrname

FROM EMP e,dept d,(

select deptno,count(empno) count from emp group by deptno) temp

WHERE JOB =(select job from emp where ename =‘SCOTT‘)

and e.deptno=d.deptno

and e.deptno=temp.deptno;

----在select取值的时候,你必须要把你需要使用的字段取出来

5、显示领导,与自身关联

SELECT e.empno, e.ename ,d.dname, temp.count ,c.ename mgrname

FROM EMP e,dept d,(

select deptno,count(empno) count from emp group by deptno) temp,emp c

WHERE e.JOB =(select job from emp where ename =‘SCOTT‘)

and e.deptno=d.deptno

and e.deptno=temp.deptno

and e.mgr=c.empno;

6、去掉重复的信息:

SELECT e.empno, e.ename ,d.dname, temp.count ,c.ename mgrname

FROM EMP e,dept d,(

select deptno,count(empno) count from emp group by deptno) temp,emp c

WHERE e.JOB =(select job from emp where ename =‘SCOTT‘)

and e.deptno=d.deptno

and e.deptno=temp.deptno

and e.mgr=c.empno

and e.ename!=‘SCOTT‘;

三、列出薪金比‘SMITH’或者‘ALLEN’多的所有员工的编号、姓名、部门名称、领导名称、部门人数、平均工资、最高工资、最低工资

确定要使用的数据表:

1、emp:确定员工编号、员工姓名、领导姓名需要根据编码显示出来

2、dept:确定部门的名称

3、部门人数,根据分组后计算出来

确定已知的关联字段:

emp.deptno=dept.deptno

emp.mgr=emp.empno ---自身关联很重要,用于显示出领导的名称

count、max、min 、avg  ----用于计算最高、最低、平均工资

练习三:

列出薪金比‘SMITH’或者‘ALLEN’多的所有员工的编号、姓名、部门名称、领导名称、部门人数、平均工资、最高工资、最低工资

确定要使用的数据表:

1、emp:确定员工编号、员工姓名、领导姓名需要根据编码显示出来

2、dept:确定部门的名称

3、部门人数,根据分组后计算出来

确定已知的关联字段:

emp.deptno=dept.deptno

emp.mgr=emp.empno ---自身关联很重要,用于显示出领导的名称

count、max、min 、avg  ----用于计算最高、最低、平均工资

1、找出薪金比‘SMITH’或者‘ALLEN’多的所有员工的编号、姓名

select sal from emp where ename=‘SMITH‘ or ename =‘ALLEN‘ ;  ----  >any 大于他们中的最小值就可以了

select empno ,ename ,sal

from emp

where sal >any (select sal from emp where ename=‘SMITH‘ or ename =‘ALLEN‘);

2、显示部门名称,需要关联dept表

select e.empno ,e.ename ,e.sal ,d.dname

from emp e, dept d

where sal >any (select sal from emp where ename=‘SMITH‘ or ename =‘ALLEN‘)

and e.deptno=d.deptno;

3、计算部门人数,需要按照部门分组,显示计算最高工资、最低工资、平均工资

select deptno, count(empno) from emp group by deptno;

select e.empno ,e.ename ,e.sal ,d.dname ,temp.count, temp.AVG , temp.MAX, temp.MIN

from emp e, dept d ,(

select deptno, count(empno) count ,AVG(SAL) AVG,MAX(SAL) MAX,MIN(SAL) MIN from emp group by deptno) temp

where sal >any (select sal from emp where ename=‘SMITH‘ or ename =‘ALLEN‘)

and e.deptno=d.deptno

and e.deptno=temp.deptno;

4.显示领导名称

select e.empno ,e.ename ,e.sal ,d.dname , c.ename mgrname,temp.count, temp.AVG , temp.MAX, temp.MIN

from emp e, dept d ,(

select deptno, count(empno) count ,AVG(SAL) AVG,MAX(SAL) MAX,MIN(SAL) MIN from emp group by deptno) temp ,emp c

where e.sal >any (select sal from emp where ename=‘SMITH‘ or ename =‘ALLEN‘)

and e.deptno=d.deptno

and e.deptno=temp.deptno

and e.mgr=c.empno;

5.去掉重复数据并进行检查

select e.empno ,e.ename ,e.sal ,d.dname , c.ename mgrname,temp.count, temp.AVG , temp.MAX, temp.MIN

from emp e, dept d ,(

select deptno, count(empno) count ,AVG(SAL) AVG,MAX(SAL) MAX,MIN(SAL) MIN from emp group by deptno) temp ,emp c   ----这边是统计的数据,是不可以直接放在select语句中的,否则会造成其他类型的字段不可以显示

where e.sal >any (select sal from emp where ename=‘SMITH‘ or ename =‘ALLEN‘)

and e.deptno=d.deptno

and e.deptno=temp.deptno

and e.mgr=c.empno(+)   ---为了将没有领导的员工信息显示出来

and e.ename not in(‘SMITH‘,‘ALLEN‘);   ---为了排除题中已涉及的数据(去掉重复)

练习四:列出受雇佣日期早于其直接上级的所有员工的编号、姓名、部门名称、部门位置、部门人数

确定要使用的数据表:

1、emp:确定员工编号、员工姓名、领导姓名需要根据编码显示出来,及雇佣日期

2、dept:确定部门的名称、部门位置

3、部门人数,根据分组后计算出来

确定已知的关联字段:

emp.deptno=dept.deptno

emp.mgr=emp.empno ---自身关联很重要,用于显示出领导的名称

count、max、min 、avg  ----用于计算最高、最低、平均工资

练习四:列出受雇佣日期早于其直接上级的所有员工的编号、姓名、部门名称、部门位置、部门人数

确定要使用的数据表:

1、emp:确定员工编号、员工姓名、领导姓名需要根据编码显示出来,及雇佣日期

2、dept:确定部门的名称、部门位置

3、部门人数,根据分组后计算出来

确定已知的关联字段:

emp.deptno=dept.deptno

emp.mgr=emp.empno ---自身关联很重要,用于显示出领导的名称

count、max、min 、avg  ----用于计算最高、最低、平均工资

1、对雇佣日期进行计算   hiredate  关联自己可以直接使用关系: emp.mgr=emp.empno

select e.empno ,e.ename ,e.hiredate 员工时间 ,c.hiredate 上司时间

from emp e,emp c

where e.hiredate<c.hiredate

and e.mgr=c.empno;

2、显示部门名称与部门位置,需要关联dept表

select e.empno ,e.ename ,e.hiredate 员工时间 ,c.hiredate 上司时间 ,d.dname ,d.loc

from emp e,emp c ,dept d

where e.hiredate<c.hiredate

and e.mgr=c.empno

and e.deptno=d.deptno;

3、计算部门的人数,需要用group by 进行分组

select deptno ,count(empno) count

from emp

group by deptno;

select e.empno ,e.ename ,e.hiredate 员工时间 ,c.hiredate 上司时间 ,d.dname ,d.loc ,temp.count

from emp e,emp c ,dept d ,(select deptno ,count(empno) count

from emp

group by deptno

) temp

where e.hiredate<c.hiredate

and e.mgr=c.empno

and e.deptno=d.deptno

and e.deptno=temp.deptno;

练习五:列出所有‘CLERK(办事员)’的姓名及部门名称、部门人数、工资等级

确定要使用的数据表:

1、emp:确定员工姓名及工作

2、dept:确定部门的名称

3、emp:部门人数,根据分组后计算出来

4、salgrade:工资等级  grade

确定已知的关联字段:

emp.deptno=dept.deptno

emp.mgr=emp.empno ---自身关联很重要,用于显示出领导的名称

1、找出所有job为‘CLERK’的员工信息

select ename , sal

from emp

where job=‘CLERK‘;

2、显示部门名称,关联dept表

select e.ename , e.sal ,d.dname

from emp e ,dept d

where job=‘CLERK‘

and e.deptno=d.deptno;

3、计算部门人数,使用group by分组

select deptno ,count(empno) count

from emp

group by deptno

select e.ename , e.sal ,d.dname, temp.count

from emp e ,dept d ,(

select deptno ,count(empno) count

from emp

group by deptno) temp

where job=‘CLERK‘

and e.deptno=d.deptno

and e.deptno=temp.deptno;

4、计算薪资等级

查询一下scott的工资在几级?

select s.grade ,e.ename,e.sal

from salgrade s, emp e

where  e.sal between s.losal and s.hisal;

select e.ename , e.sal ,d.dname, temp.count, s.grade

from emp e ,dept d ,(

select deptno ,count(empno) count

from emp

group by deptno) temp ,salgrade s

where job=‘CLERK‘

and e.deptno=d.deptno

and e.deptno=temp.deptno

and e.sal between s.losal and s.hisal;

原文地址:https://www.cnblogs.com/Etude/p/9275439.html

时间: 2024-10-10 22:44:49

oracle复杂查询的练习题的相关文章

数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> 数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例 实验所用数据表 子查询,解决一步不能求解 查询工资比scott高的员工信息: 子查询知识体系搭建: 解释3,查询部门是sales的员工信息: 方法1:子查询 [方法2]:多表: 优化考虑: 解释4[select],只能放单行子查询 解释4[from] 考题:显示员工姓名,薪水 解释

【Oracle 常用查询】oracle表空间使用率统计查询

参考1 --查询表空间使用情况 SELECT Upper(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)", To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99') || '

Oracle 模糊查询方法

在这个信息量剧增的时代,如何帮助用户从海量数据中检索到想要的数据,模糊查询是必不可少的.那么在Oracle中模糊查询是如何实现的呢? 一.我们可以在where子句中使用like关键字来达到Oracle模糊查询的效果:在Where子句中,可以对datetime.char.varchar字段类型的列用Like关键字配合通配符来实现模糊查询,以下是可使用的通配符: (1)% :零或者多个字符,使用%有三种情况 字段 like '%关键字%'字段包含"关键字"的记录 字段 like '关键字%

oracle 层次化查询(生成菜单树等)

1.简介:Oracle层次化查询是Oracle特有的功能实现,主要用于返回一个数据集,这个数据集存在树的关系(数据集中存在一个Pid记录着当前数据集某一条记录的Id). 2.层次化查询主要包含两个子句,一个start with另一个是connect by. start with:这个子句一般用于指定层次化查询的开始节点(也就是树的最顶级节点),找到最顶级节点,然后按照一定的规则开始查找其剩余的子节点 connect by:这个子句就是上面所说的规则,用于查找剩余子节点的规则 CREATE TAB

Oracle分页查询语句的写法(转)

分页查询是我们在使用数据库系统时经常要使用到的,下文对Oracle数据库系统中的分页查询语句作了详细的介绍,供您参考. Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用.Oracle分分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHER

ORACLE 分页查询

Oracle之分页查询 Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. 分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句.ROWNUM <= 40和RN >= 21控制分页查询的每页的范围.

Oracle生成查询包含指定字段名对应的所有数据表记录语句

应用场合:已知字段名字,查询数据库中所有数据表中包含该字段名的所有数据表 操作办法:指定字段名,数据库表用户,执行下面查询语句即可 --Oracle生成查询包含指定字段名对应的所有数据表记录语句 declare mycolumnname VARCHAR(255):='userid';--定义要查询的字段名变量,运行前修改成您要查询的字段名myownername VARCHAR(255):='system';--定义要查询的数据库用户名变量,运行前修改成您要查询的数据库用户名mystring NV

Oracle单行查询

单行查询也叫作单行函数,使用某个函数对数据进行操作 关于基本查询:oracle基本查询 1 SQL> select lower('Hello WOrld') 转小写, 2 upper('Hello WOrld') 转大写, 3 initcap('hello world') 首字母大写 4 2 from dual; 5 6 7 SQL> --substr(a,b)取子串, 从a中,第b位开始取 ,直到末尾 8 SQL> select substr('Hello World',3) 子串 f

oracle 分页查询数据重复问题

最近在做项目的时候发现一个问题,oracle 在查询分页数据的时候,有几条数据重复查询了,并且有几条数据在分页的时候消失了.百度了一下发现,ORACLE 在查询数据的时候返回的行不是固定的,他只是按照顺序从数据中读取符合条件的数据返回到客户端,给用户误解为默认排序. 然而,当我加上排序的时候,还是查询有重复的数据,(指第一页数据在第二页也查询出来了),这是我就疑问了,当我检查数据的时候,发现我排序的字段有空的情况,而且有很多条,导致排序返回的 伪列并不是唯一的. 总结: oracle 分页查询数