大学生创新创业项目管理系统设计——数据库实验九

news2025/5/25 16:39:31

 本实验为自己设计完成,我当年数据库实验得了94分

目录

1.实验目的

2.实验内容和要求

3.实验步骤

4.实验心得


实验九 数据库设计

1.实验目的

掌握数据库设计的过程和方法。

2.实验内容和要求

(35)大学生创新创业项目管理系统设计

一个学生可以参加多个创新创业项目,一个创新项目也可以多个学生参加,创新项目立 项分为国家、省市、学校等不同的等级,有不同的经费资助,每个项目可以有多个指导教师, 创新项目可以用论文、软著、专利结题,论文有作者、期刊名称、发表时间、卷期页号等信 息,软著有发明人、软著名称、软著登记号等信息,专利有申请号、申请时间和发明人等信 息。试设计一个大学生创新创业管理系统,能够完成对学生创新创业的管理,可以实现统计 高校各个学院某个时间段内创新创业的参加和结题情况,也可以统计各个年级某个时间段内 创新创业的参加情况。

对以上题目进行数据库设计,通过网络平台或图书馆查找相关文献进行需求分析,按照下面的实验步骤完成设计要求。

3.实验步骤

(1)根据所选题目进行系统需求分析和系统设计,画出系统的 E-R 图,给出实体或联

系的属性,标明联系的种类;

由上图可知,学生、项目、论文(或软著、专利)之间存在冗余,我考虑了去除“结题”这一联系,但是由于学生与项目之间是多对多的关系、学生与论文(或软著、专利)之间也是多对多的关系,去除“结题”这一联系后,对于指定项目的结题成果将无法查询到,所以决定保留此冗余,以便于后续查询。

(2)把 E-R 图转换为关系模式;

以下画下划线表示主键,字体加粗的表示外键

1)院系(院系号,院系名)

2)专业(专业号,专业名,院系号

3)学生(学号,姓名,专业号

4)论文(卷期页号,期刊名称,发表时间,项目号

5)专利(专利号,专利名,申请号,申请时间,项目号

6)软著(软著登记号,软著名称,登记时间,项目号

7)项目(项目号,项目名,立项时间,结项时间,等级号

8)项目类型(等级号,等级名,经费)

9)指导老师(工号,姓名)

10)项目学生位次(学号,项目号,学生位次)

11)项目指导老师(工号,项目号

12)学生所得论文(学号,卷期页号,位次)

13)学生所得软著(学号,登记号,位次)

14)学生所得专利(学号,专利号,位次)

(3)根据关系规范理论进行数据库的逻辑设计,给出数据库表的设计,数据库表设计

表1 院系表(department)

字段名

中文含义

类型

约束

备注

did

院系号

char(10)

主键

dname

院系名

varchar(20)

Not null

comment

备注

varchar(20)

null

.

表2 专业表(major)

字段名

中文含义

类型

约束

备注

mid

专业号

int

主键

mname

专业名

varchar(20)

not null

did

院系号

char(10)

外键,参照department表的did

comment

备注

varchar(20)

null

表3 学生表(student)

字段名

中文含义

类型

约束

备注

sid

学号

int

主键

sname

姓名

varchar(20)

not null

mid

专业号

int

外键,参照major表里的mid

comment

备注

varchar(20)

null

表4 论文表(paper)

字段名

中文含义

类型

约束

备注

pid

卷期页号

char(10)

主键

pname

期刊名称

varchar(20)

null

pdate

发表时间

date

null

prid

项目号

char(10)

外键,来自project表的prid

comment

备注

varchar(20)

null

表5 专利表(patent)

字段名

中文含义

类型

约束

备注

ptid

专利号

char(10)

主键

ptname

专利名

varchar(20)

null

ptdate1

申请时间

date

null

ptno

申请号

char(10)

Not null

prid

项目号

char(10)

外键,来自project表的prid

comment

备注

varchar(20)

null

表6 软著表(swcopyright)

字段名

中文含义

类型

约束

备注

swid

登记号

char(10)

主键

swname

登记名称

varchar(20)

null

swdate

登记时间

date

null

prid

项目号

char(10)

外键,来自project表的prid

comment

备注

varchar(20)

null

表7 项目表(project)

字段名

中文含义

类型

约束

备注

prid

项目号

char(10)

主键

prname

项目名

varchar(20)

null

date1

立项时间

date

null

date2

结项时间

date

date2>date1

tid

等级号

char(10)

外键,来自type表里的tid

comment

备注

varchar(20)

null

表8 项目类型表(type)

字段名

中文含义

类型

约束

备注

tid

等级号

char(10)

主键

tname

等级名

varchar(20)

null

money

经费

budget

not null

comment

备注

varchar(20)

null

表9 教师表(teacher)

字段名

中文含义

类型

约束

备注

teaid

工号

int

主键

name

姓名

varchar(20)

Not null

comment

备注

varchar(20)

null

表10 项目学生位次表(prorank)

字段名

中文含义

类型

约束

备注

prid

项目号

char(10)

外键,来自project表的prid

prid和

sid

联合作为

主键

sid

学号

int

外键,来自project表的sid

rankpr

项目位次

int

not null

comment

备注

varchar(20)

null

表11 项目指导老师(project_teacher)

字段名

中文含义

类型

约束

备注

prid

项目号

char(10)

外键,来自project表的prid

prid和

teaid

联合作为

主键

teaid

工号

int

外键,来自teacher表的teaid

comment

备注

varchar(20)

null

表12 学生所得论文表(stupaper)

字段名

中文含义

类型

约束

备注

sid

学号

int

外键,来自project表的sid

sid和

pid

联合作为

主键

pid

卷期页号

char(10)

外键,来自paper表的pid

rankpa

位次

int

not null

prid

项目号

char(10)

外键,来自project表的prid

comment

备注

varchar(20)

null

表13 学生所得软著表(stusoft)

字段名

