日期:2014-05-18  浏览次数:20603 次

求一道数据库面试题
部门表:
DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
DEPTNO:部门编号
DNAME:部门名称
LOC:部门地点

雇员表:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK 7902 1980-12-17 800 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600 300 30
7521 WARD SALESMAN 7698 1981-2-22 1250 500 30
7566 JONES MANAGER 7839 1981-4-2 3975 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250 1400 30
7698 BLAKE MANAGER 7839 1981-5-1 2850 30
7788 SCOTT ANALYST 7566 1987-4-19 3000 20
7844 TURNER SALESMAN 7698 1981-9-8 1500 0 30
7876 ADAMS CLERK 7788 1987-5-23 1100 20
7900 JAMES CLERK 7698 1981-12-3 950 30
7902 FORD ANALYST 7566 1981-12-3 3000 10
EMPNO:雇员编号
ENAME:雇员姓名
JOB:工作类别
MGR:上级编号
HIREDATE:雇佣日期
SAL:月薪
COMM:每月津贴
DEPTNO:部门编号

--1、列出月薪比 "BLAKE" 少的所有雇员
--2、列出至少有一个雇员的部门详细信息
--3、列出所有雇员的姓名及其直接上级的姓名 
--4、列出入职日期早于其直接上级的所有雇员  
--5、列出没有雇员的部门信息  
--6、列出所有“CLERK”(办事员)的姓名及其部门名称 
--7、列出各种工作类别中月薪大于1500的最低薪金
--8、列出月薪高于公司平均水平的所有雇员
--9、列出与“SCOTT”从事相同工作的所有雇员  
--10、列出某些雇员的姓名和薪金,条件是他们的月薪高于部门30中所有雇员的薪金
--11、列出每个部门的信息以及该部门中雇员的数量  
--12、列出所有雇员的雇员名称、部门名称和月薪  
--13、列出各个部门的MANAGER(经理)的最低薪金
--14、列出所有雇员的年薪,并且按年薪排序(按12个月计算)
--15、列出薪金水平处于第四位的雇员
第一种理解答案:按工资位次排,排在第4位的员工


实现要求:每到问题必须用子查询,而且只能是一条语句实现。

------解决方案--------------------
SQL code
/*
tb_dept:部门表:
DEPTNO:部门编号
DNAME:部门名称
LOC:部门地点*/
if object_id('tb_dept') is not null drop table tb_dept
go
create table tb_dept(DEPTID char(4),DEPTNAME varchar(10),LOC varchar(50))
go
insert into tb_dept
select 'D001','ACCOUNTING','NEW YORK' union all
select 'D002','RESEARCH','DALLAS' union all
select 'D003','SALES','CHICAGO' union all
select 'D004','OPERATIONS','BOSTON' 
--EMPNO:雇员编号
--ENAME:雇员姓名
--JOB:工作类别
--MGR:上级编号
--HIREDATE:雇佣日期
--SAL:月薪
--COMM:每月津贴
--DEPTNO:部门编号
create table tb_employee(EMPID int,EMPNAME varchar(10),JOB char(10) ,MGRID int,INDATE smalldatetime,SAL int,COMM int,DEPTID char(4))
insert into tb_employee
select 7369,'SMITH','CLERK',7902,'1980-12-17',800,null,'D002' union all
select 7499,'ALLEN','SALESMAN',7698,'1981-2-20',1600,300,'D003' union all
select 7521,'WARD','SALESMAN',7698,'1981-2-22',1250,500,'D003' union all
select 7566,'JONES','MANAGER',7839,'1981-4-2',3975,null,'D002' union all
select 7654,'MARTIN','SALESMAN',7698,'1981-9-28',1250,1400,'D003' union all
select 7698,'BLAKE','MANAGER',7839,'1981-5-1',2850,null,'D003' union all
select 7788,'SCOTT','ANALYST',7566,'1987-4-19',3000,null,'D002' union all
select 7844,'TURNER','SALESMAN',7698,'1981-9-8',1500,0,'D003' union all
select 7876,'ADAMS','CLERK',7788,'1987-5-23',1100,null,'D002' union all
select 7900,'JAMES','CLERK',7698,'1981-12-3',950,null,'D003' union all
select 7902,'FORD','ANALYST',7566,'1981-12-3',3000,null,'D001'


--1、列出月薪比 "BLAKE" 少的所有雇员
select * from tb_employee where SAL<(select SAL from tb_employee where EMPNAME='BLAKE')
--2、列出至少有一个雇员的部门详细信息
select * from tb_dept where DEPTID in (select DEPTID from tb_employee group by DEPTID having COUNT(deptid)>0)
--3、列出所有雇员的姓名及其直接上级的姓名  
select ta.EMPID,ta.EMPNAME,ta.MGRID,ISNULL(tb.EMPNAME,'沒有上級') as '上級領導' from tb_employee ta left join tb_employee tb on ta.MGRID=tb.EMPID
--4、列出入职日期早于其直接上级的所有雇员
select ta.EMPID,ta.EMPNAME,ta.INDATE '自己indate',tb.INDATE '領導indate' from tb_employee ta left join tb_employee tb on ta.MGRID=tb.EMPID where ta.INDATE<tb.INDATE
--5、列出没有雇员的部门信息   
select * from tb_dept where DEPTID not in (select DEPTID from tb_employee group by DEPTID having COUNT(deptid)>0)
--6、列出所有“CLERK”(办事员)的姓名及其部门名称  
select ta.EMPNAME,tb.DEPTNAME from tb_employee ta left join tb_dept tb on ta.DEPTID=tb.DEPTID where JOB='CLERK'
--7、列出各种工作类别中月薪大于1500的最低薪金
select JOB,min(SAL) from tb_employee