任务卡_05-数据库_-MySql 高级任务

目录

一,财务管理系统-数据库模块

1,任务概述

2,参考代码

2.1 数据准备

2.2 参考SQL语句

1. 修改表结构,在部门表中添加部门简介字段 

2. 将李四的职称改为“工程师”,并将她的基本工资改成 2000,职务工资 为 700

3. 删除人事部门的部门记录 

4. 查询出每个雇员的雇员编号,实发工资,应发工资 

5. 查询姓张且年龄小于 40 的员工记录 

扫描二维码关注公众号,回复: 12919014 查看本文章

6. 查询雇员的雇员编号,姓名,职称,部门名称,实发工资 

7. 查询销售部门的雇员姓名,工资

8. 统计各职称的人数 

9. 统计各部门的部门名称,实发工资总和,平均工资 

10. 查询比销售部门所有员工基本工资都高的雇员姓名


一,财务管理系统-数据库模块

1,任务概述

程序员冯帅前脚更把学生系统理顺,组长看他 sql 写的不错,于是给他安 排跟着一个新项目,项目是为公司的财务部门进行财务管理的。下面是项目所 需的数据表和功能需求 

数据表:

  • 雇员表(employee):雇员编号(empid,主键),姓名(name),性别(sex), 职称(title),出生日期(birthday),所属部门(depid) 
  • 部门(department):部门编号(depid,主键),部门名称(depname) 
  • 工资表(salary):雇员编号(empid),基本工资(basesalary),职务工 资(titlesalary),扣除(deduction)

需求:

  • 1. 修改表结构,在部门表中添加部门简介字段 
  • 2. 将李四的职称改为“工程师”,并将她的基本工资改成 2000,职务工资 为 700
  • 3. 删除人事部门的部门记录 
  • 4. 查询出每个雇员的雇员编号,实发工资,应发工资 
  • 5. 查询姓张且年龄小于 40 的员工记录 
  • 6. 查询雇员的雇员编号,姓名,职称,部门名称,实发工资 
  • 7. 查询销售部门的雇员姓名,工资
  • 8. 统计各职称的人数 
  • 9. 统计各部门的部门名称,实发工资总和,平均工资 
  • 10. 查询比销售部门所有员工基本工资都高的雇员姓名

2,参考代码

2.1 数据准备

雇员表(employee)