中文含义

类型

约束

备注

sid

学号

int

外键,来自project表的sid

sid和

swid

联合作为

主键

swid

登记号

char(10)

外键,来自swcopyright表的swid

ranksw

位次

int

not null

prid

项目号

char(10)

外键,来自project表的prid

comment

备注

varchar(20)

null

表14 学生所得专利表(stupatent)

字段名

中文含义

类型

约束

备注

sid

学号

int

外键,来自project表的sid

sid和

ptid

联合作为

主键

ptid

专利号

char(10)

外键,来自patent表的ptid

rankpt

位次

int

not null

prid

项目号

char(10)

外键,来自project表的prid

comment

备注

varchar(20)

null

(4)对给定的逻辑数据模型选取一个最适合应用环境的物理结构,进行数据库的物理

设计,考虑不同的 DBMS 选型,进行设计方案对比,对物理结构进行评价,评价的重点是

时间和空间效率;

DBMS选型:MySQL。

物理结构设计方案:

    1)使用InnoDB存储引擎,因为它支持事务和行级锁定,适合具有高并发读写需求的应用环境。

    2)为每个表选择合适的索引,以提高查询性能。例如,在学生表上创建一个基于mid字段的B+树索引,以加快按专业查询学生的速度。

    3)考虑使用分区表来提高查询性能和维护效率。根据实际需求,可以根据日期范围或其他条件对论文、专利等表进行分区。

物理结构评价:

    1)时间效率:MySQL在处理大量数据时表现良好,并且支持并发操作。通过适当的索引和分区设计,可以进一步提高查询和写入性能。

    2)空间效率:MySQL的存储引擎具有紧凑的数据存储格式,并且可以通过压缩等技术来减少磁盘空间占用。

(5)在 My SQL 数据库中创建数据库projectcontrol并使用 SQL 语句创建相应的数据库表;

由于存在外键约束,建表顺序依次如下:表1 院系表(department)、表2 专业表(major)、表3 学生表(student)、表8 项目类型表(type)、表7 项目表(project)、表4 论文表(paper)、表5 专利表(patent)、表6 软著表(swcopyright)、表9 教师表(teacher)、表10 项目学生位次表(prorank)、表11 项目指导老师、表12 学生所得论文表(stupaper)、表13 学生所得软著表(stusoft)、表14 学生所得专利表(stupatent)。

以下为建表的SQL语句。

-- 表1 院系表(department)

CREATE TABLE department (

  did CHAR(10) PRIMARY KEY,

  dname VARCHAR(20) NOT NULL,

  comment VARCHAR(20)

);

-- 表2 专业表(major)

CREATE TABLE major (

  mid INT PRIMARY KEY,

  mname VARCHAR(20) NOT NULL,

  did CHAR(10),

  comment VARCHAR(20),

  FOREIGN KEY (did) REFERENCES department(did)

);

-- 表3 学生表(student)

CREATE TABLE student (

  sid INT PRIMARY KEY,

  sname VARCHAR(20) NOT NULL,

  mid INT,

  comment VARCHAR(20),

  FOREIGN KEY (mid) REFERENCES major(mid)

);

-- 表8 项目类型表(type)

CREATE TABLE type (

  tid CHAR(10) PRIMARY KEY,

  tname VARCHAR(20),

  money FLOAT NOT NULL,

  comment VARCHAR(20)

);

-- 表7 项目表(project)

CREATE TABLE project (

  prid CHAR(10) PRIMARY KEY,

  prname VARCHAR(20),

  date1 DATE,

  date2 DATE,

  tid CHAR(10),

  comment VARCHAR(20),

    CHECK (date2 > date1),

  FOREIGN KEY (tid) REFERENCES type(tid)

);

-- 表4 论文表(paper)

CREATE TABLE paper (

  pid CHAR(10) PRIMARY KEY,

  pname VARCHAR(20),

  pdate DATE,

  prid CHAR(10),

  comment VARCHAR(20),

  FOREIGN KEY (prid) REFERENCES project(prid)

);

-- 表5 专利表(patent)

CREATE TABLE patent (

  ptid CHAR(10) PRIMARY KEY,

  ptname VARCHAR(20),

  ptdate1 DATE,

  ptno CHAR(10) NOT NULL,

  prid CHAR(10),

  comment VARCHAR(20),

  FOREIGN KEY (prid) REFERENCES project(prid)

);

-- 表6 软著表(swcopyright)

CREATE TABLE swcopyright (

  swid CHAR(10) PRIMARY KEY,

  swname VARCHAR(20),

  swdate DATE,

  prid CHAR(10),

  comment VARCHAR(20),

  FOREIGN KEY (prid) REFERENCES project(prid)

);

-- 表9 教师表(teacher)

CREATE TABLE teacher (

  teaid INT PRIMARY KEY,

  name VARCHAR(20) NOT NULL,

  comment VARCHAR(20)

);

-- 表10 项目学生位次表(prorank)

CREATE TABLE prorank (

  prid CHAR(10),

  sid INT,

  rankpr INT NOT NULL,

  comment VARCHAR(20),

  PRIMARY KEY (prid, sid),

  FOREIGN KEY (prid) REFERENCES project(prid),

  FOREIGN KEY (sid) REFERENCES student(sid)

);

-- 表11 项目指导老师

CREATE TABLE project_teacher (

  prid CHAR(10),

  teaid INT,

  comment VARCHAR(20),

  PRIMARY KEY (prid, teaid),

  FOREIGN KEY (prid) REFERENCES project(prid),

  FOREIGN KEY (teaid) REFERENCES teacher(teaid)

);

-- 表12 学生所得论文表(stupaper)

CREATE TABLE stupaper (

  sid INT,

  pid CHAR(10),

  rankpa INT NOT NULL,

  prid CHAR(10),

  comment VARCHAR(20),

  PRIMARY KEY (sid, pid),

  FOREIGN KEY (sid) REFERENCES student(sid),

  FOREIGN KEY (pid) REFERENCES paper(pid),

  FOREIGN KEY (prid) REFERENCES project(prid)

);

