查询emp表中每个员工的名称及其所在部门的平均工资。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查询emp表中每个员工的名称及其所在部门的平均工资。相关的知识,希望对你有一定的参考价值。

参考技术A SQL> select emp.* ,a.pjsal from emp,(select avg(sal) pjsal,deptno from emp group by deptno) a where a.deptno=emp.deptno;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO PJSAL
----- ---------- --------- ----- ----------- --------- --------- ------ ----------
7369 SMITH CLERK 7902 1980-12-17 800.00 20 2175
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30 1566.66666
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30 1566.66666
7566 JONES MANAGER 7839 1981-4-2 2975.00 20 2175
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30 1566.66666
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30 1566.66666
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10 2916.66666
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20 2175
7839 KING PRESIDENT 1981-11-17 5000.00 10 2916.66666
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30 1566.66666
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20 2175
7900 JAMES CLERK 7698 1981-12-3 950.00 30 1566.66666
7902 FORD ANALYST 7566 1981-12-3 3000.00 20 2175
7934 MILLER CLERK 7782 1982-1-23 1300.00 10 2916.66666
参考技术B 你该给出用到的表结构和表之间的关系。
select a.员工姓名,b.avg_gz as 平均工资
from emp a,(select 部门,avg(工资) as avg_gz from emp group by 部门) as b
where a.部门=b.部门
参考技术C select * from ( select emp.*, avg(emp.sal) over (partition by emp.deptid) as avgsal from emp) a where a.sal>a.avgsal order by emp.deptid;~

Oracle SQL:经典查询练手第一篇

讨论一些常见的SQL经典查询

使用Oracle的Scott用户

表结构如下:

emp表

dept表

工资=薪金+佣金

工资=sal+comm

表中数据如下:

emp:

dept:

问题列表:

用SQL完成以下问题列表:

  1. 列出至少有一个员工的所有部门。
  2. 列出薪金比“SMITH”多的所有员工。
  3. 列出所有员工的姓名及其直接上级的姓名。
  4. 列出受雇日期早于其直接上级的所有员工。
  5. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
  6. 列出所有“CLERK”(办事员)的姓名及其部门名称。
  7. 列出最低薪金大于1500的各种工作。
  8. 列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。
  9. 列出薪金高于公司平均薪金的所有员工。
  10. 列出与“SCOTT”从事相同工作的所有员工。
  11. 列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。
  12. 列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
  13. 列出在每个部门工作的员工数量、平均工资和平均服务期限。
  14. 列出所有员工的姓名、部门名称和工资。
  15. 列出所有部门的详细信息和部门人数。
  16. 列出各种工作的最低工资。
  17. 列出各个部门的MANAGER(经理)的最低薪金。
  18. 列出所有员工的年工资,按年薪从低到高排序。

我的答案如下,欢迎指正:

