oracle数据库查询操作

select * from emp
select * from dept  
  
--1. 查询平均工资最高的部门的
--部门编号、部门名称和该部门的平均工资
select  b.deptno,d.dname,t.maxsal from dept d,
(select deptno,avg(sal) avgsal from emp group by deptno) b,
(select max(avgsal) maxsal from (select avg(sal) avgsal from emp group by deptno)) t 
where b.avgsal=t.maxsal and d.deptno=b.deptno


--2. 查询所有员工的年薪、所在部门的名称,查询结果按年薪从低往高排序
select ename,e.deptno,dname, sal*12+nvl(comm,0) yearsal from emp e , dept d 
where e.deptno=d.deptno
order by yearsal asc 
--3. 查询每种工作的最低工资,以及领取该工资的员工姓名,查询结果显示工作名称、最低工资、领取该工
--资的员工姓名
select t.job,t.ms, ename from emp inner join
(select min(sal) ms,job from emp group by job) t
on emp.job=t.job
--4. 查询出管理员工人数最多的人的名字和他管理的人的名字
select a.ename as manager,b.ename as employee from emp a join emp b on a.empno=b.mgr
where b.mgr=(select mgr from emp 
      group by mgr having count(mgr)=(
            select max(cm) from 
            (select count(mgr) as cm,mgr from emp group by mgr) z
            ))


--5. 查询所有员工的编号、姓名,及其上级领导的编号、姓名。显示结果按领导的年薪降序排列
select a.empno as 员工编号,a.ename as 员工姓名,b.empno as 领导编号,b.ename as 领导姓名,
(b.sal+nvl(b.comm,0))*12 as 领导年薪
from emp a,emp b 
where a.mgr=b.empno
order by 领导年薪 desc
--6. 查询所有领取奖金和不领取奖金的员工人数、平均工资;
--查询结果的列名分别为:人数、平均工资;
--第一行为有奖金的员工,第二行为没有奖金的员工
select a.领奖人数,a.平均工资,b.未领奖人数,b.平均工资 from
(select count(*) as 领奖人数,avg(sal) as 平均工资 from emp where comm is not null) a,
(select count(*) as 未领奖人数,avg(sal) as 平均工资 from emp where comm is null) b


    --另一种解法:
select * from (select count(*) num,avg(sal) avgcomm from emp where comm is not null)
union all 
select * from (select count(*) num,avg(sal) avgcomm from emp where comm is null) 


--7. 查询工资不超过2500的人数最多的部门名称和该部门工资不超过2500的员工的员工人数
select x.deptno as 部门编号,DNAME as 部门名称,cn as 员工人数 from dept
,(select deptno,cn
              from (select count(empno) as cn,deptno
                    from Emp
                    where SAL<=2500                                     
                    group by deptno
                   )a
              where cn=(select max(cn)
                         from (select count(empno) as cn
                         from emp
                         where SAL<=2500                                     
                         group by deptno
                         )b
              )      
) x
where dept.deptno=x.deptno


--8. 查询受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
select a.empno,a.ename,a.hiredate,c.dname from emp a,emp b,dept c
where a.mgr=b.empno and a.deptno=c.deptno and a.hiredate<b.hiredate


SELECT e.empno, e.ename, d.dname
FROM emp e LEFT JOIN emp m ON e.mgr=m.empno 
           LEFT JOIN dept d ON e.deptno=d.deptno
WHERE e.hiredate<m.hiredate;
--9. 查询至少有4个员工的部门的部门名称
select a.deptno,dname,cd from dept,
(select deptno,count(*) as cd from emp group by deptno) a
where cd>=4 and dept.deptno=a.deptno
--10. 查询工资比“SMITH”高的员工的基本信息
select * from emp where sal>(select sal from emp where ename='SMITH')
--11. 查询部门名称中带'S'字符的部门的员工的工资总和部门人数,
--显示结果为部门名称,部门员工的工资总和,部门人数
select d.deptno,nvl(sum(sal),0),count(empno) from emp e,dept d
where e.deptno(+)=d.deptno and d.dname like '%S%' group by d.deptno
  
--12. 查询所有从事"CLERK"工作的雇员所在部门的部门名称、部门里的人数
select d.dname,a.count from emp e,dept d,
(select deptno,count(empno)as count from emp 
        group by deptno
) a
where job='CLERK' and e.deptno=d.deptno and d.deptno=a.deptno


--13. 查询雇员领导的基本信息,要求领导的薪水要超过3000
select * from emp where sal>3000 and empno in(select mgr from emp)
--14. 查询在"sales"部门(销售部)工作的员工的姓名
select ename from emp where job='SALESMAN'
--15. 查询工资高于30号部门的所有员工的 工资的员工姓名、工资及部门名称
select e.ename,e.sal,d.dname from emp e,dept d
where e.deptno=d.deptno
and sal>all(select sal from emp where deptno= 30)


--16. 查询所有部门的详细信息(部门编号、部门名称)和部门人数
select d.deptno as 部门编号,d.dname as 部门名称,a.count from dept d,
(select deptno,nvl(count(empno),0) as count from emp group by deptno) a
where a.deptno(+)=d.deptno


--17. 显示每个部门中每个岗位的平均工资、每个部门的平均工资、每个岗位的平均工资
select a.deptno,a.job,dj_avgsal,job_avgsal,deptno_avgsal from
(select deptno, job,avg(sal) dj_avgsal from emp group by deptno,job) a
left join
(select job, avg(sal) job_avgsal from emp group by job) b
on a.job=b.job left join
(select deptno, avg(sal) deptno_avgsal from emp group by deptno) c
on a.deptno=c.deptno
order by deptno


--18. 显示与"BLAKE"同部门的所有员工的基本信息,但不显示"BLAKE"的基本信息
select * from emp where deptno=(select deptno from emp 
where ename='BLAKE' )and ename<> 'BLAKE'


--19. 查询出“KING”所在部门的部门编号、部门名称以及该部门里的员工人数
select ename,t.deptno,dname,cd from emp e ,dept d ,
(select deptno,count(*) cd from emp where deptno in(select deptno from emp where ename='KING') group by deptno) t
where e.deptno=d.deptno and ename='KING'
        --听说是另一种解法:
select e.deptno as 部门号,d.dname as 部门名称, (select count(*)
from (select deptno
from emp where deptno in (select deptno
from emp where ename='KING') ) ) as 部门人数
from emp e, dept d
where e.deptno = d.deptno and e.ename = 'KING';
--20. 查询出"WARD"所在部门的工作年限最大的员工的姓名
select ename,t.workyear from emp e,
(select min(hiredate) workyear from emp where deptno=
(select deptno from emp where ename='WARD')) t
where e.hiredate=t.workyear


--21. 查询出没有下属的员工的姓名及他的职位
select ename from emp a 
where ename not in(
select b.ename from emp a,emp b where a.mgr=b.empno
)


--22. 查询出员工姓名以A开头的人数最多的部门的部门名称
select d.dname,m.num from dept d,
(select count(ename) numm,deptno from emp where ename like'A%' group by deptno) t,
(select max(numm) num from (select count(ename) numm from emp where ename like'A%' group by deptno)) m
where d.deptno=t.deptno and t.numm=m.num


--23. 查询出SMITH所在部门的部门名称、部门工资的平均值(注意平均值保留两位小数)
select d.dname,t.avgsal from emp e,dept d,
(select deptno,to_char(avg(sal),'9999.99') avgsal from emp group by deptno) t
where e.ename='SMITH' and e.deptno=d.deptno 
and t.deptno=d.deptno

猜你喜欢

转载自blog.csdn.net/duanyuwan/article/details/80683938