-- 表13 学生所得软著表(stusoft)

CREATE TABLE stusoft (

  sid INT,

  swid CHAR(10),

  ranksw INT NOT NULL,

  prid CHAR(10),

  comment VARCHAR(20),

  PRIMARY KEY (sid, swid),

  FOREIGN KEY (sid) REFERENCES student(sid),

  FOREIGN KEY (swid) REFERENCES swcopyright(swid),

  FOREIGN KEY (prid) REFERENCES project(prid)

);

-- 表14 学生所得专利表(stupatent)

CREATE TABLE stupatent (

  sid INT,

  ptid CHAR(10),

  rankpt INT NOT NULL,

  prid CHAR(10),

  comment VARCHAR(20),

  PRIMARY KEY (sid, ptid),

  FOREIGN KEY (sid) REFERENCES student(sid),

  FOREIGN KEY (ptid) REFERENCES patent(ptid),

  FOREIGN KEY (prid) REFERENCES project(prid)

);

(6)通过导入文件的方式在数据库表中输入若干条测试数据,也可以直接插入若干条

测试数据;

    这里选择通过excel文件导入数据库表数据。

首先创建数据文件:

图2 本地构建excel数据表格

    按照建表顺序,导入各个excel:

图3 导入数据及成功结果

(7)自行设计若干问题并编写 SQL 语句完成对所提问题的实现,SQL 语句要求至少

12 条,自定义功能要求,并对 SQL 语句运行,要求包括下面的语句:

create table(要求包含实体完整性、参照完整性和用户自定义完整性的定义)、create

index、 create view、 select 语句 (至少 5 条,要求把 from、where、group by、having、order by 等子句用上,并实现多表查询)、insert、 delete、update、grant、revoke 语句。对于 select 语句,需要给出相应的数据查询结果的截图。

(8)对自定义的复杂的查询要求或复杂报表生成要求,以及复杂的自定义完整性要求,

使用存储过程和触发器来实现,并进行实验验证,给出验证结果截图。

下面为自拟题目及SQL语句和结果展示:

1)参照project的表结构,创建项目表(project1)时定义实体完整性、参照完整性、用户自定义完整性。

CREATE TABLE project1 (
  prid CHAR(10),
  prname VARCHAR(20) NOT NULL, 
  date1 DATE NOT NULL,
  date2 DATE NOT NULL,
  tid CHAR(10) NOT NULL,
  comment VARCHAR(20),
  CONSTRAINT pk_project PRIMARY KEY (prid),#实体完整性
  CONSTRAINT fk_project_tid FOREIGN KEY (tid) REFERENCES type(tid), #参照完整性
  CONSTRAINT check_dates CHECK (date2 > date1)#用户自定义完整性
);

2)对项目表(project)创建一个索引(按项目号降序),索引的名字是index_prid

学生表(student)创建一个索引(按学号降序),索引的名字是index_sid

CREATE INDEX index_prid ON project(prid DESC);  
CREATE INDEX index_sid ON student(sid DESC);  

图4 建立索引成功

3)设大创项目参与学生位次为1(即表prorank里的rankpr为‘1’)的是该项目的负责人,负责人的专业所在学院即该项目所属学院,查询属于“人工智能与数据科学学院”的全部大创项目。

SELECT * FROM project p1
WHERE p1.prid IN(
    SELECT p2.prid 
    FROM project p2,prorank,student,major,department
    WHERE p2.prid = prorank.prid
        AND prorank.sid = student.sid
        AND student.mid = major.mid
        AND major.did = department.did
        AND prorank.rankpr = 1
        AND department.dname = '人工智能与数据科学学院');

图5 查询到的智能学院项目结果

4)统计各个年级2021-2023年内创新创业的参加人数,按学号(sid)前两位表示年级。

SELECT LEFT(student.sid, 2) AS grade, COUNT(DISTINCT student.sid) AS '大创参与人数'
FROM student
WHERE EXISTS (
  SELECT 1 
  FROM prorank, project
  WHERE prorank.prid = project.prid
  AND YEAR(project.date1) BETWEEN 2021 AND 2023 #date1为立项时间
  AND prorank.sid = student.sid
)
GROUP BY grade;

图6 各个年级参与大创人数

5)查询2020-2023年内创新创业项目的参加学生人数大于4的学院,并按照参加人数降序排序。

SELECT d.dname AS '学院名称', COUNT(DISTINCT st.sid) AS '参加人数'
FROM department d, major m, student st, project p,prorank pr
WHERE d.did = m.did
  AND m.mid = st.mid
  AND st.sid = pr.sid
    AND pr.prid = p.prid
  AND p.date1 BETWEEN'2020-01-01' AND '2023-12-31'
GROUP BY d.did, d.dname
HAVING COUNT(DISTINCT st.sid) > 4
ORDER BY COUNT(DISTINCT st.sid) DESC;

图7  2020-2023年内创新创业项目的参加学生人数大于4的学院

 6)查询“物联网工程”专业每个学生的论文、软著、专利的分别获得个数。

SELECT s.sid, s.sname, 
    (
        SELECT COUNT(sp.pid) 
        FROM stupaper sp 
        WHERE sp.sid = s.sid
    ) AS paper_count,
    (
        SELECT COUNT(sw.swid) 
        FROM stusoft sw 
        WHERE sw.sid = s.sid
    ) AS software_count,
    (
        SELECT COUNT(pt.ptid) 
        FROM stupatent pt 
        WHERE pt.sid = s.sid
    ) AS patent_count
FROM student s
WHERE s.mid IN (SELECT mid FROM major WHERE mname = '物联网工程');

图8 “物联网工程”专业每个学生的成果明细

 7)查询2021-2022年每个学院所有项目的经费总金额,按经费降序排序。(各个项目类型的经费在type表里的money给出,项目归属由项目位次第一的学生所在学院决定)