-- 1.列出至少有一个员工的所有部门
-- 先查出有员工的部门编号
select DISTINCT deptno from emp;
-- 部门编号在里面就满足
select dname from dept where deptno in (select DISTINCT deptno from emp);
DNAME        
--------------
ACCOUNTING 
RESEARCH 
SALES 
-- 2.列出薪金比“SMITH”多的所有员工
-- 先查询出‘SMITH’的薪金
SELECT SAL FROM emp WHERE ENAME =\'SMITH\';
-- SAL取值大于SMITH的薪金即可
-- SAL是数字 NUMBER(7,2) 可以直接比较
SELECT * FROM EMP WHERE SAL > (SELECT SAL FROM emp WHERE ENAME =\'SMITH\');
 1 -- 3.列出所有员工的姓名及其直接上级的姓名
 2 -- empno等于mgr
 3 SELECT e.ename,(select ename from emp ee where ee.EMPNO=e.MGR) superior FROM emp e;
 4 
 5 ENAME      SUPERIOR 
 6 ---------- ----------
 7 SMITH FORD 
 8 ALLEN BLAKE 
 9 WARD BLAKE 
10 JONES KING  
11 MARTIN BLAKE 
12 BLAKE KING  
13 CLARK KING  
14 SCOTT JONES 
15 KING             
16 TURNER BLAKE 
17 ADAMS SCOTT 
18 JAMES BLAKE 
19 FORD JONES 
20 MILLER CLARK 
21 
22  选定了 1423 
24 -- 没有思路 待议
 1 -- 4.列出受雇日期早于其直接上级的所有员工
 2 -- hiredate直接用大于小于比较
 3 select e.ENAME from emp e where e.HIREDATE< (SELECT HIREDATE FROM emp ee where ee.EMPNO=e.mgr);
 4 
 5 ENAME    
 6 ----------
 7 SMITH 
 8 ALLEN 
 9 WARD 
10 JONES 
11 BLAKE 
12 CLARK 
13 
14  选定了 6
-- 没有思路 待议
1 -- 5.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
2 -- 为了列出没有员工的部门 可以使用左外连接 以部门表为基准 部门表记录全部显示出来 而不管员工表有不有对应的记录
3 select d.DNAME,e.ENAME,e.HIREDATE,e.JOB,e.MGR,e.HIREDATE,e.SAL from dept d left outer join emp e on d.deptno = e.deptno;
 1 -- 6.列出所有“CLERK”(办事员)的姓名及其部门名称
 2 -- 先查询出CLERK的姓名和部门编号
 3 SELECT e.JOB,e.ENAME,e.DEPTNO FROM EMP e where JOB = \'CLERK\';
 4 -- 再和部门表做关联 使用子查询
 5 select aa.ename,aa.job,bb.dname from (SELECT e.JOB,e.ENAME,e.DEPTNO FROM EMP e where JOB = \'CLERK\') aa ,DEPT bb where aa.deptno= bb.deptno;
 6 
 7 -- 还有一种方式 就是做内连接
 8 select e.ENAME,d.DNAME from emp e join dept d on e.deptno=d.deptno where e.JOB=\'CLERK\';
 9 
10 ENAME      DNAME        
11 ---------- --------------
12 MILLER ACCOUNTING 
13 SMITH RESEARCH 
14 ADAMS RESEARCH 
15 JAMES SALES    
1 -- 7.列出最低薪金大于1500的各种工作
2 -- 先根据工作来分组 然后再此基础上过滤sal>1500 每组里面最低工资而不是工资大于1500
3 select job from emp group by job having(min(sal))>1500;

 

 1 -- 8.列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号
 2 -- 先找出销售部门编号
 3 select d.deptno from dept d where d.DNAME = \'SALES\';
 4 -- 再根据编号过滤
 5 select e.ename from emp e where e.DEPTNO = (select d.deptno from dept d where d.DNAME = \'SALES\');
 6 
 7 ENAME    
 8 ----------
 9 ALLEN 
10 WARD 
11 MARTIN 
12 BLAKE 
13 TURNER 
14 JAMES 
15 
16  选定了 6
 1 -- 9.列出薪金高于公司平均薪金的所有员工
 2 -- 先算出平均薪金
 3 select AVG(sal) from emp;
 4 -- 再做比较
 5 select e.ENAME from emp e where e.SAL > (select AVG(sal) from emp);
 6 
 7 ENAME    
 8 ----------
 9 JONES 
10 BLAKE 
11 CLARK 
12 SCOTT 
13 KING  
14 FORD 
15 
16  选定了 6
 1 -- 10.列出与“SCOTT”从事相同工作的所有员工
 2 -- 先算出SCOTT的工作
 3 select JOB from emp where ENAME =\'SCOTT\';
 4 -- 再做过滤
 5 select e.ENAME from emp e where e.job = (select JOB from emp where ENAME =\'SCOTT\')
 6 
 7 ENAME    
 8 ----------
 9 SCOTT 
10 FORD 
1 -- 11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金
2 -- 先算出部门编号为30的员工的薪金
3 select e.sal from emp e where e.deptno = 30;
4 -- 然后过滤条件sal在上面的薪金中
5 -- 同时部门编号不等于30 开始我没有加此限制条件 查询出来的结果全是部门30的人 应该就是答案 但是答案过滤掉了部门30 不知道其意思
6 select * from emp ee where ee.sal in (select e.sal from emp e where e.deptno = 30) and ee.DEPTNO<>30;
-- 12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金
-- 先查出部门30最高薪金
select max(e.sal) from emp e where e.deptno=30;
-- 再过滤 此处没有过滤掉部门30 不懂
select * from emp ee where ee.sal>(select max(e.sal) from emp e where e.deptno=30);

 

1 -- 13.列出在每个部门工作的员工数量、平均工资和平均服务期限
2 -- 先算出部门名称
3 -- 再算部门人数
4 -- 再算平均服务期限以天为标准 to_date(sysdate)
5 -- 根据deptno分组再使用子查询
select (select d.dname from dept d where d.DEPTNO=e.deptno) deptname,count(1) deptcount,avg(sal) avgsalary,avg(TO_DATE(sysdate)-TO_DATE(e.hiredate)) avgdate from emp e group by e.deptno;
1 -- 14.列出所有员工的姓名、部门名称和工资
2 -- 我使用了左外连接
3 select e.ENAME,d.DNAME,e.SAL from emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno;
4 -- 也可以使用子查询
5 select e.ENAME,(select d.dname from DEPT d where d.DEPTNO=e.DEPTNO),e.SAL from emp e;
1 -- 15.列出所有部门的详细信息和部门人数
2 -- 使用左外链接失败
3 -- 使用子查询算出部门人数 没思路
4 select a.deptno,a.dname,a.loc,(select count(deptno) from emp b where b.deptno=a.deptno group by b.deptno) as deptcount from dept a;
1 -- 16.列出各种工作的最低工资
2 -- 先根据工作分组
3 -- 求最低
4 select min(sal),JOB from emp group by job;
 1 -- 17.列出各个部门的MANAGER(经理)的最低薪金
 2 -- 先找出job是manager的
 3 -- 在根据deptno分组
 4 -- 在计算最小值
 5 select e.deptno,min(e.SAL) from emp e where e.job=\'MANAGER\' group by e.deptno;
 6 
 7     DEPTNO MIN(E.SAL)
 8 ---------- ----------
 9      30  2850 
10      20  2975 
11      10  2450 
 1 -- 18.列出所有员工的年工资,按年薪从低到高排序
 2 -- 年工资等于 sal+comm
 3 -- 有的没有comm 空值
 4 -- 使用nvl(comm,0) 给comm一个预设值 如果comm为null 则返回0 否则原样返回
 5 select e.ENAME,(e.sal+nvl(e.COMM,0))*12 annual_salary from emp e order by annual_salary;
 6 
 7 ENAME      ANNUAL_SALARY
 8 ---------- -------------
 9 SMITH     9600 
10 JAMES   11400 
11 ADAMS   13200 
12 MILLER   15600 
13 TURNER   18000 
14 WARD   21000 
15 ALLEN   22800 
16 CLARK   29400 
17 MARTIN   31800 
18 BLAKE   34200 
19 JONES   35700 
20 FORD   36000 
21 SCOTT   36000 
22 KING    60000 
23 
24  选定了 14

原文博客地址:http://database.51cto.com/art/201106/270214.htm

以上是关于查询emp表中每个员工的名称及其所在部门的平均工资。的主要内容,如果未能解决你的问题,请参考以下文章

查询每个部门总工资,和每个部门的平均工资的sql语句?

用oracle怎样查询每个部门的部门编号,部门名称,平均工资,最高工资和最低工资

Oracle复杂查询及总结

Oracle笔记 复杂查询及总结

oracle简单编程问题,在线等 急急急!大大悬赏

哪些员工的工资大于所在部门的平均工资?用mysql查询语句