数据库笔试——查出各部门超出部门平均薪资的员工的姓名,薪资,所在部门名称及部门平均薪水...
有一段时间没做数据库的题了,前面面试偶然做到这么一题目,觉得不错,凭记忆将题目记下来,然后在数据库中实现了一遍。
题目大概是这样: 一张员工表 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
数据库笔试——查出各部门超出部门平均薪资的员工的姓名,薪资,所在部门名称及部门平均薪水...相关推荐
- mysql查询高于部门平均工资_Oracle数据库中 查询高于自己部门平均工资的员工信息 用相关子查询怎么做啊?...
展开全部 每个部门俯场碘渡鄢盗碉醛冬互大于所有人平均636f707962616964757a686964616f31333365633838工资的员工: Select BM,YG From TB WH ...
- mysql查询高于部门平均工资_Oracle数据库中 查询高于自己部门平均工资的员工信息 用相关子查询怎么做啊?...
每个部门俯场碘渡鄢盗碉醛冬互大于所有人平均工资的员工: Select BM,YG From TB WHERE Salary>(Select Avg(Salary) From TB) 每个部门大于 ...
- SQL基础题 一、查出每个部门高于部门平均工资的员工名单
--CREATE TABLE 表名称 --( --列名称1 数据类型, --列名称2 数据类型, --列名称3 数据类型, --.... --) -- 创建一个职员表 --create table e ...
- 数据库查询:列出各个部门中工资高于本部门平均工资的员工信息,并按部门号排序。
列出各个部门中工资高于本部门平均工资的员工信息,并按部门号排序. select a.deptno,count(*) from emp as a, (select deptno,avg(sal) as ...
- 通过下面语句创建employee数据库和dept(部门表)、emp(员工表)、salgrade(工资等级表)34题
声明:其中大概有错误的地方 希望大佬指出来 set foreign_key_checks = 0; drop database if exists employee; create database ...
- mysql查询平均工资最低的部门_查询出部门名称、部门的员工数、部门的平均工资、部门的最低收入雇员姓名和最高收入雇员的姓名...
如题: 查询出部门名称.部门的员工数.部门的平均工资.部门的最低收入雇员姓名和最高收入雇员的姓名 这是oracle的默认Scott用户以下的emp 和 dept 表间的一道思考题. 雇员表(emp) ...
- 假设一个公司的医疗保健数据库有如下 3 个关系: 职工(职工号,姓名,性别,职务,家庭地址,部门编号) 部门(部门编号,部门名称,办公地址,电话) 保健(保健卡编号,职工号,检查身体日期,健
假设一个公司的医疗保健数据库有如下 3 个关系: 职工(职工号,姓名,性别,职务,家庭地址,部门编号) 部门(部门编号,部门名称,办公地址,电话) 保健(保健卡编号,职工号,检查身体日期,健康状况) ...
- 查询出部门名称、部门的员工数、部门的平均工资、部门的最低收入雇员姓名和最高收入雇员的姓名...
如题: 查询出部门名称.部门的员工数.部门的平均工资.部门的最低收入雇员姓名和最高收入雇员的姓名 这是oracle的默认Scott用户以下的emp 和 dept 表间的一道思考题. 雇员表(emp) ...
- 查询出部门名称、部门的员工数、部门的平均工资、部门的最低收入雇员姓名和最高收入雇员的姓名
如题: 查询出部门名称.部门的员工数.部门的平均工资.部门的最低收入雇员姓名和最高收入雇员的姓名 这是oracle的默认Scott用户下面的emp 和 dept 表间的一道思考题. 雇员表(emp) ...
最新文章
- linux下使用source /etc/profile保存配置后,新的环境变量只能在一个终端里面有效
- 连肝 7 个晚上,总结了 66 条计算机网络的知识点
- ML DL 知乎问题收集
- Ubuntu下配置samba实现文件夹共享
- 软件架构阅读笔记11
- Semaphore及其用法
- 业务数据分析学习笔记--Lesson1
- ifix从sqlserver里读数据_国外自动化组态软件介绍:InTouch|WinCC|iFix|Citect
- modbus调试工具开发(1)--windows下编译libmodbus库文件
- 同步助手 android 微信 表情包,微信表情轻松导,同步助手带你装逼带你飞
- OpenLayers叠加天地图矢量、影像、注记
- python中db是什么意思_Python3爬虫中MongoDB的存储操作是什么
- 数据结构 课堂测验错题_200911
- 用Android studio设计贺卡,功能强大的贺卡设计制作软件推荐:Hallmark Card Studio
- Linux数据结构之radix-tree
- 教你如何用python画出4种风格不一的树
- Criteo启动上海数据中心,加大对中国市场的投入
- 中国大学MOOC体育保健学考试试题及答案
- 软件项目规划大纲知识点
- 哥德尔不完全性定理探索数学边界
热门文章
- *基于RT-Thread的战舰开发板连接Onenent云平台(学习笔记)**
- 解决 Minecraft 官方启动器 报错找不到 launcher.dll / LoadErrorNotPresent 的解决方法
- Windows7 Embedded Standard x64更新代码80072EFE解决方法
- VUE全家桶项目实战-- 4.后台首页布局
- 【中文分词】 FMM BMM (python)
- mmdet更改faster-rcnn的主干网络训练
- html响应式布局ipad,响应式布局(Responsive design)
- 爱思国际获戈壁创投数百万美元Pre-A 轮融资,意做菲律宾的分众传媒...
- Element 中时间选择器配置 本月 及 上个月 快捷方式
- ASP.NET Web程序设计 第六章 三层架构