SELECT department.dname AS 学院名称, SUM(type.money) AS 经费总金额
FROM project, prorank, student, major, department, type
WHERE project.prid = prorank.prid 
    #项目排名第一人即项目负责人,其所在院系即项目所属院系
    AND prorank.rankpr = '1' 
  AND prorank.sid = student.sid 
    AND student.mid = major.mid
  AND major.did = department.did 
    AND project.tid = type.tid
  AND project.date1 BETWEEN'2021-01-01' AND '2022-12-31'
GROUP BY department.did
ORDER BY SUM(type.money) DESC;

图9 2021-2022年每个学院所有项目的经费总金额

8)查询所有项目的论文、软著、专利产出个数,并给出总数,按项目号降序排序。

SELECT 
    project.prid AS 项目号,
    project.prname AS 项目名称,
    (SELECT COUNT(DISTINCT pid) 
        FROM paper 
        WHERE paper.prid = project.prid) AS 论文产出个数,
    (SELECT COUNT(DISTINCT swid) 
        FROM swcopyright 
        WHERE swcopyright.prid = project.prid) AS 软著产出个数,
    (SELECT COUNT(DISTINCT ptid) 
        FROM patent 
        WHERE patent.prid = project.prid) AS 专利产出个数,
    (SELECT COUNT(DISTINCT pid) FROM paper 
        WHERE paper.prid = project.prid) 
     + (SELECT COUNT(DISTINCT swid) FROM swcopyright 
            WHERE swcopyright.prid = project.prid)
      + (SELECT COUNT(DISTINCT ptid) FROM patent 
        WHERE patent.prid = project.prid) AS 产出总数
FROM project
#由于prid为字符型,使用CAST函数转为整型排序
ORDER BY CAST(project.prid AS UNSIGNED);

图10 所有项目的论文、软著、专利产出个数及总数

 9)创建一个视图viewdepartment1,要求显示各个项目项目号、项目名称、所在学院、立项时间、论文产出个数、软著产出个数、专利产出个数、产出总数、指导老师姓名。

CREATE VIEW viewdepartment1 AS
SELECT 
    project.prid AS 项目号,
    project.prname AS 项目名称,
        (
            SELECT department.dname
        FROM prorank,student,major,department
        WHERE project.prid = prorank.prid
            AND prorank.sid = student.sid
            AND student.mid = major.mid
            AND major.did = department.did
            AND prorank.rankpr = 1    #按项目第一名学生所在学院决定项目归属
        ) AS 所属学院,
        project.date1 AS 立项时间,
    (SELECT COUNT(DISTINCT pid) 
        FROM paper 
        WHERE paper.prid = project.prid) AS 论文产出个数,
    (SELECT COUNT(DISTINCT swid) 
        FROM swcopyright 
        WHERE swcopyright.prid = project.prid) AS 软著产出个数,
    (SELECT COUNT(DISTINCT ptid) 
        FROM patent 
        WHERE patent.prid = project.prid) AS 专利产出个数,
    (SELECT COUNT(DISTINCT pid) FROM paper 
        WHERE paper.prid = project.prid) 
     + (SELECT COUNT(DISTINCT swid) FROM swcopyright 
            WHERE swcopyright.prid = project.prid)
      + (SELECT COUNT(DISTINCT ptid) FROM patent 
        WHERE patent.prid = project.prid) AS 产出总数,
        (SELECT GROUP_CONCAT(teacher.`name` SEPARATOR ',')
        FROM teacher,project_teacher 
        WHERE teacher.teaid = project_teacher.teaid
            AND project.prid = project_teacher.prid
        ) AS 指导老师
FROM project     
#由于prid为字符型,使用CAST函数转为整型排序
ORDER BY CAST(project.prid AS UNSIGNED);

本题解释:由于“指导老师”项在一个项目中可能存在多个匹配项,直接SELECT teacher.`name` 后提示创建视图失败。通过查阅资料,选择使用GROUP_CONCAT()函数成功解决该问题,将多个老师姓名字段拼接为一个,以逗号分隔。

视图结果如下所示:

图11 视图viewdepartment1结果

10) 创建一个视图viewstudent1,要求显示2023年内“人工智能与数据科学学院”各个学生学号、学生姓名、所在专业、发表论文篇数、登记软著个数、拥有专利个数、获得总数。其中时间按各个论文、软著、专利的发表/登记/申请时间为准。

CREATE VIEW viewstudent1 AS
SELECT student.sid AS 学号,student.sname AS 姓名,major.mname AS 所在专业,
(
SELECT COUNT(stupaper.pid) FROM stupaper,paper
WHERE stupaper.sid = student.sid
 AND stupaper.pid = paper.pid
 AND paper.pdate BETWEEN '2023-01-01' AND '2023-12-31'
) AS 发表论文篇数,
(
SELECT COUNT(stusoft.swid) FROM stusoft,swcopyright
WHERE stusoft.sid = student.sid
    AND stusoft.swid = swcopyright.swid
    AND swcopyright.swdate BETWEEN '2023-01-01' AND '2023-12-31'
) AS 登记软著个数,
(
SELECT COUNT(stupatent.ptid) FROM stupatent,patent
WHERE stupatent.sid = student.sid
    AND stupatent.ptid = patent.ptid
    AND patent.ptdate1 BETWEEN '2023-01-01' AND '2023-12-31'
) AS 拥有专利个数,
(
SELECT COUNT(stupaper.pid) FROM stupaper,paper
WHERE stupaper.sid = student.sid
 AND stupaper.pid = paper.pid
 AND paper.pdate BETWEEN '2023-01-01' AND '2023-12-31'
 ) +(SELECT COUNT(stusoft.swid) FROM stusoft,swcopyright
    WHERE stusoft.sid = student.sid
    AND stusoft.swid = swcopyright.swid
    AND swcopyright.swdate BETWEEN '2023-01-01' AND '2023-12-31'
 )+(SELECT COUNT(stupatent.ptid) FROM stupatent,patent
    WHERE stupatent.sid = student.sid
     AND stupatent.ptid = patent.ptid
     AND patent.ptdate1 BETWEEN '2023-01-01' AND '2023-12-31') AS 获得总数
FROM student,major,department
WHERE student.mid = major.mid
    AND major.did = department.did
    AND department.dname = '人工智能与数据科学学院'
ORDER BY (student.sid) DESC;

图12 视图viewstudent1结果

 11)   在学生表(student)中插入一条记录,学号21XXXX,姓名XXX,专业为物联网工程。对插入的记录进行查看。

INSERT INTO student(sid,sname,mid) #插入记录
VALUES (21XXXX,'XXX',
(SELECT major.mid FROM major WHERE major.mname = '物联网工程'));
#查看结果
SELECT*FROM student WHERE student.sname ='XXX';

12)更新11题所插入的记录,将“XXX”记录的comment更新为“本实验作者”。对更新的这条记录进行查看。 

#更新操作
UPDATE student
SET comment = '本实验作者'
WHERE student.sname = 'XXX';
#查看结果
SELECT*FROM student WHERE student.sname ='XXX';

13)删除学生表中“XXX”的记录。 

#删除操作
DELETE FROM student
WHERE student.sname = 'XXX';
#查看结果
SELECT*FROM student WHERE student.sname ='XXX';

执行查询语句后发现该条记录已不存在,删除成功。

图15 删除后,查询不到该记录

14)创建“admin”用户,为其创建一个管理员角色,授予其查看所有表及修改项目

表(project)、学生表(student)老师表(teacher)的权限。

CREATE USER 'admin'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
CREATE role role_admin;
GRANT SELECT ON TABLE department TO role_admin;
GRANT SELECT ON TABLE major TO role_admin;
GRANT UPDATE,SELECT ON TABLE student TO role_admin;
GRANT SELECT ON TABLE type TO role_admin;
GRANT UPDATE,SELECT ON TABLE project TO role_admin;
GRANT SELECT ON TABLE paper TO role_admin;
GRANT SELECT ON TABLE patent TO role_admin;
GRANT SELECT ON TABLE swcopyright TO role_admin;
GRANT UPDATE,SELECT ON TABLE teacher TO role_admin;
GRANT SELECT ON TABLE prorank TO role_admin;
GRANT SELECT ON TABLE project_teacher TO role_admin;
GRANT SELECT ON TABLE stupaper TO role_admin;
GRANT SELECT ON TABLE stusoft TO role_admin;
GRANT SELECT ON TABLE stupatent TO role_admin;
GRANT role_admin TO 'admin'@'localhost';
#激活角色 
SET DEFAULT role ALL TO 'admin'@'localhost';

15)验证admin的权限是否分配成功。以admin用户名登录数据库,修改project表里“基于深度学习的图像识别与分类算法研究”项目的立项时间(date1)为2021-09-19,结项时间(date2)为2023-09-29;尝试修改type表,观察有何输出。

首先,以admin用户名登录数据库。

图16  admin登录数据库

然后,先查询修改前的“基于深度学习的图像识别与分类算法研究”项目的信息,然后进行UPDATE操作,最后查看修改后的结果。

#查看更新前结果
SELECT * FROM project 
WHERE project.prname = '基于深度学习的图像识别与分类算法研究';
#更新操作
UPDATE project
SET project.date1 = '2021-09-19',project.date2 = '2023-09-29'
WHERE project.prname = '基于深度学习的图像识别与分类算法研究';
#查看更新后的结果
SELECT * FROM project 
WHERE project.prname = '基于深度学习的图像识别与分类算法研究';

操作前后结果对比如下,成功实现更新。

图17 操作前数据

图18 更新后数据

尝试以admin用户修改项目类型type表,修改国家级项目经费为50000:

UPDATE type
SET type.money = 50000
WHERE type.tname = '国家级';

 由于没有给admin授予更新type表的权限,更新失败,满足第14题的权限分配。

图19 admin无更新type表权限

16)回收admin从角色获得的权限,删除角色,并对比回收前后admin的权限变化。

#查看回收前admin的权限
SHOW GRANTS FOR 'admin' @'localhost';
#回收admin从角色获得的权限
REVOKE role_admin FROM 'admin' @'localhost';
#删除角色
DROP role role_admin;
#查看回收后admin的权限
SHOW GRANTS FOR 'admin' @'localhost';

图20 回收权限前admin的权限

图21 回收权限后admin的权限

 17)定义一个存储过程 proc1,计算所有学生的综合加分,并记录在学生表中comment内。这里只给论文、专利、软著排名为第一(排名在stupaper、stupatent、stusoft表中存在)的学生加分,并且论文加2分,专利加1分,软著加0.5分,执行这个存储过程。

DELIMITER $$
DROP PROCEDURE IF EXISTS proc1;
CREATE PROCEDURE proc1()
BEGIN
    DECLARE sid_val INT;
    DECLARE done INT DEFAULT 0;
    DECLARE comment_str VARCHAR(20);
    DECLARE score FLOAT;
    -- 声明绑定结果的游标
    DECLARE student_cursor CURSOR FOR SELECT sid FROM student;
    -- 声明异常处理程序
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN student_cursor;
    read_loop: LOOP
        FETCH student_cursor INTO sid_val;
        IF done THEN
            LEAVE read_loop;
        END IF;
        SET score = 0;
        -- 判断论文是否排名第一
        SET @paper_count := (SELECT COUNT(*) FROM stupaper WHERE sid = sid_val AND rankpa = 1);
        IF @paper_count > 0 THEN
            SET score = score + 2;
        END IF;
        -- 判断专利是否排名第一
        SET @patent_count := (SELECT COUNT(*) FROM stupatent WHERE sid = sid_val AND rankpt = 1);
        IF @patent_count > 0 THEN
            SET score = score + 1;
        END IF;
        -- 判断软著是否排名第一
        SET @soft_count := (SELECT COUNT(*) FROM stusoft WHERE sid = sid_val AND ranksw = 1);
        IF @soft_count > 0 THEN
            SET score = score + 0.5;
        END IF;
        -- 将得分值转换为字符串类型,并更新学生表中的comment字段
        SET comment_str = CAST(score AS CHAR);
        UPDATE student SET comment = comment_str WHERE sid = sid_val;
    END LOOP;
    CLOSE student_cursor;
END$$
DELIMITER ;
CALL proc1();#执行存储过程

执行后student表结果如下图所示,comment成功更新为加分的分数。

图22 存储过程 proc1执行后student表结果

18)定义一个存储过程 proc2,计算2021-2023年所有学院的大创项目的结题成果数量(包括论文、专利、软著),将总数量大于15的学院的备注(comment)标注为“优秀大创组织单位”,执行这个存储过程。

DROP PROCEDURE IF EXISTS proc2;
DELIMITER //
CREATE PROCEDURE proc2()
BEGIN
    DECLARE did_temp CHAR(10);
    DECLARE count_temp INT;
    DECLARE done INT DEFAULT 0;
    DECLARE cur1 CURSOR FOR
        SELECT DISTINCT m.did
        FROM prorank pr, project p, student s, major m
        WHERE pr.rankpr = 1
            AND pr.sid = s.sid
            AND p.prid = pr.prid
            AND s.mid = m.mid
            AND p.date2 BETWEEN '2021-01-01' AND '2023-12-31';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cur1;
    read_loop: LOOP
        FETCH cur1 INTO did_temp;
        IF done THEN
            LEAVE read_loop;
        END IF;
        SELECT COUNT(*) INTO count_temp
        FROM paper pa, patent pt, swcopyright sw, project p, student s, prorank pr, major m, department d
        WHERE (pa.prid = p.prid OR pt.prid = p.prid OR sw.prid = p.prid)
            AND p.prid = pr.prid
            AND pr.sid = s.sid
            AND s.mid = m.mid
            AND m.did = d.did
            AND p.date2 BETWEEN '2021-01-01' AND '2023-12-31'
            AND d.did = did_temp;
        IF count_temp > 15 THEN
            UPDATE department
            SET comment = '优秀大创组织单位'
            WHERE did = did_temp;
        END IF;
    END LOOP;
    CLOSE cur1;
END//
DELIMITER ;
CALL proc2();

图23 存储过程proc2执行后department表结果

19)定义一个存储过程 proc3,计算2021-2023年所有大创项目的结题成果数量(包括论文、专利、软著),将产出总数量大于15的项目指导老师的备注(comment)标注为“优秀指导老师”,执行这个存储过程。

DROP PROCEDURE IF EXISTS proc3;
DELIMITER //
CREATE PROCEDURE proc3()
BEGIN
    DECLARE prid_val CHAR(10);
    DECLARE teaid_val INT;
    DECLARE proj_count INT;
    DECLARE comment_val VARCHAR(20);
    DECLARE done BOOLEAN DEFAULT FALSE;
    DECLARE cur CURSOR FOR
        SELECT prid, teaid 
        FROM project_teacher 
        WHERE prid IN (
            SELECT prid FROM project WHERE YEAR(date2) BETWEEN 2021 AND 2023
        );
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO prid_val, teaid_val;
        IF done THEN
            LEAVE read_loop;
        END IF;
        SET proj_count = (
            SELECT COUNT(*) 
            FROM (
                SELECT pid FROM paper WHERE prid = prid_val AND YEAR(pdate) BETWEEN 2021 AND 2023
                UNION ALL
                SELECT ptid FROM patent WHERE prid = prid_val AND YEAR(ptdate1) BETWEEN 2021 AND 2023
                UNION ALL
                SELECT swid FROM swcopyright WHERE prid = prid_val AND YEAR(swdate) BETWEEN 2021 AND 2023
            ) AS result_count
        );
        IF proj_count > 15 THEN
            SET comment_val = '优秀指导老师';
            UPDATE teacher SET comment = comment_val WHERE teaid = teaid_val;
        END IF;
    END LOOP;
    CLOSE cur;
END //
DELIMITER ;
-- 执行存储过程
CALL proc3();

图24 存储过程proc3执行后teacher表结果

20)创建一个学生分数表(score),包括学号,分数,备注。(只给论文、专利、软著排名为第一(排名在stupaper、stupatent、stusoft表中存在)的学生加分,并且论文加2分,专利加1分,软著加0.5分)。建完表后上定义三个AFTER INSERT触发器,当插入论文、专利、软著记录时,学生的分数自动修改,保持数据一致性。

首先,建立score表:

CREATE TABLE score (
    sid INT,
    score DECIMAL ( 5, 2 ),
    COMMENT VARCHAR ( 20 ),
    PRIMARY KEY ( sid ),
FOREIGN KEY ( sid ) REFERENCES student ( sid ) 
);

 然后,插入score表数据:

INSERT INTO score (sid, score)
SELECT 
    student.sid,
    (SELECT COALESCE(SUM(CASE WHEN rankpa = 1 THEN 2 ELSE 0 END), 0) FROM stupaper WHERE stupaper.sid = student.sid) +
    (SELECT COALESCE(SUM(CASE WHEN rankpt = 1 THEN 1 ELSE 0 END), 0) FROM stupatent WHERE stupatent.sid = student.sid) +
    (SELECT COALESCE(SUM(CASE WHEN ranksw = 1 THEN 0.5 ELSE 0 END), 0) FROM stusoft WHERE stusoft.sid = student.sid) AS score
FROM student;

其中,COALESCE 函数用于处理子查询中的求和结果。如果求和结果为 NULL,COALESCE 函数将其替换为 0,以确保计算分数时不会出现 NULL 值。

定义触发器:

检验触发器功能:

#查询200001学生的分数

SELECT * FROM score WHERE score.sid =200001;
#插入一条记录
INSERT INTO paper(pid) VALUES('PA371');
INSERT INTO stupaper(sid,pid,rankpa) VALUES(200001,'PA371',1);
#显示结果
SELECT * FROM score WHERE score.sid =200001;
#插入一条记录
INSERT INTO patent(ptid,ptno) VALUES('PT892',12121);
INSERT INTO stupatent(sid,ptid,rankpt) VALUES(200001,'PT892',3);
#显示结果
SELECT *  FROM score WHERE score.sid =200001;
#插入一条记录
INSERT INTO swcopyright(swid) VALUES('SW793');
INSERT INTO stusoft(sid,swid,ranksw) VALUES(200001,'SW793',2);
#显示结果
SELECT *  FROM score WHERE score.sid =200001;

由下图可知,触发器实现了相应的功能,即只有插入论文/专利/软著位次为1时,才会自动修改分数。

图25 insert触发器功能验证

21)根据第20题,设计三个before delete 触发器,实现删除相应记录时,学生的分数也自动扣除。

CREATE TRIGGER update_score_pa_before
BEFORE DELETE ON stupaper
FOR EACH ROW
BEGIN
    IF OLD.rankpa = 1 THEN
        UPDATE score
        SET score = score - 2
        WHERE sid = OLD.sid;
    END IF;
END;
CREATE TRIGGER update_score_pt_before
BEFORE DELETE ON stupatent
FOR EACH ROW
BEGIN
    IF OLD.rankpt = 1 THEN
        UPDATE score
        SET score = score - 1
        WHERE sid = OLD.sid;
    END IF;
END;
CREATE TRIGGER update_score_sw_before
BEFORE DELETE ON stusoft
FOR EACH ROW
BEGIN
    IF OLD.ranksw = 1 THEN
        UPDATE score
        SET score = score - 0.5
        WHERE sid = OLD.sid;
    END IF;
END;

验证触发器功能:

#查询200001学生的分数
SELECT * FROM score WHERE score.sid =210033;
#删除stupaper
DELETE FROM stupaper
    WHERE stupaper.sid = 210033 AND stupaper.rankpa = 1;
#查询200001学生的分数
SELECT * FROM score WHERE score.sid =210033;
#删除stupatent
DELETE FROM stupatent
    WHERE stupatent.sid = 210033 AND stupatent.rankpt =1;
#查询200001学生的分数
SELECT * FROM score WHERE score.sid =210033;
DELETE FROM stusoft
    WHERE stusoft.sid = 210033 AND stusoft.ranksw =1;
#查询200001学生的分数
SELECT * FROM score WHERE score.sid =210033;

图26 delete触发器验证

由上图可知,将‘210033’的所有排名第一的成果都删除后,其分数自动归零,验证了触发器的功能。

4.实验心得

   通过本次实验,我对数据库设计的流程和办法有了清晰的认识,并且在自己建表、写数据的过程中体会到了完整性约束的意义;在绘制E-R图时,我考虑方便查询,保留了数据冗余,在编程解决问题时验证了我这一想法的正确性,使得查询项目的产出成果更加方便;我更加熟悉了MySQL语句的编写,并且在自己解决问题时,查阅资料发现了GROUP_CONCATCOALESCE()等平时讲课没有用过的函数的便利性;我对复杂问题使用了存储过程和触发器,并且在存储过程中使用了游标,进一步加强了我对存储过程和触发器的认识。

        另外,设计表格时缺少考虑学生的加分这一属性,所以我在后期处理时,用存储过程直接将加分放到学生表里comment中;在实现触发器时,新建了一个grade表,圆满完成了实验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2385463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电磁场与电场、磁场的关系

电磁场与电场、磁场之间存在着深刻的内在联系和统一性关系。这三者共同构成了电磁相互作用的基本框架,是理解电磁现象的关键所在。 电场和磁场实际上是电磁场的两个不同表现形式,它们既相互区别又密切联系。电场主要由静止电荷产生,表现为对…

Python爬虫实战:研究Newspaper框架相关技术

1. 引言 1.1 研究背景与意义 互联网的快速发展使得新闻信息呈现爆炸式增长,如何高效地获取和分析这些新闻数据成为研究热点。新闻爬虫作为一种自动获取网页内容的技术工具,能够帮助用户从海量的互联网信息中提取有价值的新闻内容。本文基于 Python 的 …

Kotlin MultiPlatform 跨平台版本的记账 App

前言 一刻记账 KMP (Kotlin MultiPlatform) 跨平台版本今天终于把 Android 和 iOS 进度拉齐了. 之前只有纯 Android 的版本. 最近大半年有空就在迁移代码到 KMP 上 中间学了 iOS 基础知识. xcode 的使用. 跨平台的架构的搭建… 感觉经历了很多很多. 一把辛酸泪 迁移的心路历…

PIO 中的赋值魔术,MOV 指令

前言 在普通编程语言中,mov 可以理解为“赋值指令”,将一个值从一个地方拷贝到另一个地方。在 RP2040 的 PIO 汇编语言中,mov 同样是数据传递的关键指令,但它操作的是 PIO 独有的几个寄存器。 在 PIO 中,你可以用 mov …

第十七次CCF-CSP算法(含C++源码)

第十七次CCF-CSP认证 小明种苹果AC代码 小明种苹果&#xff08;续&#xff09;AC代码 后面好难哈哈 小手冰凉 小明种苹果 输入输出&#xff1a; 题目链接 AC代码 #include<iostream> using namespace std; int n,m; int res,res3; int sum; int res21; int main(){cin …

打造一个支持MySQL查询的MCP同步插件:Java实现