/*
 Navicat Premium Data Transfer

 Source Server         : localhost_3306
 Source Server Type    : MySQL
 Source Server Version : 50731
 Source Host           : localhost:3306
 Source Schema         : demo

 Target Server Type    : MySQL
 Target Server Version : 50731
 File Encoding         : 65001

 Date: 20/03/2021 21:34:24
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for employee
-- ----------------------------
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee`  (
  `empid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `sex` varchar(4) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `title` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `birthday` datetime(0) NULL DEFAULT NULL,
  `depid` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`empid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of employee
-- ----------------------------
INSERT INTO `employee` VALUES (1, '唐三', '男', '董事长', '2000-01-01 21:10:26', 6);
INSERT INTO `employee` VALUES (2, '小舞', '女', '副董事长', '1900-01-01 21:11:22', 6);
INSERT INTO `employee` VALUES (3, '戴沐白', '男', '人事部长', '1999-06-06 21:15:21', 1);
INSERT INTO `employee` VALUES (4, '朱竹清', '女', '人事副部长', '2004-08-20 21:16:11', 1);
INSERT INTO `employee` VALUES (5, '奥斯卡', '男', '销售部长', '1999-01-02 21:16:58', 2);
INSERT INTO `employee` VALUES (6, '宁荣荣', '女', '销售主管', '2001-03-20 21:17:36', 2);
INSERT INTO `employee` VALUES (7, '牛皋', '男', '后勤副部长', '1990-01-01 21:18:30', 3);
INSERT INTO `employee` VALUES (8, '泰坦', '男', '后勤部长', '1990-06-06 21:18:57', 3);
INSERT INTO `employee` VALUES (9, '白鹤', '男', '业务部长', '1990-03-09 21:19:56', 4);
INSERT INTO `employee` VALUES (10, '杨无敌', '男', '业务副部长', '1990-08-15 21:20:25', 4);
INSERT INTO `employee` VALUES (11, '比比东', '女', '财务部长', '1995-06-06 21:21:49', 5);
INSERT INTO `employee` VALUES (12, '玉小刚', '男', '财务副部长', '1995-08-08 21:22:32', 5);
INSERT INTO `employee` VALUES (13, '李四', '男', '销售员', '2000-12-01 21:23:19', 2);
INSERT INTO `employee` VALUES (14, '张三', '男', '销售员', '2003-01-30 21:24:25', 2);
INSERT INTO `employee` VALUES (15, '张伟', '男', '副董事长', '1970-01-01 21:25:52', 6);
INSERT INTO `employee` VALUES (16, '张大炮', '男', '工程师', '1999-11-11 21:27:08', 1);

SET FOREIGN_KEY_CHECKS = 1;

部门(department)

/*
 Navicat Premium Data Transfer

 Source Server         : localhost_3306
 Source Server Type    : MySQL
 Source Server Version : 50731
 Source Host           : localhost:3306
 Source Schema         : demo

 Target Server Type    : MySQL
 Target Server Version : 50731
 File Encoding         : 65001

 Date: 20/03/2021 21:34:13
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for department
-- ----------------------------
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department`  (
  `depid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `depname` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`depid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of department
-- ----------------------------
INSERT INTO `department` VALUES (1, '人事部门');
INSERT INTO `department` VALUES (2, '销售部门');
INSERT INTO `department` VALUES (3, '后勤部门');
INSERT INTO `department` VALUES (4, '业务部门');
INSERT INTO `department` VALUES (5, '财务部门');
INSERT INTO `department` VALUES (6, '管理部门');

SET FOREIGN_KEY_CHECKS = 1;

工资表(salary)

/*
 Navicat Premium Data Transfer

 Source Server         : localhost_3306
 Source Server Type    : MySQL
 Source Server Version : 50731
 Source Host           : localhost:3306
 Source Schema         : demo

 Target Server Type    : MySQL
 Target Server Version : 50731
 File Encoding         : 65001

 Date: 20/03/2021 21:34:31
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for salary
-- ----------------------------
DROP TABLE IF EXISTS `salary`;
CREATE TABLE `salary`  (
  `empid` int(11) NULL DEFAULT NULL,
  `basesalary` decimal(10, 2) NULL DEFAULT NULL,
  `titlesalary` decimal(10, 2) NULL DEFAULT NULL,
  `deduction` decimal(10, 2) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of salary
-- ----------------------------
INSERT INTO `salary` VALUES (1, 10000.00, 10000.00, 0.00);
INSERT INTO `salary` VALUES (2, 10000.00, 9000.00, 0.00);
INSERT INTO `salary` VALUES (3, 9000.00, 5000.00, 5.00);
INSERT INTO `salary` VALUES (4, 9000.00, 4500.00, 0.00);
INSERT INTO `salary` VALUES (5, 8000.00, 5000.00, 16.00);
INSERT INTO `salary` VALUES (6, 8000.00, 4500.00, 0.00);
INSERT INTO `salary` VALUES (7, 8000.00, 4500.00, 0.00);
INSERT INTO `salary` VALUES (8, 8000.00, 5000.00, 100.00);
INSERT INTO `salary` VALUES (9, 8000.00, 5000.00, 0.00);
INSERT INTO `salary` VALUES (10, 8000.00, 4500.00, 25.00);
INSERT INTO `salary` VALUES (11, 8000.00, 5000.00, 0.00);
INSERT INTO `salary` VALUES (12, 8000.00, 5000.00, 0.00);
INSERT INTO `salary` VALUES (13, 5000.00, 3000.00, 25.00);
INSERT INTO `salary` VALUES (14, 5000.00, 2500.00, 0.00);
INSERT INTO `salary` VALUES (15, 10000.00, 9500.00, 0.00);
INSERT INTO `salary` VALUES (16, 7000.00, 4000.00, 100.00);

SET FOREIGN_KEY_CHECKS = 1;

2.2 参考SQL语句

1. 修改表结构,在部门表中添加部门简介字段 

alter table department add introduction varchar(100);


2. 将李四的职称改为“工程师”,并将她的基本工资改成 2000,职务工资 为 700

update employee set title='工程师' where name="李四";
update salary set basesalary=2000,titlesalary=700 
	where empid = (select empid from employee where name="李四");

 


3. 删除人事部门的部门记录 

(个人理解是删除这个部门以及这个部门中所有人的信息,包括薪资表、雇员表、部门表中的记录)

delete from salary where empid in (
	select empid from employee where depid = (
		select depid from department where depname="人事部门"
	)
);

delete from employee where depid = (
	select depid from department where depname="人事部门"
);

delete from department where depname = "人事部门";


4. 查询出每个雇员的雇员编号,实发工资,应发工资 

(个人理解:实发工资=basesalary + titlesalary - deduction,应发工资=basesalary + titlesalary)

select a.empid as '雇员编号',
(a.basesalary+a.titlesalary-a.deduction) as '实发工资',
(a.basesalary+a.titlesalary) as '应发工资'
from salary as a;


5. 查询姓张且年龄小于 40 的员工记录 

(个人理解:查询三张表中所有关于符合条件员工的记录)

先选出满足条件的部分记录

select * from employee where name like '张%' and
year(curdate())-year(birthday)>40;

联结其他表,获得所有信息

select employee.*,salary.basesalary,salary.titlesalary,salary.deduction,department.depname,department.introduction from employee
join salary on salary.empid = employee.empid
join department on department.depid = employee.depid
where employee.name like '张%' and year(curdate())-year(employee.birthday)>40;


6. 查询雇员的雇员编号,姓名,职称,部门名称,实发工资 

select employee.empid,employee.name,employee.title,department.depname,(salary.basesalary+salary.titlesalary-salary.deduction) as '实发工资'
from employee
join department on employee.depid=department.depid
join salary on employee.empid=salary.empid
order by employee.empid;


7. 查询销售部门的雇员姓名,工资

select employee.name,employee.title,salary.basesalary,salary.titlesalary,salary.deduction from employee
join salary on employee.empid=salary.empid
where employee.depid in (select depid from department where depname='销售部门');


8. 统计各职称的人数 

select title,count(*) from  employee group by title;


9. 统计各部门的部门名称,实发工资总和,平均工资 

这个查询比较复杂,可以一步步进行拆分。细节可以参考这篇博客第17题的实现方法,传送门<( ̄︶ ̄)↗[GO!]@&再见萤火虫&【05-数据库_数据库高级_SQL进阶练习(部分习题)】【第17题】

1,通过查询,获得新表:包含员工id、实际工资、所属部门名称

select newsalary.*,department.depname
from(
	select salary.empid,(salary.basesalary+salary.titlesalary-salary.deduction) as actualsalary from salary
) as newsalary
join employee on newsalary.empid=employee.empid
join department on employee.depid=department.depid;

2,在查询的结果之上,使用聚集函数,并以depname进行分组即可

select temp.depname,sum(actualsalary) as '工资总和',avg(actualsalary) as '平均工资'
from (
	select newsalary.*,department.depname
	from(
		select salary.empid,(salary.basesalary+salary.titlesalary-salary.deduction) as actualsalary 
		from salary
	) as newsalary
	join employee on newsalary.empid=employee.empid
	join department on employee.depid=department.depid
) as temp
group by temp.depname;


10. 查询比销售部门所有员工基本工资都高的雇员姓名

1,得到销售部门最高基本工资

select max(salary.basesalary) from salary where salary.empid in (
	select employee.empid from employee
	left join department on employee.depid=department.depid
	where department.depname='销售部门'
)

2,比销售部门所有员工基本工资都高的雇员id

select salary.empid from salary where salary.basesalary>(
	select max(salary.basesalary) from salary where salary.empid in (
		select employee.empid from employee
		left join department on employee.depid=department.depid
		where department.depname='销售部门'
	)
);

3,雇员id与雇员表联结,获得雇员姓名

select employee.name from (
	select salary.empid from salary where salary.basesalary>(
		select max(salary.basesalary) from salary where salary.empid in (
			select employee.empid from employee
			left join department on employee.depid=department.depid
			where department.depname='销售部门'
		)
	)
)as temp
left join employee
on employee.empid=temp.empid;


章节汇总在这里(づ ̄3 ̄)づ╭❤~@&再见萤火虫&【05-数据库】


对学习Java感兴趣的同学欢迎加入QQ学习交流群:1126298731

有问题欢迎提问,大家一起在学习Java的路上打怪升级!(o゜▽゜)o☆[BINGO!]

猜你喜欢

转载自blog.csdn.net/qq_41528502/article/details/115034395