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

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

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

下面是我创建的两张表:

DROP TABLE IF EXISTSdepartment;CREATE TABLEdepartment (

idint NOT NULL auto_increment PRIMARY KEY,

dep_noint 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,'财务部');

6a3854c761b7cc341ace4476abb3be00.png

DROP TABLE IF EXISTSemployee;CREATE TABLEemployee (

`id`int NOT NULLauto_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 = '测试部';

04ea2f9e0077857b5d1fe2a768b5b4d2.png

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

SELECT AVG(e.salary) ASavg_sal,d.dep_no,d.`name`FROMemployee e,department dWHERE d.dep_no =e.dep_noGROUP 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 FROMemployee e,(SELECT AVG(e.salary) AS avg_sal,d.dep_no,d.`name` ASdep_nameFROMemployee e,department dWHERE d.dep_no =e.dep_noGROUP BYd.dep_no,d.`name`

)tmpWHERE e.dep_no =tmp.dep_noAND e.salary > tmp.avg_sal;

3ddda7a527a69381593d8fa636ce438c.png

当然,如果真的存在一个 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: 搜了一圈,好像其他地方也有类似这样的题目,但我觉得我做的这一版还是很细致的,很有参考价值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.创建视图v_1,存放不及格同学的姓名、学号、课程编号、成绩: ```sql CREATE VIEW v_1 AS SELECT s.name, s.student_id, c.course_id, sc.score FROM student s, course c, score sc WHERE s.student_id = sc.student_id AND c.course_id = sc.course_id AND sc.score < 60 ``` 2.创建函数f_info,根据学号显示该同学的总分,调用函数,用200801同学验证: ```sql CREATE FUNCTION f_info (@student_id CHAR(8)) RETURNS INT AS BEGIN DECLARE @sum INT SELECT @sum = SUM(score) FROM score WHERE student_id = @student_id RETURN @sum END -- 调用函数 SELECT dbo.f_info('200801') ``` 3.创建存储过程p_score,根据学号,返回该学生的平均分,并且执行存储过程,用200801同学验证: ```sql CREATE PROCEDURE p_score @student_id CHAR(8), @avg_score FLOAT OUTPUT AS BEGIN SELECT @avg_score = AVG(score) FROM score WHERE student_id = @student_id END -- 执行存储过程 DECLARE @avg_score FLOAT EXEC p_score '200801', @avg_score OUTPUT SELECT @avg_score ``` 4.创建登录账“u2”,设置密码为“123456”,设置默认数据库为“student”。并创建数据库用户“u2”,使其只具有查看xxda表数据的权限: ```sql -- 创建登录账号 CREATE LOGIN u2 WITH PASSWORD = '123456', DEFAULT_DATABASE = student -- 创建数据库用户 USE student CREATE USER u2 FOR LOGIN u2 -- 给用户授予数据表查看权限 GRANT SELECT ON xxda TO u2 ``` 5.对数据库student创建备份设备student_bf,并对数据库进行完整备份。修改xxda表数据,将刘林的总学分改为65分,再对数据库进行还原,查看xxda的数据变化: ```sql -- 创建备份设备并进行完整备份 USE master EXEC sp_addumpdevice 'disk', 'student_bf', 'C:\backup\student.bak' BACKUP DATABASE student TO student_bf -- 修改数据 USE student UPDATE xxda SET total_credit = 65 WHERE name = '刘林' -- 还原数据库 USE master RESTORE DATABASE student FROM student_bf WITH REPLACE -- 查看数据 USE student SELECT * FROM xxda WHERE name = '刘林' ``` 通过还原操作,可以发现刘林的总学分已经恢复到修改前的分数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值