0


mysql实现(工资管理系统)课程设计

目录

1 需求分析 1
2 概念结构设计 2
3 逻辑结构设计 3
4 数据库物理设计与实施 5
5 访问系统库 10
6 总结 11

1 需求分析
本系统的主要目的是,明确查询公司职工某年某月的工资情况,通过职工工资管理系统,能明确的察看到从入职以来,每位职工的每月工资情况。同时也能查询到职工本身的一些基本信息。(这次的设计以2021年12月为例)
设计如下面所示的数据项:
职工信息包括职工号,姓名,性别,出生日期,年龄,部门,职位,入职时间;
工资信息包括职工号,工资年份,月份,原始工资,津贴,所得税,最终工资。

2 概念结构设计
概念结构E-R图如下所示。
在这里插入图片描述

3 逻辑结构设计
(1)E-R图转换成关系模式如下:
职工(职工号,姓名,性别,出生日期,年龄,部门,职位,入职时间)
F = {职工号→姓名,职工号→性别,职工号→出生日期,职工号→年龄,职工号→部门,职工号→职位,职工号→入职时间}

工资(职工号,工资年份,月份,原始工资,津贴,所得税,最终工资)
F = {职工号→原始工资,职工号→月份,职工号→原始工资,职工号→津贴,职工号→所得税,职工号→最终工资}

考勤(职工号,工资年份,工资月份,某天工资,是否打卡)
F = {职工号→工资年份,职工号→工资月份,职工号→某天工资,职工号→是否打卡}

(2)关系模式中属性的详细说明。
职工信息表(功能:存储包含所有员工的信息;包括职工号,姓名,性别,出生日期,年龄,部门,职位,入职时间)
字段名    字段类型    字段长度    默认值    备注Id    Varchar    15    无    职工号,外键Name    Varchar    32    无    职工姓名Sex    Char    5     无    性别Brithday    Data    -    无    出生日期Age    Int    11    无    年龄Dept    Varchar    10    无    所在部门Post    Varchar    15    无    职工职位Start_data    data    -    无    入职日期

员工工资表(功能:存储员工的工资情况,包括职工号,工资年份,月份,原始工资,津贴,所得税,最终工资)
字段名 字段类型 字段长度 默认值 备注
在这里插入图片描述

员工考勤表(功能:监督员工每天的考勤打卡情况,包括职工号,工资年份,工资月份,某天工资,是否打卡)
在这里插入图片描述

4 数据库物理设计与实施
创建数据库
create database SalaryDatabase;
use SalaryDatabase;

创建基本表

