| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3449 人关注过本帖
标题:如何查看.: 列出各种工作工资前3名的员工
只看楼主 加入收藏
haoyasen
Rank: 2
等 级:论坛游民
帖 子:90
专家分:20
注 册:2013-3-30
结帖率:91.67%
收藏
已结贴  问题点数:74 回复次数:3 
如何查看.: 列出各种工作工资前3名的员工

这是道老题,一共有二十问:
我第二十题不懂  ,大家有时间看看吧。上题。
create table dept(
    deptno int primary key auto_increment,
    dname varchar(14) ,
    loc varchar(13)
) ;

create table emp(
    empno int primary key auto_increment,
    ename varchar(10),
    JOB varchar(9),
    MGR int,
    HIREDATE date,
    SAL int,
    COMM int,
    DEPTNO int not null,
    foreign key (DEPTNO) references dept(deptno)
);
INSERT INTO dept VALUES(10,'ACCOUNTING','NEW YORK');
INSERT INTO dept VALUES(20,'RESEARCH','DALLAS');
INSERT INTO dept VALUES(30,'SALES','CHICAGO');
INSERT INTO dept VALUES(40,'OPERATIONS','BOSTON');
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-06-13',3000,NULL,20);
INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,'1987-06-13',1100,NULL,20);
INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,'1983-01-23',1300,NULL,10);
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.列出所有员工的年工资,按年薪从低到高排序。
19. 求各种工作工资最低的员工。
20. 列出各种工作工资前3名的员工
搜索更多相关主题的帖子: references primary foreign create null 
2013-10-07 21:07
haoyasen
Rank: 2
等 级:论坛游民
帖 子:90
专家分:20
注 册:2013-3-30
收藏
得分:0 
好久没来了,分就这些了,大家慢慢看,有会第二十题,给我说说把 一起进步
2013-10-07 21:08
ghjsmzy
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:187
专家分:573
注 册:2009-6-17
收藏
得分:74 
1.列出至少有一个员工的所有部门。
select * from dept where deptno in (select deptno from emp) ;
2.列出薪金比“SMITH”多的所有员工。
select ename from emp where sal > (select sal from emp where ename = 'SMITH') ;
3.列出所有员工的姓名及其直接上级的姓名。
select a.ename,b.ename from emp a, emp b where a.mgr = b.empno ;
4.列出受雇日期早于其直接上级的所有员工。
select a.ename from emp a, emp b where a.mgr = b.empno and a.hiredate < b.hiredate;
5.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。(列出没有员工的部门用的方法比较笨,楼主是怎么筛选的还请分享下。在oracle上可以用+实现,但是mysql不知道有没有类似的方式)
select a.dname,b.* from dept a, emp b where a.deptno = b.deptno
union all
select a.dname,
    (select b.empno from emp b where 1=2) empno,
    (select b.ename from emp b where 1=2) ename,
    (select b.job from emp b where 1=2) job,
    (select b.mgr from emp b where 1=2) mgr,
    (select b.hiredate from emp b where 1=2) hiredate,
    (select b.sal from emp b where 1=2) sal,
    (select from emp b where 1=2) comm,
    (select b.deptno from emp b where 1=2) deptno
from dept a where not exists (select * from emp c where a.deptno = c.deptno);
6.列出所有“CLERK”(办事员)的姓名及其部门名称。
select a.ename,b.dname from emp a,dept b where a.job = 'CLERK' and a.deptno = b.deptno;
7.列出最低薪金大于1500的各种工作。
select distinct job from emp where sal > 1500 ;
8.列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。
select a.ename from emp a,dept b where b.dname = 'SALES' and a.deptno = b.deptno;
9.列出薪金高于公司平均薪金的所有员工。
select ename from emp where sal > (select avg(sal) from emp);
10.列出与“SCOTT”从事相同工作的所有员工。
select b.ename from emp a, emp b where a.ename = 'SCOTT' and a.job = b.job and b.ename <> 'SCOTT';
11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。
这个题目没有读懂。
12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
这个题目没有读懂。
13.列出在每个部门工作的员工数量、平均工资和平均服务期限。(时间不知道怎么转换,还望楼主)
select deptno,count(*),avg(sal),from_unixtime(avg(hiredate)) from emp group by deptno;
14.列出所有员工的姓名、部门名称和工资。
select a.ename,b.dname,a.sal from emp a, dept b where a.deptno = b.deptno;
15.列出所有部门的详细信息和部门人数。
select b.*,count(*) from emp a, dept b where a.deptno = b.deptno group by b.deptno;
16.列出各种工作的最低工资。
select a.job, min(a.sal) from emp a group by a.job;
17.列出各个部门的MANAGER(经理)的最低薪金。
select c.dname,min(b.sal) from emp a, emp b, dept c where a.mgr = b.empno and c.deptno = b.deptno group by c.dname;
18.列出所有员工的年工资,按年薪从低到高排序。
select ename,(sal+if(comm,comm,0))*12 ysal from emp order by ysal;
19. 求各种工作工资最低的员工。
select t.ename from emp t,
    (select a.job, min(a.sal) sal from emp a group by a.job) b
where t.job = b.job and t.sal = b.sal;
20. 列出各种工作工资前3名的员工(笨法:取工资最高的,再取工资第二、第三的,然后找到工作工资对应的员工。
这个题目解决最好还是用存储过程,给工作分组,对每个工作循环取工资前3名的员工。还有如果有多名人的工资怎么取,题目说的不够明确)
select bb.ename from (
select a.job,max(a.sal) sal from emp a group by a.job
union all
select b.job,max(b.sal) sal from emp b
where not exists (
    select * from (select a.job,max(a.sal) sal from emp a group by a.job) t where b.job = t.job and b.sal = t.sal
) group by b.job
union all
select c.job,max(c.sal) sal from emp c
where not exists (
    select * from (select a.job,max(a.sal) sal from emp a group by a.job) t where c.job = t.job and c.sal = t.sal
) and not exists (
select * from (
    select b.job,max(b.sal) sal from emp b
    where not exists (
    select * from (select a.job,max(a.sal) sal from emp a group by a.job) t where b.job = t.job and b.sal = t.sal
    ) group by b.job
) t where c.job = t.job and c.sal = t.sal
) group by c.job
) aa, emp bb where aa.job = bb.job and aa.sal = bb.sal;

CREATE PROCEDURE p_temp()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE a CHAR(16);
    DECLARE b INT;
    DECLARE cur1 CURSOR FOR select job from emp group by job;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
   
    OPEN cur1;

    SELECT count(*) into b FROM information_schema.tables WHERE table_schema = 'test' AND table_name = 'tb_temp';
    if b > 0 then
            drop table tb_temp;
            create table tb_temp select ename from emp where 1=2;
        ELSE
            create table tb_temp select ename from emp where 1=2;
    end if;

    read_loop: LOOP
    FETCH cur1 INTO a;
   
        IF done THEN
            LEAVE read_loop;
        END IF;

        IF 1 > 0 THEN
            insert into tb_temp
            select ename from emp where job = a order by sal desc limit 0,3;
        ELSE
            select job from emp group by job;
        END IF;
   
    END LOOP;
   
    CLOSE cur1;

END;
2013-10-14 22:52
haoyasen
Rank: 2
等 级:论坛游民
帖 子:90
专家分:20
注 册:2013-3-30
收藏
得分:0 
回复 3楼 ghjsmzy
谢谢  最近一直 在找工作   找到了  回晚了些
2013-11-07 09:19
快速回复:如何查看.: 列出各种工作工资前3名的员工
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017140 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved