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

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

  题目大概是这样: 一张员工表 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 连接。

  将上面的结果作为临时表 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;

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

  

原文地址:https://www.cnblogs.com/binye-typing/p/9257988.html

时间: 2024-10-07 09:17:48

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

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

如题: 查询出部门名称.部门的员工数.部门的平均工资.部门的最低收入雇员姓名和最高收入雇员的姓名 这是oracle的默认Scott用户下面的emp 和 dept 表间的一道思考题. 雇员表(emp) 记录了每个雇员的基本信息 NO  字段         类型            描述 1     empno       Number(4)    雇员编号 2     ename       Varchar2(10)      雇员姓名 3     job         Varchar2(9

部门中薪资超过部门平均薪资的员工姓名及薪资

部门中薪资超过部门平均薪资的员工姓名及薪资 # 题表 # 建表 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age int(3) unsigned not null default 28, hire_date date not null, post varc

面试题: 数据库笔试 sql操作 未看5

2018/5/31 oracle数据库面试笔试试题总结http://www.yjbys.com/qiuzhizhinan/show-308759.html 1/4Oracle数据库1.基础测试选择在部门 30 中员工的所有信息Select * from emp where deptno=30;列出职位为(MANAGER)的员工的编号,姓名Select empno,ename from emp where job = ?Manager ?;找出奖金高于工资的员工Select * from emp

数据库笔试面试题库(Oracle、MySQL等)

数据库笔试面试题库(Oracle.MySQL等) ⊙ [DB笔试面试67]在Oracle中,关于表分区下列描述不正确的是()⊙ [DB笔试面试65]在Oracle中,哪一种表分区方式建议的分区数是2的幂(2.4.8等),以获得最平均的数据发布()⊙ [DB笔试面试63]要以NAME's address is ADDR格式返回数据,以下SQL语句正确的是⊙ [DB笔试面试61]以下关于数据模型要求错误的是()⊙ [DB笔试面试59]以下关于视图叙述不正确的是()⊙ [DB笔试面试57]下列关于SQ

023医疗项目-模块二:药品目录的导入导出-从数据库中查出数据用XSSF导出excel并存放在虚拟目录最后下载(包括调试)

我们要实现的效果: 进入到这个页面后,输入要查询的条件,查询出药品表的数据,然后按下导出按钮 ,就会在服务器的一个目录下生成一个药品表的excel表格. 点击"导出"之后: 点击下载就能下载Excel表格,实现导出功能. 讲解如下: 还是分为三层: 1:Dao层 我们先看sql语句. 在PL/SQL写sql: select id, bm, mc, jx, gg, zhxs, scqymc, spmc,jyzt, zbjg, (select info from dictinfo wher

leetcode185 部门工资前三高的所有员工 Department Top Three Salaries

Employee 表包含所有员工信息,每个员工有对应的 Id,此外还有一列部门 Id. 创建表和数据: Create table If Not Exists Employee (Idint, Name varchar(255), Salary int, DepartmentId int); Create table If Not Exists Department (Idint, Name varchar(255)); Truncate table Employee; insert into E

数据库笔试试题1

在关系数据库设计中,设计关系模式(二维表)是数据库设计中哪个阶段的任务? 正确答案: A   你的答案: C (错误) 逻辑设计阶段 概念设计阶段 物理设计阶段 需求分析阶段解析:按照规范的设计方法,一个完整的数据库设计一般分为以下六个阶段:⑴需求分析:分析用户的需求,包括数据.功能和性能需求:⑵概念结构设计:主要采用E-R模型进行设计,包括画E-R图:⑶逻辑结构设计:通过将E-R图转换成表,实现从E-R模型到关系模型的转换:设计表格的关系和字段⑷数据库物理设计:主要是为

[数据库] 数据库笔试面试常考知识点

范式(深入了解可参考http://www.cnblogs.com/lca1826/p/6601395.html) 第一范式:数据库表的每一项都是不可分割的原子数据项,不能是集合.比如班级信息表里面不能有班级的学生. 第二范式:在第一范式的基础上,所有属性完全依赖于主键,完全依赖就是不能只是取决于主键的一部分. 第三范式:在第二范式的基础上,消除传递依赖,比如学生表里有学生属于的班级编号,但不能有班级的名称,班级人数等班级信息,因为班级信息可有由班级编号通过班级表推出来,有传递依赖   第一范式-

2018秋招数据库笔试面试题汇总

基础概念 1. 什么是数据库事务?事务有什么特点? 数据库事务:是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做,要么全不做,是一个不可分割的工作单元. 事务特点: 原子性 一致性 隔离性 持久性特 2. 主键和外键的区别? 主键所在的列的值是唯一的,不可为空的 外键所在的列的值可以重复,可以为空的,不能创建对应表中不存在的外键值 3. truncate与delete的区别? 比较 truncate delete 相同点 删除表中的全部行 不带where字句删除表中的全部行 相同点 删