一个数据库面试题的多种解法

来源:互联网 发布:淘宝怎么搜索金冠店铺 编辑:程序博客网 时间:2024/05/16 04:37

考题:现有两张表,以下为表结构

create table dep(
depid int identity primary key, --部门号
depname varchar(20)   -- 部门名称
)

create table emp(
empid int identity primary key,      --员工号
empname varchar(20),        --员工姓名
salary money,         --工资
depid int          --部门号
)

问题:

1、请用一条sql语句查询出各部门的平均工资。结果显示为如下形式:

   部门号       平均工资
  --------------------------
     1         2500.4521
     2         2845.0121

这个比较简单,不过有几种方式。

正解1:
select depid 部门号, avg(salary) 平均工资
from emp
group by depid

正解2:
select t1.depid 部门号,avg(t2.salary) 平均工资
from dep t1
inner join emp t2 on t1.depid=t2.depid
group by t1.depid

正解3:
select 部门号=depid,平均工资=avg(salary) from emp group by depid

2、请列出工资大于本部门平均工资的员工姓名和部门号以及统计此部门的人数。结果显示为如下形式:

    EMPNAME     DEPID    部门人数
  ---------------------------------  
     ZHANGSAN     1        15
     LISI         2        10

这个有点难度,我试了半天都没解决。

正解1:

SELECT T1.empname,T1.depid,T2.部门人数
FROM dbo.emp T1
INNER JOIN
(select t1.depid, avg(t2.salary) AS salary, COUNT(empid) AS 部门人数
from dep t1
inner join dbo.emp t2 on t1.depid=t2.depid
group by t1.depid) T2 ON T1.depid=T2.depid
WHERE T1.salary>T2.salary

正解2:
select empname,emp.depid,s 部门人数 from emp Inner Join (select depid,avg(salary) a,count(1) s from emp group by depid) b on emp.depid=b.depid and salary>a

第二条sql语句相对简单些。。。。