有一段时间没做数据库的题了,前面面试偶然做到这么一题目,觉得不错,凭记忆将题目记下来,然后在数据库中实现了一遍。

  题目大概是这样: 一张员工表 employee,包含字段 id,name,salary,dep_no; 一张部门信息表 department,包含字段 id,dep_no,name,其中 employee 的 dep_no 关联 department 的 dep_no;写 sql 查出各部门超出部门平均薪资的员工的姓名,薪资,所在部门名称及部门平均薪水。

  下面是我创建的两张表:

DROP TABLE IF EXISTS department;
CREATE TABLE department (
id int NOT NULL auto_increment PRIMARY KEY,
dep_no int NOT NULL,
`name` VARCHAR(50) NOT NULL
);
INSERT INTO department(dep_no,name) VALUES(10,'研发部');
INSERT INTO department(dep_no,name) VALUES(20,'测试部');
INSERT INTO department(dep_no,name) VALUES(30,'财务部');

DROP TABLE IF EXISTS employee;
CREATE TABLE employee (
`id`  int NOT NULL auto_increment,
`name`  varchar(50) NOT NULL ,
`salary` double(10,2) NOT NULL DEFAULT 0,
`dep_no` INTEGER NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO employee(name,salary,dep_no) SELECT 'Bruce',15000.00,dep_no FROM department WHERE `name` = '研发部';
INSERT INTO employee(name,salary,dep_no) SELECT 'Kevin',16000.00,dep_no FROM department WHERE `name` = '研发部';
INSERT INTO employee(name,salary,dep_no) SELECT 'Lww',12000.00,dep_no FROM department WHERE `name` = '财务部';
INSERT INTO employee(name,salary,dep_no) SELECT 'Linda',10000.00,dep_no FROM department WHERE `name` = '财务部';
INSERT INTO employee(name,salary,dep_no) SELECT 'David',10000.00,dep_no FROM department WHERE name = '测试部';
INSERT INTO employee(name,salary,dep_no) SELECT 'Sandy',8000.00,dep_no FROM department WHERE name = '测试部';
INSERT INTO employee(name,dep_no) SELECT 'Dennis' ,dep_no FROM department WHERE name = '测试部';

  题目的分析:首先要得到目标员工的姓名,薪资不用说要从 employee 表中获得;至于后两个数据部门名称及部门平均薪资,直接查 department 肯定得不到,需要两表联立查询,不妨就写出这块的 sql :

SELECT AVG(e.salary) AS avg_sal,d.dep_no,d.`name`
FROM employee e,department d
WHERE d.dep_no = e.dep_no
GROUP BY d.dep_no,d.`name`;

  这里之所以 dep_no,name两个字段作为分组字段,是因为后面的查询目标中有 name,而 dep_no 作为部门的一个唯一标识,它是天然的分组字段,同时考虑到这一部中查询结果要与 employee 表联立,而两者之又只能以 dep_no 连接,而一般情况下不会出现一个部门对应多个部门号的情况,所以 group by dep_no 与 group by dep_no,name 正常情况下结果应该是一样的。

  将上面的结果作为临时表 tmp 放入主查询,最终得到:

SELECT e.`name`,e.salary,tmp.dep_name,tmp.avg_sal FROM employee e,(
SELECT AVG(e.salary) AS avg_sal,d.dep_no,d.`name` AS dep_name
FROM employee e,department d
WHERE d.dep_no = e.dep_no
GROUP BY d.dep_no,d.`name`
)tmp WHERE e.dep_no = tmp.dep_no
AND e.salary > tmp.avg_sal;

  当然,如果真的存在一个 name 对应多个 dep_no 或者说存在不同部门取同一个名称的情况 ,那么也可用下面的方式得到正确结果:

SELECT e.`name`,e.salary,d.`name` AS dep_name,tmp.avg_sal FROM employee e,department d,(
SELECT AVG(e.salary) AS avg_sal,d.dep_no
FROM employee e,department d
WHERE d.dep_no = e.dep_no
GROUP BY d.dep_no
)tmp WHERE e.dep_no = tmp.dep_no AND e.dep_no = d.dep_no
AND e.salary > tmp.avg_sal;

  还是将 dep_no 作为唯一分组字段,外层查询再关联 department 就行了。

  

  PS: 搜了一圈,好像其他地方也有类似这样的题目,但我觉得我做的这一版还是很细致的,很有参考价值。

  

转载于:https://www.cnblogs.com/binye-typing/p/9257988.html

数据库笔试——查出各部门超出部门平均薪资的员工的姓名,薪资,所在部门名称及部门平均薪水...相关推荐

  1. mysql查询高于部门平均工资_Oracle数据库中 查询高于自己部门平均工资的员工信息 用相关子查询怎么做啊?...

    展开全部 每个部门俯场碘渡鄢盗碉醛冬互大于所有人平均636f707962616964757a686964616f31333365633838工资的员工: Select BM,YG From TB WH ...

  2. mysql查询高于部门平均工资_Oracle数据库中 查询高于自己部门平均工资的员工信息 用相关子查询怎么做啊?...

    每个部门俯场碘渡鄢盗碉醛冬互大于所有人平均工资的员工: Select BM,YG From TB WHERE Salary>(Select Avg(Salary) From TB) 每个部门大于 ...

  3. SQL基础题 一、查出每个部门高于部门平均工资的员工名单

    --CREATE TABLE 表名称 --( --列名称1 数据类型, --列名称2 数据类型, --列名称3 数据类型, --.... --) -- 创建一个职员表 --create table e ...

  4. 数据库查询:列出各个部门中工资高于本部门平均工资的员工信息,并按部门号排序。

    列出各个部门中工资高于本部门平均工资的员工信息,并按部门号排序. select a.deptno,count(*) from emp as a, (select deptno,avg(sal) as ...

  5. 通过下面语句创建employee数据库和dept(部门表)、emp(员工表)、salgrade(工资等级表)34题

    声明:其中大概有错误的地方 希望大佬指出来 set foreign_key_checks = 0; drop database if exists employee; create database ...

  6. mysql查询平均工资最低的部门_查询出部门名称、部门的员工数、部门的平均工资、部门的最低收入雇员姓名和最高收入雇员的姓名...

    如题: 查询出部门名称.部门的员工数.部门的平均工资.部门的最低收入雇员姓名和最高收入雇员的姓名 这是oracle的默认Scott用户以下的emp 和 dept 表间的一道思考题. 雇员表(emp) ...

  7. 假设一个公司的医疗保健数据库有如下 3 个关系: 职工(职工号,姓名,性别,职务,家庭地址,部门编号) 部门(部门编号,部门名称,办公地址,电话) 保健(保健卡编号,职工号,检查身体日期,健

    假设一个公司的医疗保健数据库有如下 3 个关系: 职工(职工号,姓名,性别,职务,家庭地址,部门编号) 部门(部门编号,部门名称,办公地址,电话) 保健(保健卡编号,职工号,检查身体日期,健康状况) ...

  8. 查询出部门名称、部门的员工数、部门的平均工资、部门的最低收入雇员姓名和最高收入雇员的姓名...

    如题: 查询出部门名称.部门的员工数.部门的平均工资.部门的最低收入雇员姓名和最高收入雇员的姓名 这是oracle的默认Scott用户以下的emp 和 dept 表间的一道思考题. 雇员表(emp) ...

  9. 查询出部门名称、部门的员工数、部门的平均工资、部门的最低收入雇员姓名和最高收入雇员的姓名

    如题: 查询出部门名称.部门的员工数.部门的平均工资.部门的最低收入雇员姓名和最高收入雇员的姓名 这是oracle的默认Scott用户下面的emp 和 dept 表间的一道思考题. 雇员表(emp) ...

最新文章

  1. linux下使用source /etc/profile保存配置后,新的环境变量只能在一个终端里面有效
  2. 连肝 7 个晚上,总结了 66 条计算机网络的知识点
  3. ML DL 知乎问题收集
  4. Ubuntu下配置samba实现文件夹共享
  5. 软件架构阅读笔记11
  6. Semaphore及其用法
  7. 业务数据分析学习笔记--Lesson1
  8. ifix从sqlserver里读数据_国外自动化组态软件介绍:InTouch|WinCC|iFix|Citect
  9. modbus调试工具开发(1)--windows下编译libmodbus库文件
  10. 同步助手 android 微信 表情包,微信表情轻松导,同步助手带你装逼带你飞
  11. OpenLayers叠加天地图矢量、影像、注记
  12. python中db是什么意思_Python3爬虫中MongoDB的存储操作是什么
  13. 数据结构 课堂测验错题_200911
  14. 用Android studio设计贺卡,功能强大的贺卡设计制作软件推荐:Hallmark Card Studio
  15. Linux数据结构之radix-tree
  16. 教你如何用python画出4种风格不一的树
  17. Criteo启动上海数据中心,加大对中国市场的投入
  18. 中国大学MOOC体育保健学考试试题及答案
  19. 软件项目规划大纲知识点
  20. 哥德尔不完全性定理探索数学边界

热门文章

  1. *基于RT-Thread的战舰开发板连接Onenent云平台(学习笔记)**
  2. 解决 Minecraft 官方启动器 报错找不到 launcher.dll / LoadErrorNotPresent 的解决方法
  3. Windows7 Embedded Standard x64更新代码80072EFE解决方法
  4. VUE全家桶项目实战-- 4.后台首页布局
  5. 【中文分词】 FMM BMM (python)
  6. mmdet更改faster-rcnn的主干网络训练
  7. html响应式布局ipad,响应式布局(Responsive design)
  8. 爱思国际获戈壁创投数百万美元Pre-A 轮融资,意做菲律宾的分众传媒...
  9. Element 中时间选择器配置 本月 及 上个月 快捷方式
  10. ASP.NET Web程序设计 第六章 三层架构