打造一个支持MySQL查询的MCP同步插件&#xff1a;Java实现 用Java实现一个MCP本地插件&#xff0c;直接通过JDBC操作本地MySQL&#xff0c;并通过STDIO与上层MCP客户端&#xff08;例如Cursor&#xff09;通信。插件注册一个名为mysql 的同步工具&#xff0c;接收连接参数及SQL…

黑马k8s(十五)

1.Ingress介绍 2.Ingress使用 环境准备 Http代理 Https代理

解决 cursor 中不能进入 conda 虚拟环境

【问题】 遇到一个小问题&#xff0c;我创建的conda 环境在 cmd、powershell中都可以激活&#xff0c;但在pycharm、cursor中却不能激活&#xff1f; 看图 cmd中正常&#xff1a; cursor中不正常&#xff1a; 【解决方法】 cursor 中&#xff0c;打开终端&#xff0c;输入&a…

C++ 实现二叉树的后序遍历与中序遍历构建及层次遍历输出

C 实现二叉树的后序遍历与中序遍历构建及层次遍历输出 目录 C 实现二叉树的后序遍历与中序遍历构建及层次遍历输出一、实验背景与目标二、实验环境三、实验内容四、数据结构与算法数据结构算法描述1. **构建二叉树函数 buildTree**2. **层次遍历函数 LevelOrder** 关键代码与解…

虚拟环境中的PyQt5 Pycharm设置参考

假如虚拟环境名是p3939 里面安装了pyqt5相关的库 1.QtDesigner Qt Designer 是通过拖拽的方式放置控件&#xff0c;并实时查看控件效果进行快速UI设计 位置 内容 name 可以随便命名&#xff0c;只要便于记忆就可以&#xff0c;本次采取通用…

AUTOSAR图解==>AUTOSAR_SRS_LIN

AUTOSAR LIN模块分析 目录 LIN模块概述LIN模块架构LIN通信状态流程LIN通信序列LIN配置结构总结1. LIN模块概述 本文档基于AUTOSAR规范SRS_LIN文档,对LIN(Local Interconnect Network)相关模块进行详细分析。主要包括以下几个模块: LIN接口 (LinIf)LIN驱动 (Lin)LIN传输层…

华为昇腾使用ollama本地部署DeepSeek大模型

文章目录 前言一、本次使用的硬件资源二、Ollama介绍三、Ollama在arm64位的芯片的安装及使用方法总结 前言 本次打算在华为昇腾上面使用ollama进行部署DeepSeek大模型。 一、本次使用的硬件资源 存储资源 内存资源 cpu资源 二、Ollama介绍 Ollama 是一个开源的大型语言…

多态的总结

什么是多态&#xff1f; 答&#xff1a;多态是多种形态&#xff0c;是为了完成某种行为时&#xff0c;不同对象会产生不同的形态&#xff08;结合车票例子解释&#xff09; 2. 什么是重载、重写(覆盖)、重定义(隐藏)&#xff1f; 答&#xff1a;重载的条件是&#xff1a;在同一…

Windows 高分辨率屏幕适配指南:解决界面过小、模糊错位问题

&#x1f5a5;️ Windows 高分辨率屏幕适配指南&#xff1a;解决界面过小、模糊错位问题 摘要&#xff1a; 在使用高分辨率屏幕时&#xff0c;许多老旧的桌面软件会出现界面显示异常的问题&#xff0c;例如窗口过小、控件错位、文字模糊等。本文提供一套通用解决方案&#xff0…

K8S-statefulset-mysql-ha

需求 实现一个HA mysql&#xff0c;包括1个master&#xff0c;2个slave。在K8S上已statefulset部署。 mysql HA原理 略 K8S环境需要解决的问题 1、由于使用同一个statefulset配置&#xff0c;因此需要考虑master和slave使用不同的cnf文件。 2、不同pod之间文件的传输 3、…

【方案分享】展厅智能讲解:基于BLE蓝牙Beacon的自动讲解触发技术实现

【方案分享】展厅智能讲解&#xff1a;基于BLE蓝牙Beacon的自动讲解触发技术实现 让观众靠近展品即可自动弹出讲解页面&#xff0c;是智能展厅的核心功能之一。本文将从软硬件技术、BLE Beacon原理、微信小程序实现、优劣对比与拓展方案五个维度&#xff0c;系统讲解“靠近展台…

web常见的攻击方式有哪些?如何防御?

Web常见攻击方式及防御策略 SQL注入 (SQL Injection) 详细解析: SQL 注入是一种利用应用程序未正确验证用户输入的漏洞&#xff0c;通过向应用传递恶意 SQL 查询来操纵数据库的行为。这种攻击可能导致敏感数据泄露、篡改或删除。 步骤: 攻击者找到可接受动态参数的应用程序…

力扣:《螺旋矩阵》系列题目

今天做了一下螺旋矩阵主题的一系列题目 即力扣中的相似题目 还是有所感悟的 接下来一一回顾&#xff1a; 第一题&#xff1a; 59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09; 这题让我们生成一个正方形的矩阵&#xff0c;注意是正方形&#xff0c;不是长方形&a…

发电厂进阶,modbus TCP转ethernet ip网关如何赋能能源行业

案例分享&#xff1a;稳联技术modbus TCP转ethernet ip网关wl-abc004赋能&#xff0c;发电厂自动化改造&#xff0c;推动能源行业智能化升级 随着全球能源结构转型和“双碳”目标的推进&#xff0c;传统发电厂&#xff08;如火电、水电、生物质发电&#xff09;正面临严峻挑战&…

深入了解linux系统—— 操作系统的路径缓冲与链接机制

前言 在之前学习当中&#xff0c;我们了解了被打开的文件是如何管理的&#xff1b;磁盘&#xff0c;以及ext2文件系统是如何存储文件的。 那我们要打开一个文件&#xff0c;首先要先找到这个文件&#xff0c;操作系统又是如何去查找的呢&#xff1f; 理解操作系统搜索文件 …