目录
2. 将李四的职称改为“工程师”,并将她的基本工资改成 2000,职务工资 为 700
一,财务管理系统-数据库模块
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!]