use SalaryDatabase;
– 职工表
create table EmployeeTable(
id int primary key auto_increment,
name varchar(32) unique ,# 姓名添加唯一性约束
sex char(5) not null check ( sex='男’or sex=‘女’),
brithday date not null,
age int not null ,
dept varchar(10) not null ,# 部门
post varchar(15) not null ,# 职位
start_data date not null
) character set utf8;

– 添加外键约束
alter table EmployeeTable add foreign key (id) references Employeepayroll (worknumber) ;

desc employeetable; # 查看表结构
show tables;

– 职工工资表
create table Employeepayroll(
worknumber char(15) not null ,
year varchar(10) ,
month varchar(10) ,
wages_job float not null , #工资
allowance float , #津贴
tax float not null , #所得税
real_wages float not null #真实工资
);

为worknumber 添加主键

alter table Employeepayroll add primary key (worknumber);

为worknumber 添加外键

alter table employeepayroll add foreign key (worknumber) references Attendance (worknumber) ;

– 创建考勤表
create table Attendance(
worknumber char(15) not null ,
year varchar(10) ,
month varchar(10) ,
day varchar(10),
iswork varchar(10)
)character set utf8;

– 向职工表中插入数据
insert into employeetable values
(‘0001’,‘张三’,‘男’,(‘1985-01-02’),‘36’,‘研发部’,‘研发部长’,(‘2012-05-11’)),
(‘0002’,‘李四’,‘男’,(‘1986-01-02’),‘35’,‘研发部’,‘员工’,(‘2012-12-18’)),
(‘0003’,‘王五’,‘男’,(‘1990-01-02’),‘31’,‘研发部’,‘项目策划’,(‘2018-05-17’)),
(‘0004’,‘赵翠花’,‘女’,(‘1992-01-02’),‘29’,‘财务部’,‘经理’,(‘2016-03-22’)),
(‘0005’,‘孙玫瑰’,‘女’,(‘1990-06-02’),‘31’,‘人事部’,‘人事部长’,(‘2011-05-11’));

– 向工资表中插入数据
insert into employeepayroll
values (‘0001’,‘2021’,‘12’,‘5400’,‘0’,‘100’,‘5300’),
(‘0002’,‘2021’,‘12’,‘10000’,‘200’,‘100’,‘11000’),
(‘0003’,‘2021’,‘12’,‘5800’,‘80’,‘100’,‘5780’),
(‘0004’,‘2021’,‘12’,‘4000’,‘0’,‘150’,‘3850’);

– 向考勤表中插入数据
insert into attendance values (‘0001’,‘2021’,‘12’,‘20’,‘是’),
(‘0002’,‘2021’,‘12’,‘20’,‘是’),
(‘0003’,‘2021’,‘12’,‘20’,‘是’),
(‘0004’,‘2021’,‘12’,‘20’,‘是’),
(‘0005’,‘2021’,‘12’,‘20’,‘否’),
(‘0001’,‘2021’,‘12’,‘21’,‘是’),
(‘0002’,‘2021’,‘12’,‘21’,‘是’),
(‘0003’,‘2021’,‘12’,‘21’,‘是’),
(‘0004’,‘2021’,‘12’,‘21’,‘是’),
(‘0005’,‘2021’,‘12’,‘21’,‘否’),
(‘0001’,‘2021’,‘12’,‘22’,‘是’),
(‘0002’,‘2021’,‘12’,‘22’,‘是’),
(‘0003’,‘2021’,‘12’,‘22’,‘是’),
(‘0004’,‘2021’,‘12’,‘22’,‘是’),
(‘0005’,‘2021’,‘12’,‘22’,‘是’);

创建视图

create view ep_view as select worknumber,year,month,real_wages from employeepayroll ; #创建工资表真实工资的视图
select * from ep_view; #查看视图

建立和管理索引

为员工生日创建普通索引

create index suo_1 on employeetable(brithday);

show index from employeetable; # 查看employeetable的所有索引

为员工部门和职位创建复合索引

alter table employeetable add index suo_2 (dept,post);

创建一个新表为部门字段添加全文索引

create table new_EmployeeTable(
id int primary key auto_increment,
name varchar(32) unique ,# 姓名添加唯一性约束
sex char(5) not null check ( sex='男’or sex=‘女’),
brithday date not null, #生日
age int not null , #年龄
dept varchar(10) not null ,# 部门
post varchar(15) not null ,# 职位
start_data date not null , # 入职时间
fulltext index suo_3 (dept), # 为dept字段创建全文索引
key using hash(post) # 创建哈希索引

) character set utf8;

drop table new_EmployeeTable; # 删除表
desc new_EmployeeTable; # 查看表结构
show index from new_EmployeeTable; # 查看新表中的索引

show create table new_EmployeeTable; # 查看索引
drop index suo_1 on employeetable; # 删除索引方式一
alter table employeetable drop index suo_1; # 删除索引方式二

创建存储过程

– 创建存储过程
delimiter KaTeX parse error: Expected 'EOF', got '#' at position 40: … (in sid int) #̲in-表示输入参数 sid-表…
delimiter ;

call proc_1(5000); #调用存储过程查询工资表视图中真实工资大于5000的数据
show create procedure proc_1; # 查看存储过程的创建语句
– 创建一个存储过程生成工资报表
delimiter

     c
    
    
     r
    
    
     e
    
    
     a
    
    
     t
    
    
     e
    
    
     p
    
    
     r
    
    
     o
    
    
     c
    
    
     e
    
    
     d
    
    
     u
    
    
     r
    
    
     e
    
    
     p
    
    
     r
    
    
     o
    
    
     
      c
     
     
      2
     
    
    
     (
    
    
     i
    
    
     n
    
    
     s
    
    
     i
    
    
     d
    
    
     1
    
    
     i
    
    
     n
    
    
     t
    
    
     )
    
    
     b
    
    
     e
    
    
     g
    
    
     i
    
    
     n
    
    
     s
    
    
     e
    
    
     l
    
    
     e
    
    
     c
    
    
     t
    
    
     e
    
    
     .
    
    
     i
    
    
     d
    
    
     ,
    
    
     e
    
    
     .
    
    
     n
    
    
     a
    
    
     m
    
    
     e
    
    
     ,
    
    
     a
    
    
     .
    
    
     m
    
    
     o
    
    
     n
    
    
     t
    
    
     h
    
    
     ,
    
    
     A
    
    
     .
    
    
     r
    
    
     e
    
    
     a
    
    
     
      l
     
     
      w
     
    
    
     a
    
    
     g
    
    
     e
    
    
     s
    
    
     f
    
    
     r
    
    
     o
    
    
     m
    
    
     e
    
    
     m
    
    
     p
    
    
     l
    
    
     o
    
    
     y
    
    
     e
    
    
     e
    
    
     t
    
    
     a
    
    
     b
    
    
     l
    
    
     e
    
    
     e
    
    
     l
    
    
     e
    
    
     f
    
    
     t
    
    
     j
    
    
     o
    
    
     i
    
    
     n
    
    
     e
    
    
     m
    
    
     p
    
    
     l
    
    
     o
    
    
     y
    
    
     e
    
    
     e
    
    
     p
    
    
     a
    
    
     y
    
    
     r
    
    
     o
    
    
     l
    
    
     l
    
    
     A
    
    
     o
    
    
     n
    
    
     e
    
    
     .
    
    
     i
    
    
     d
    
    
     =
    
    
     A
    
    
     .
    
    
     w
    
    
     o
    
    
     r
    
    
     k
    
    
     n
    
    
     u
    
    
     m
    
    
     b
    
    
     e
    
    
     r
    
    
     w
    
    
     h
    
    
     e
    
    
     r
    
    
     e
    
    
     A
    
    
     .
    
    
     m
    
    
     o
    
    
     n
    
    
     t
    
    
     h
    
    
     =
    
    
     s
    
    
     i
    
    
     d
    
    
     1
    
    
     ;
    
    
     e
    
    
     n
    
    
     d
    
   
   
     create procedure proc_2 (in sid1 int) begin select e.id,e.name,a.month,A.real_wages from employeetable e left join employeepayroll A on e.id=A.worknumber where A.month = sid1; end 
   
  
 createprocedureproc2​(insid1int)beginselecte.id,e.name,a.month,A.realw​agesfromemployeetableeleftjoinemployeepayrollAone.id=A.worknumberwhereA.month=sid1;end

call proc_2(12); # 调用存储过程显示工资报表

创建触发器

– 创建触发器(当插入一条新记录之前,如果员工真实工资小于5000,则自动更新为正确工资)
create trigger tri_1 before insert on
employeepayroll for each row
begin
if new.real_wages <= 5000 then set new.real_wages=new.wages_job+new.allowance-new.tax;
end if;
end;

drop trigger tri_1; #删除触发器
5 访问系统库
查询操作

查询某个人所得工资,以员工2为例

select id,name from employeetable where id = 2
union
select worknumber,real_wages from employeepayroll where worknumber=2;

(子)查询工资表中真实工资大于5000的员工

select * from employeepayroll where real_wages in (select real_wages from employeepayroll where real_wages>5000);

带比较运算符的子查询(查询工资表中津贴大于200的员工)

select * from employeepayroll where allowance > (select allowance from employeepayroll where allowance=200);

更新操作

1、更新某人的职位

update employeetable set post=‘总经理’ where name=‘李四’;

2、更新工号为4的赵翠花的津贴为250

update employeepayroll set allowance=250 where worknumber=4;

删除操作

1、删除工号为1的员工张三的所有信息

delete from employeetable where name=‘张三’; # 删除张三的员工表信息
delete from employeepayroll where worknumber=0001; # 删除张三的工资表信息

6 总结
在完成本次课程设计的阶段,我学到了要多主动积极的思考解决问题。有很多同学比较好学,总是不停的在与别人沟通交流,看似很积极,但是仔细分析他提出的那些问题确实没有太大的价值,稍微思考一下就能解决,只有经过自己不断的思考,才能达到课程设计的效果,没有谁一开始就会,都是后天不断的历练的结果。
总的看来,要想高效的完成此次数据库课程设计,首先就要有一个扎实的理论基础,掌握课本上的命令操作、重点概念等。其次,团队的合作也是必不可少的,这需要后期的交流锻炼和信任。一个好的团队往往能够起到事半功倍的效果,我就认为我们团队的整体氛围就很好,很和谐,组员能够积极的完成分配的任务。虽然我们小组还有很多不足之处,但是还是值得肯定的,小组成员都很优秀,我自己也要更加努力,这次的课程设计也是一个很好的锻炼,同时也感谢有这么一个机会来提升团队合作的能力。
在数据库的设计阶段,遇到了很多问题,比如对第三范式的思考,由于理解的不是很透彻,第三范式的构造不是很顺利,在不断的沟通合作下,认识了第三范式的知识,还有在创建公司财务报表的自动汇总生成的时候,尝试了很多的方法,用了触发器,用了函数,在一番权衡之下决定使用存储过程,然后通过调用存储过程来实现每个月份工资报表的汇总情况。
在不断的思考中,我学到了很多的东西,很多宝贵的精神,比如说合作精神,在团队的合作下,每个人都有很大的作用,众人拾柴火焰高,由于合作的完善和良好,才是的我们的进度比想象中的要快。
我们今后定将更加积极向前,力争做到更好!


本文转载自: https://blog.csdn.net/weixin_46631286/article/details/122290135
版权归原作者 @小布学长 所有, 如有侵权,请联系我们删除。

“mysql实现(工资管理系统)课程设计”的评论:

还没有评论