精华内容
下载资源
问答
  • 该代码文件用于本科生计算机科学与技术专业数据库课程设计图书借阅管理系统数据库用户名sa,密码gsw,数据库名名称BookManageSystem,这些都可以在DButil.java文件中修改。功能有学生账号注册登录借书还书,...
  • 2.2 主要功能说明: 一.欢迎界面:改界面主要是作为本系统的封面,程序运行后该界面会出 ... ... (4)恢复vfp系统界面:该界面主要是用来退出当前运行的图书管理系统,恢复到vfp系统继续进行操作。
  • char(18) check(len(trim(身份证编号))=18), 图书借阅次数 int, 是否挂失 int, 已借册数 int, 未交罚款金额 numeric(8,2), foreign key(读者类型编号) references 读者类型 (读者类型编号) ) ---创建读者类型表 ...
  • 数据库系统原理课程设计报告 图书借阅管理系统

    千次阅读 多人点赞 2019-06-19 17:23:00
    数据库系统原理课程设计报告 图书借阅管理系统 第1章 设计背景与需求分析 1.1 设计背景 1.1.1 图书管理的现状 图书馆作为一种资源的集散地,图书和用户在借阅资料繁多,包含很多的信息管理,现在有很多的图书...

     数据库系统原理课程设计报告 图书借阅管理系统

     

    第1章 设计背景与需求分析

    1.1 设计背景

    1.1.1  图书管理的现状  

    图书馆作为一种资源的集散地,图书和用户在借阅资料繁多,包含很多的信息管理,现在有很多的图书馆都是初步的开始使用,甚至尚未使用计算机进行资源管理,没有建立相对应的图书管理数据系统,而是使用人工计算,抄写进行,数据处理工作量大,容易出错和数据丢失。      

    1.2.2  选题的目的、意义   

    图书管理系统数据库有着手工管理无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好,成本低等等。这些优点能极大提高图书管理的效率,因此,开发一套能够为用户提供充足的信息和快捷的查询手段的图书管理系统是十分必要的。

    1.2 功能需求

    1.2.1读者信息的增加、修改、删除等基本操作

    1.读者类别信息的输入,包括图书类型、图书册数等

    2.读者档案信息的输入,包括读者编号、读者类型等

    1.2.2图书信息的增加、修改、删除等基本操作。

    1.图书类别信息的输入,包括类别编号,类别名称等。

    2.图书类别信息的查询,修改,包括类别编号,类别名称等。

    3.图书档案信息的输入,包括图书编号,图书名称,图书类别,作者名称,出版社名称,出版日期,图书页数,关键词,登记日期,备注信息等。

    1.2.3图书流通管理

              1.图书征订管理

              2.图书借阅管理

              3.图书归还管理

              4.图书罚款管理

    1.3 系统开发环境

    1、系统:Windows XP,7,8,10

    2、开发平台:SQL SERVER 2070, VISUAL BASIC6.0

     

    1.4 SQL SERVER 2017概述

    SQL SERVER2017是一个关系数据管理系统,是微软公司推出的新版本,该版本增加了许多先进的功能,具有方便使用,可伸缩性好与软件集成度高等的优点,可以运行在个人电脑到大型多处理器的服务器等多种平台使用。

    官网下载说明https://www.microsoft.com/zh-cn/sql-server/sql-server-2017-comparison

     

     

    第2章 数据库概念结构设计

    2.1 实体型结构

     

     

     

    2.2 实体间的联系

          1.一个出版社对应多个图书,一个图书对应一个出版社,出版社和图书是一对多联系。

          2.一个图书类型对应多个图书,一个图书对应一个图书类型,图书类型和图书是一对多联系。

          3.一个读者类型对应多个读者,一个读者对应一个读者类型,读者类型和读者是一对多联系。

          4.一个书库对应多个图书类型,一个图书类型对应一个书库,书库和图书类型是一对多联系。

          5.一个图书入库单对应多个图书入库单明细,一个图书入库单明细对应一个图书入库单,图书入库单和图书入库单明细是一对多联系。

          6.一个图书报损单对应多个图书报损单明细,一个图书报损单明细对于一个图书报损单,图书报损单和图书报损单明细是一对多联系。

          7.一个读书对应多个图书入库单明细,一个图书入库单明细对应一个图书,图书和图书入库单明细是一对多联系。

          8.一个读书对应多个图书报损单明细,一个图书报损单明细对应一个图书,图书和图书报损单明细是一对多联系。

          9.一个读者对应多个罚款交费单,一个罚款交罚单对应一个读者,读者和罚款交费单是一对多联系。

         10.一个职工对应多个图书入库单,一个图书入库单对应一个职工,职工和图书入库单是一对多联系。

         11.一个职工对应多个图书报损单,一个图书报损单对应一个职工,职工和图书报损单是一对多联系。

         12.一个职工对应多个罚款交费单,一个罚款交费单对应一个职工,职工和罚款交费单是一对多联系。

         13.一个读者对应多个图书,一个图书对应多个读者,读者和图书之间是多对多联系。

     

    2.3 整体简化E-R图

     

     

     

     

     

    第3章 数据库逻辑结构设计

    3.1 E-R图向关系模式转换的原则

    1. 一个实体型转换为一个关系模式。

    关系的属性:实体型的属性

    关系的码:实体型的码

    2.一个1:1联系可以转换为一个独立的关系模式,也可以与任何一端对应的关系模式合并。

    3.一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式 合并。

    4.一个m:n联系转换为一个关系模式。

    5.三个或三个以上实体间的一个多元联系可以转换为一个关系模式。

    6.具有相同码的关系模式可合并。

    目的:减少系统中关系个数

    7.同一实体集的实体之间的联系即自联系,也可以按1:1,1:n和m:n三种情况分别处理。

     

    3.2各个表的逻辑结构

     

    3.1  出版社表

    列  名

    数据类型

    长 度

    主  键

    非空

    备注

    出版社编号

    Int

     

    Yes

     

     

    出版社名称

    Varchar

    50

     

    Yes

     

    出版社地址

    Varchar

    50

     

    Yes

     

               

    3.2  图书表

    列  名

    数据类型

    长 度

    主  键

    非空

    备注

    图书编号

    varchar

    20

    Yes

     

     

    出版社编号

    Int

     

     

    Yes

    外码,参照出版表出版社编号

    图书类型编号

    char

    1

     

    Yes

    外码,参照图书类型表,图书类型编号

    书名

    varchar

    50

     

    Yes

     

    作者

    varchar

    20

     

    Yes

     

    价格

    Numeric(8,2)

     

     

    Yes

     

    页码

    Int

     

     

    Yes

     

    库存总量

    Int

     

     

    Yes

     

    现存量

    Int

     

     

    Yes

     

    入库时间

    Datetime

     

     

     

     

    借出次数

    Int

     

     

    Yes

     

              

     3.3  图书类型表

    列  名

    数据类型

    长 度

    主  键

    非空

    备注

    图书类型编号

    Char

    1

    Yes

    Yes

    图书类型名

    varchar

    50

     

    Yes

     

    书库号

    int

     

     

     

    外码,参照书库表的书库号

     

    3.4  读者表

    列  名

    数据类型

    长 度

    主  键

    非空

    备注

    证书编号

    int

     

    Yes

    Yes

     

    读者类型编号

    Char

    10

     

     

    外码,参照读者类型表的读者类型编号

    姓名

    varchar

    50

     

    Yes

     

    性别

    Char

    10

     

    Yes

    只能为“男”、或“女”

    出生日期

    Datetime

     

     

    Yes

     

    身份证编号

    char

    18

     

    Yes

    必须是18位  

    图书借阅次数

    int

     

     

     

     

    是否挂失

    int

     

     

     

    0未挂失

    1已挂失

    已借册数

    int

     

     

     

     

    未交罚款金额

    Numeric(8,2)

     

     

     

     

     

     

    3.5  读者类型表

    列  名

    数据类型

    长 度

    主  键

    非空

    备注

    读者类型编号

    Char

    10

    Yes

    Yes

     

    读者类型名

    vachar

    20

     

    Yes

     

    可借阅册数

    Int

     

     

    Yes

    有效范围是20---60

     

    借期天数

    int

     

     

    Yes

    有效范围是90---120

     

    可续借天数

    int

     

     

    Yes

    有效范围是10---60

     

               

     

    3.6  书库表

    列  名

    数据类型

    长 度

    主  键

    非空

    备注

    书库号

    int

     

    Yes

    Yes

     

    书库名

    varchat

    50

     

    Yes

     

     

     

    3.7 职工表

    列  名

    数据类型

    长 度

    主  键

    非空

    备注

    职工编号

    int

     

    Yes

    Yes

     

    职工姓名

    varchar

    50

     

    Yes

     

    性别

    Char

    10

     

    Yes

    只能为“男”、或“女”

    出生日期

    Datetime

     

     

    Yes

     

    文化程度

    varchar

    20

     

    Yes

     

     

     

    3.8 罚款交费单表

    列  名

    数据类型

    长 度

    主  键

    非空

    备注

    交费单号

    int

     

    Yes

    Yes

     

    借书证编号

    int

     

     

    Yes

    外码,参照读者表证书编号

    日期

    Datetime

     

     

    Yes

     

    金额

    Numeric(8,2)

     

     

    Yes

     

     

     

    3.9 图书入库单表

    列  名

    数据类型

    长 度

    主  键

    非空

    备注

    入库编号

    int

     

    Yes

    Yes

     

    入库日期

    Datetime

     

     

    Yes

     

    经手职工编号

    int

     

     

     

    外码,参照职工表的职工编号

    是否入库

    int

     

     

     

    0已入库

    1未入库

     

     

    3.10 图书入库单明细表

    列  名

    数据类型

    长 度

    主  键

    非空

    备注

    图书入库单编号

    int

     

    Yes

    报损单编号和图书编号一起作为主码

    Yes

    外码,参照图书入库单表的图书入库编号

    图书编号

    varchar

    20

    Yes

    外码,参照图书表的图书编号

    数量

    int

     

     

    Yes

     

     

     

    3.11 图书报损单表

    列  名

    数据类型

    长 度

    主  键

    非空

    备注

    报损单编号

    int

     

    Yes

    Yes

     

    报损日期

    Datetime

     

     

    Yes

     

    经手人编号

    int

     

     

     

    外码,参照职工表的职工编号

     

     

    3.12 图书报损单明细

    列  名

    数据类型

    长 度

    主  键

    非空

    备注

    图书报损单编号

    int

     

    Yes

    报损单编号和图书编号一起作为主码

    Yes

    外码,参照图书报损单表的报损单编号

    图书编号

    varchar

    20

    Yes

    外码,参照图书表的图书编号

    数量

    int

     

     

    Yes

     

    报损原因

    Varchar

    100

     

    Yes

     

     

     

    3.13借阅表

    列  名

    数据类型

    长 度

    主  键

    非空

    备注

    借书证编号

    int

     

    Yes

    借书证编号和图书编号一起作为主码

    Yes

    外码,参照读者表的证书编号

    图书编号

    varchar

    20

    Yes

    外码,参照图书表的图书编号

    借书日期

    Datetime

     

     

    Yes

     

    还书日期

    Datetime

     

     

     

    还书日期>=借书日期

     

    罚款金额

    Numeric(8,2)

     

     

     

     

    是否续借

    int

     

     

     

    0未续借

    1已续借

     

    3.3 视图结构

     

    3.3.1  入库单视图

    列  名

    来源表

    入库单编号

    图书入库单表

    入库日期

    图书入库单表

    经手人姓名

    职工表

    是否已入库

    图书入库单表

    图书编号

    图书入库单明细表

    书名

    图书表

    出版社名

    出版社表

    入库数量

    图书入库单明细表

             

    3.3.2  报损单视图

    列  名

    来源表

    报损单编号

    图书报损单表

    报损日期

    图书报损单表

    经手人姓名

    职工表

    图书编号

    图书报损单明细表

    书名

    图书表

    出版社名

    出版社表

    报损数量

    图书报损单明细表

    报损原因

    图书报损单明细表

             

    3.3.3  读者未还借书视图

    列  名

    来源表

    借书证编号

    借阅表

    读者姓名

    读者表

    未还书编号

    借阅表

    未还书名

    图书表

    出版社名

    出版社表

    借书日期

    借阅表

    可借期天数

    读者类型表

    罚款金额

    借阅表

             

     

    3.3.4  图书分类库存视图

    列  名

    来源表

     图书类型编号

    图书类型表

     图书类型名

    图书类型表

     库存册数合计

    图书表

     库存金额合计

    图书表

     

    3.3.5   借出次数前100图书视图

    列  名

    来源表

     图书编号

    图书表

     书名

    图书表

     借出次数

    图书表

           
     

    第4章 数据库物理结构设计

    4.1索引的设计原则

      (1)如果一个(或一组)属性经常在查询条件中出现,则考虑早这个(或这组)属性建立索引。

    (2)如果一个属性经常作为最大值和最小值等聚集函数的参数,则考虑这个属性上建立索引。

    (3)如果一个(或一组)属性经常在连接操作的连接条件中出现,则考虑在这个(或这组)属性上建立索引。

     

    4.2 索引结构设计 

                                                                                                                                  表4.1  索引结构表

    表名

    索引名

    索引列

    备注(索引的设计理由)

    图书

    书名索引

    书名

    经常查询的列

    图书

    出版社编号索引

    出版编社号

    经常连接的列

    图书

    图书类型索引

    图书类型编号

    经常连接的列

    图书

    作者索引

    作者

    经常查询的列

    图书类型

    书库号索引

    书库号

    经常连接的列

    读者

    姓名索引

    姓名

    经常查询的列

    读者

    图书借阅次数索引

    图书借阅次数

    聚集函数的参数

    读者

    已借册数索引

    已借册数

    聚集函数的参数

    读者

    未交罚款金额索引

    未交罚款金额

    聚集函数的参数

    职工

    姓名索引

    姓名

    经常查询的列

    罚款交费单

    借书证编号索引

    借书证编号

    经常连接的列

    图书入库单

    经手职工编号索引

    经手职工编号

    经常连接的列

    图书入库单明细

    图书入库单编号索引

    图书入库单编号

    经常连接的列

    图书入库单明细

    图书编号索引

    图书编号

    经常连接的列

    图书报损单

    经手职工编号索引

    经手职工编号

    经常连接的列

    图书报损单明细

    图书报损单编号索引

    图书报损单编号

    经常连接的列

    图书报损单明细

    图书编号索引

    图书编号

    经常连接的列

    借阅

    借书证编号索引

    借书证编号

    经常连接的列

    借阅

    图书编号索引

    图书编号

    经常连接的列

       

     

    第5章 数据库实施

    5.1 建表语句

    CREATE TABLE 出版社
     (
     出版社编号 INT PRIMARY KEY,
     出版社名称 VARCHAR(50) NOT NULL,
     出版社地址 VARCHAR(50)
     );
    
     CREATE TABLE 书库
     (
     书库号 INT PRIMARY KEY,
     书库名 VARCHAR(50) NOT NULL
     );
    
     CREATE TABLE 图书类型
     (
     图书类型编号 CHAR(1) PRIMARY KEY,
     图书类型名 VARCHAR(50) NOT NULL,
     书库号 INT ,
     FOREIGN KEY(书库号) REFERENCES 书库(书库号)
     );
    
     CREATE TABLE 图书
     (
     图书编号 VARCHAR(20) PRIMARY KEY,
     出版社编号 INT NOT NULL,
     图书类型编号 CHAR(1) ,
     书名 VARCHAR(50) NOT NULL,
     作者 VARCHAR(20) NOT NULL,
     价格 NUMERIC(8,2) NOT NULL,
     页码 INT NOT NULL,
     库存总量 INT NOT NULL,
     现存量 INT NOT NULL,
     入库时间 DATETIME ,
     借出次数 INT NOT NULL,
     FOREIGN KEY(出版社编号) REFERENCES 出版社(出版社编号),
     FOREIGN KEY(图书类型编号) REFERENCES 图书类型(图书类型编号)
     );
    
     CREATE TABLE 读者类型
     (
     读者类型编号 CHAR(10) PRIMARY KEY,
     读者类型名 VARCHAR(20) NOT NULL,
     可借阅册数 INT CHECK(可借阅册数>=20 AND 可借阅册数<=60),
     借期天数 INT  CHECK(借期天数>=90 AND 借期天数<=120),
     可续借天数 INT  CHECK(可续借天数>=10 AND 可续借天数<=60)
     )
    
     CREATE TABLE 读者
     (
     证书编号 INT PRIMARY KEY,
     读者类型编号 CHAR(10),
     姓名 VARCHAR(50) NOT NULL,
     性别 CHAR(10) CHECK (性别 IN ('','')),
     出生日期 DATETIME NOT NULL,
     身份证编号 CHAR(18) CHECK(LEN(TRIM(身份证编号))=18),
     图书借阅次数 INT,
     是否挂失 INT,
     已借册数 INT,
     未交罚款金额 NUMERIC(8,2),
     FOREIGN KEY(读者类型编号) REFERENCES 读者类型 (读者类型编号)
     )
    
     CREATE TABLE 职工
     (
     职工编号 INT  PRIMARY KEY,
     职工姓名 VARCHAR(50) NOT NULL,
     性别 CHAR(10) CHECK (性别  IN ('','')),
     出生日期 DATETIME NOT NULL,
     文化程度 VARCHAR(20) NOT NULL
     )
    
     CREATE TABLE 罚款交费单
     (
     交费单号 INT PRIMARY KEY,
     借书证编号 INT ,
     日期 DATETIME NOT NULL,
     金额 NUMERIC(8,2) NOT NULL,
     FOREIGN KEY(借书证编号) REFERENCES 读者(证书编号)
      )
    
    CREATE TABLE 图书入库单 ( 入库单编号 INT PRIMARY KEY, 入库日期 DATETIME NOT NULL, 经手人编号 INT, 是否入库 INT, FOREIGN KEY(经手人编号) REFERENCES 职工(职工编号) ) CREATE TABLE 图书入库单明细 ( 入库单编号 INT, 图书编号 VARCHAR(20), 数量 INT NOT NULL, PRIMARY KEY(入库单编号,图书编号), FOREIGN KEY(入库单编号) REFERENCES 图书入库单(入库单编号), FOREIGN KEY(图书编号) REFERENCES 图书(图书编号) ) CREATE TABLE 图书报损单 ( 报损单编号 INT PRIMARY KEY, 报损日期 DATETIME NOT NULL, 经手人编号 INT, FOREIGN KEY(经手人编号) REFERENCES 职工(职工编号) ) CREATE TABLE 图书报损单明细 ( 报损单编号 INT, 图书编号 VARCHAR(20), 数量 INT NOT NULL, 报损原因 VARCHAR(100) NOT NULL, PRIMARY KEY(报损单编号,图书编号), FOREIGN KEY(报损单编号) REFERENCES 图书报损单(报损单编号), FOREIGN KEY(图书编号) REFERENCES 图书(图书编号) ) CREATE TABLE 借阅 ( 借书证编号 INT , 图书编号 VARCHAR(20), 借书日期 DATETIME NOT NULL, 还书日期 DATETIME, 罚款金额 NUMERIC(8,2), 是否续借 INT, CHECK (借书日期>=还书日期), PRIMARY KEY(借书证编号,图书编号), FOREIGN KEY(借书证编号) REFERENCES 读者(证书编号), FOREIGN KEY(图书编号) REFERENCES 图书(图书编号) )

     

     

    5.2 建视图语句

    CREATE VIEW 入库单(入库单编号,入库日期,经手人姓名,是否已入库,图书编号,书名,出版社名,入库数量)
     AS
     SELECT 图书入库单.入库单编号,图书入库单.入库日期,职工.职工姓名,图书入库单.是否入库,图书入库单明细.图书编号,图书.书名,出版社.出版社名称,图书入库单明细.数量
     FROM 图书入库单,图书入库单明细,职工,图书,出版社
     WHERE 图书入库单明细.入库单编号=图书入库单.入库单编号 AND 图书入库单明细.图书编号=图书.图书编号 AND 图书入库单.经手人编号=职工.职工编号 AND 图书.出版社编号=出版社.出版社编号
    
    CREATE VIEW 报损单(报损单编号,报损日期,经手人姓名,图书编号,书名,出版社名,报损数量,报损原因)
     AS
     SELECT 图书报损单.报损单编号,图书报损单.报损日期,职工.职工姓名,图书报损单明细.图书编号,图书.书名,出版社.出版社名称,图书报损单明细.数量,图书报损单明细.报损原因
     FROM  图书报损单,职工,图书报损单明细,图书,出版社
     WHERE 图书报损单明细.报损单编号=图书报损单.报损单编号 AND 图书报损单明细.图书编号=图书.图书编号 AND 图书报损单.经手人编号=职工.职工编号 AND 图书.出版社编号=出版社.出版社编号
    
    CREATE VIEW 读者未还借书(借书证编号,读者姓名,未还书编号,未还书名,出版社名,借书日期,可借期天数,罚款金额)
     AS
     SELECT 借阅.借书证编号,读者.姓名,借阅.图书编号,图书.书名,出版社.出版社名称,借阅.借书日期,读者类型.可续借天数,借阅.罚款金额
     FROM  借阅,读者,图书,出版社,读者类型
     WHERE 借阅.借书证编号=读者.证书编号 AND 借阅.图书编号=图书.图书编号 AND  图书.出版社编号=出版社.出版社编号 AND 读者.读者类型编号=读者类型.读者类型编号
    
    CREATE VIEW 图书分类库存(图书类型编号,图书类型名,库存册数合计,库存金额合计)
     AS
     SELECT 图书类型.图书类型编号,图书类型.图书类型名,sum(图书.库存总量),sum(图书.价格*图书.库存总量)
     FROM  图书,图书类型
     WHERE 图书类型.图书类型编号=图书.图书类型编号
     GROUP BY 图书类型.图书类型编号,图书类型.图书类型名
    
    CREATE VIEW 借出次数前100图书(图书编号,书名,借出次数)
     AS
     SELECT TOP(100) 图书编号,书名,借出次数
     FROM  图书
     ORDER BY 借出次数 DESC

     

    5.3建索引语句

      CREATE INDEX 书名索引 ON 图书(书名);
      CREATE INDEX 出版社编号索引 ON 图书(出版社编号);
      CREATE INDEX 图书类型编号索引 ON 图书(图书类型编号);
      CREATE INDEX 作者索引 ON 图书(作者);
      CREATE INDEX 书库号索引 ON 图书类型(书库号);
      CREATE INDEX 姓名索引 ON 读者(姓名);
      CREATE INDEX 图书借阅次数索引 ON 读者(图书借阅次数);
      CREATE INDEX 已借册数索引 ON 读者(已借册数);
      CREATE INDEX 未交罚款金额索引 ON 读者(未交罚款金额);
      CREATE INDEX 职工姓名索引 ON 职工(职工姓名);
      CREATE INDEX 借书证编号索引 ON 罚款交费单(借书证编号);
      CREATE INDEX 经手职工编号索引 ON 图书入库单(经手人编号);
      CREATE INDEX 图书入库单编号索引 ON 图书入库单明细(入库单编号);
      CREATE INDEX 图书编号索引 ON 图书入库单明细(图书编号);
      CREATE INDEX 经手职工编号索引 ON 图书报损单(经手人编号);
      CREATE INDEX 图书报损单编号索引 ON 图书报损单明细(报损单编号);
      CREATE INDEX 图书编号索引 ON 图书报损单明细(图书编号);
      CREATE INDEX 借书证编号索引 ON 借阅(借书证编号);
      CREATE INDEX 图书编号索引 ON 借阅(图书编号);

     

    5.4存储过程

       每个存储过程的功能说明和建立语句

     

      INSERT INTO 书库 VALUES(2,'理工库' );
      INSERT INTO 图书类型 VALUES('T','工业技术', 2);
      INSERT INTO 出版社 VALUES (1 ,'清华大学出版社','北京');
      INSERT INTO 图书(图书类型编号, 出版社编号, 图书编号,书名,作者,价格,页码,现存量,库存总量,入库时间,借出次数) VALUES ( 'T', 1, '101',  '数据库系统原理' , '王珊' , '20' , '400', 0,0,null,0);
      INSERT INTO 图书(图书类型编号, 出版社编号, 图书编号,书名,作者,价格,页码,现存量,库存总量,入库时间,借出次数) VALUES ( 'T', 1, '102',  'C程序设计' , '谭浩强 ', '18 ' , '300' , 0,0,null,0);
      INSERT INTO 图书(图书类型编号, 出版社编号, 图书编号,书名,作者,价格,页码,现存量,库存总量,入库时间,借出次数) VALUES ( 'T', 1, '103',  '计算机组成原理' , '张兵' , '20' , '400' , 0,0,null,0);
      INSERT INTO 职工 VALUES(10001,'王小伟','', 1995-3-7,'本科');
      INSERT INTO 图书入库单(入库单编号,入库日期,经手人编号,是否入库) VALUES(100,'7-1-2018' ,'10001',0);
      INSERT INTO 图书入库单明细(入库单编号,图书编号,数量) VALUES(100,101,75);
      INSERT INTO 图书入库单明细(入库单编号,图书编号,数量) VALUES(100,102,75);
      INSERT INTO 图书入库单明细(入库单编号,图书编号,数量) VALUES(100,103,75);

     

    存储过程

    GO
      CREATE  PROCEDURE  P1  
      @入库单号   INT
    AS
    DECLARE @图书编号 INT, @数量 INT ,@是否已入库 INT ,@入库日期 DATETIME
    DECLARE C1 CURSOR FOR       
           SELECT 图书编号,数量 FROM 图书入库单明细 WHERE 入库单编号=@入库单号
    SELECT @是否已入库=是否入库, @入库日期=入库日期
    FROM 图书入库单
    WHERE 入库单编号=@入库单号
    IF @是否已入库=0
    BEGIN
    
    OPEN C1
    BEGIN TRANSACTION  /* 处理之前  开始事务(要么全做,要么全不做) */
    /* 处理 */
    WHILE 1=1
    BEGIN
      FETCH NEXT FROM C1 INTO  @图书编号, @数量
      IF @@fetch_status<>0  
             BREAK 
      UPDATE 图书/*修改图书表*/
      SET 库存总量=库存总量+@数量,现存量=现存量+@数量,入库时间=@入库日期
      WHERE 图书编号=@图书编号
    END   
    CLOSE C1
    DEALLOCATE C1
    UPDATE 图书入库单/*修改图书入库单表*/
    SET 是否入库=1
    WHERE 入库单编号=@入库单号
    COMMIT    /* 一个订单的订单明细全部处理完成  */
    END
    GO

    执行存储过程

    EXEC P1 100

     

    SELECT *
    FROM 图书入库单明细

     

     

    select *
    from 图书

     

    5.5触发器

       每个触发器的功能说明和建立语句

      

    1.编写图书入库单明细表的DELETE触发器, 如已经入库(对应入库单的<是否已入库> 1), 报错已入库不能删除!,回滚事务

    (在触发器中执行ROLLBACK TRANSACTION, 回滚(撤销)引起触发器DELETE的语句)

    GO
    CREATE TRIGGER trig_delete_tsrkdmx
    ON 图书入库单明细
    FOR DELETE AS
      DECLARE @是否入库 INT,@入库单编号 INT
      SET @入库单编号 = (SELECT TOP 1 入库单编号 FROM deleted)
      SET @是否入库 = (SELECT 是否入库 FROM 图书入库单 WHERE 入库单编号=@入库单编号)
      IF @是否入库=1
      BEGIN
         RAISERROR('已入库不能删除!',16,1)
         ROLLBACK TRANSACTION
         END
    GO 

    测试:

    删除入库明细单中入库单号为100的行

    触发器报错, 删除失败,截图

     

    delete
    from 图书入库单明细
    where 入库单编号=100

     

     

    2 编写图书入库单明细表的UPDATE触发器, 如已经入库(对应入库单<是否已入库> 1),报错已入库不能修改,回滚事务

    GO
    CREATE TRIGGER trig_update_tsrkdmx
    ON 图书入库单明细
    FOR UPDATE AS
      DECLARE @是否入库 INT,@入库单编号 INT
      SET @入库单编号 = (SELECT TOP 1 入库单编号 FROM deleted)
      SET @是否入库 = (SELECT 是否入库 FROM 图书入库单 WHERE 入库单编号=@入库单编号)
      IF @是否入库=1
      BEGIN
         RAISERROR('已入库不能修改!',16,1)
         ROLLBACK TRANSACTION
         END
    GO 

     

    测试:

    UPDATE入库明细单中入库单号为100的行

    触发器报错, update失败

     

    update 图书入库单明细
    set 数量=110
    where 入库单编号=100

     

     

     

    3读者借书时, 要插入借阅行

    编写触发器,当插入借阅时

    如读者已借够可借册数,

    不准借了(报错, 回滚事务)

    如或读者有未交罚款>100

    不准借了(报错, 回滚事务)

    否则

    {

    将读者已借册数加1, 图书借阅次数1,将图书的借出次数加1现存量减1

    }

    GO
    CREATE TRIGGER trig_insert_jieyue
    ON 借阅
    FOR INSERT AS
      DECLARE @借书证编号 INT,@已借册数 INT,@可借册数 INT,@读者类型编号 CHAR(10),@未交罚款金额 NUMERIC(8,2),@图书编号 VARCHAR(20)
      SET @借书证编号 = (SELECT TOP 1 借书证编号 FROM inserted) 
      SET @图书编号 = (SELECT TOP 1 图书编号 FROM inserted)
      SET @已借册数 = (SELECT 已借册数 FROM 读者 WHERE 证书编号=@借书证编号)
      SET @读者类型编号 = (SELECT 读者类型编号 FROM 读者 WHERE 证书编号=@借书证编号)
      SET @未交罚款金额 = (SELECT 未交罚款金额 FROM 读者 WHERE 证书编号=@借书证编号)
      SET @可借册数 =(SELECT 可借阅册数 FROM 读者类型 WHERE 读者类型编号=@读者类型编号)
      IF @已借册数> @可借册数
      BEGIN
         RAISERROR('读者已借够可借册数!',16,1)
         ROLLBACK TRANSACTION
      END
      ELSE IF @未交罚款金额>100
      BEGIN
         RAISERROR('读者有未交罚款!',16,1)
         ROLLBACK TRANSACTION
      END
      ELSE
       BEGIN
        UPDATE 读者
        SET 图书借阅次数=图书借阅次数+1
        WHERE 证书编号= @借书证编号
        UPDATE 图书
        SET 借出次数=借出次数+1,现存量=现存量-1
        WHERE 图书编号= @图书编号
      END
    GO 

    测试:

    自行设计测试数据

     

    INSERT INTO 读者类型(读者类型编号,读者类型名,可借阅册数,借期天数,可续借天数) VALUES('10000','本科生',30,90,10  );
    INSERT INTO 读者(证书编号,姓名,读者类型编号,性别,出生日期,身份证编号,图书借阅次数,是否挂失,已借册数,未交罚款金额)
    VALUES(10,'王陆','10000','','1999-5-6','370683199703786815',10,0,20,110);
    INSERT INTO 借阅(借书证编号, 图书编号,借书日期,还书日期,是否续借,罚款金额) VALUES(10,'101','2019-6-21',NULL,0,0);

     

     

     

    4读者还书时, 要修改借阅表,设置还书日期。

    编写触发器,当修改借阅时(一次只修改一行,不考虑修改多行的情况,不用游标)

    如果还书日期原来为空值,新值不是空值(这表明是还书操作)

         将读者的已借册数减1, 将图书的现存量加1

    如果罚款金额原来为空值,新值不是空值(这表明是有罚款)

         将读者的未交罚款增加

    如果罚款金额原来不是空值,新值不是空值(这表明是罚款修改了)

         将读者的未交罚款调整 ( 减旧罚款, 加新罚款)

    GO
    CREATE TRIGGER trig_update_jieyue
    ON 借阅
    FOR UPDATE AS
      DECLARE @原还书日期 DATETIME,@新还书日期 DATETIME,@原罚款金额 NUMERIC(8,2),@新罚款金额 NUMERIC(8,2),@借书证编号 INT,@已借册数 INT,@图书编号 VARCHAR(20)
      SET @原还书日期 = (SELECT TOP 1 还书日期 FROM deleted) 
      SET @新还书日期 = (SELECT TOP 1 还书日期 FROM inserted) 
      SET @原罚款金额 = (SELECT TOP 1 罚款金额 FROM deleted) 
      SET @新罚款金额 = (SELECT TOP 1 罚款金额 FROM inserted)
      SET @借书证编号 = (SELECT TOP 1 借书证编号 FROM deleted) 
      SET @图书编号 = (SELECT TOP 1 图书编号 FROM deleted)
      SET @已借册数 = (SELECT 已借册数 FROM 读者 WHERE 证书编号=@借书证编号)
      IF @原还书日期 IS NULL AND @新还书日期 IS NOT NULL--还书操作
      BEGIN
        UPDATE 读者
        SET 图书借阅次数=图书借阅次数-1
        WHERE 证书编号= @借书证编号
        UPDATE 图书
        SET 现存量=现存量+1
        WHERE 图书编号= @图书编号
      END
      IF @原罚款金额 IS NULL AND @新罚款金额 IS NOT NULL--未交罚款增加
      BEGIN
        UPDATE 读者
        SET 未交罚款金额=@新罚款金额
        WHERE 证书编号= @借书证编号
      END
      IF @原罚款金额 IS NOT NULL AND @新罚款金额 IS NOT NULL--未交罚款修改
      BEGIN
      UPDATE 读者
        SET 未交罚款金额=未交罚款金额+@新罚款金额
        WHERE 证书编号= @借书证编号
      END
    GO

    测试:

    自行设计测试数据

     

    INSERT INTO 读者类型(读者类型编号,读者类型名,可借阅册数,借期天数,可续借天数) VALUES('10000','本科生',30,90,10  );
    INSERT INTO 读者(证书编号,姓名,读者类型编号,性别,出生日期,身份证编号,图书借阅次数,是否挂失,已借册数,未交罚款金额)
    VALUES(10,'王陆','10000','','1999-5-6','370683199703786815',10,0,20,30);
    INSERT INTO 借阅(借书证编号, 图书编号,借书日期,还书日期,是否续借,罚款金额) VALUES(10,'101','2019-6-21',NULL,0,0);
    SELECT *
    FROM 借阅
     UPDATE 借阅
     SET 还书日期='2019-6-21'
     WHERE 借书证编号=10
     UPDATE 借阅
     SET 罚款金额=罚款金额+5
     WHERE 借书证编号=10
    
     SELECT *
     FROM 借阅
    
     SELECT *
     FROM 读者
     
     SELECT *
     FROM 图书

     

     

     

    5 读者交罚款时, 要插入罚款交费单

    编写触发器,当插入罚款交费单

    将读者的未交罚款减少

    GO
    CREATE TRIGGER trig_insert_fakuan
    ON 罚款交费单
    FOR INSERT AS
      DECLARE @借书证编号 INT,@金额 NUMERIC(8,2) 
      SET @借书证编号 = (SELECT TOP 1 借书证编号 FROM inserted) 
      SET @金额 = (SELECT TOP 1 金额 FROM inserted)
      IF @金额 IS NOT NULL
      BEGIN
        UPDATE 读者
        SET 未交罚款金额=未交罚款金额-@金额
        WHERE 证书编号= @借书证编号
      END
    GO

    测试:

    自行设计测试数据

     

    INSERT INTO 读者类型(读者类型编号,读者类型名,可借阅册数,借期天数,可续借天数) VALUES('10000','本科生',30,90,10  );
    INSERT INTO 读者(证书编号,姓名,读者类型编号,性别,出生日期,身份证编号,图书借阅次数,是否挂失,已借册数,未交罚款金额)
    VALUES(10,'王陆','10000','','1999-5-6','370683199703786815',10,0,20,100);
    INSERT INTO 借阅(借书证编号, 图书编号,借书日期,还书日期,是否续借,罚款金额) VALUES(10,'101','2019-6-21',NULL,0,0);
    INSERT INTO 罚款交费单(交费单号,日期,职工编号,金额,借书证编号)  VALUES(1,'2019-6-22',10001,100,10);
    select *
    from 读者

     

     

     

    6  编写触发器,借书表不允许DELETE操作

    GO
    CREATE TRIGGER trig_delete_jieyue
    ON 借阅
    FOR DELETE AS
     RAISERROR('借书表不允许DELETE操作',16,1)
     ROLLBACK TRANSACTION
    GO 

    测试:

    自行设计测试数据

     

    DELETE 
    FROM 借阅

     

     

    7  编写报损单触发器

    GO
    CREATE TRIGGER trig_insert_baosun
    ON 图书报损单明细
    FOR INSERT AS
      DECLARE @数量 INT,@图书编号 VARCHAR(20)
      SET @数量 = (SELECT TOP 1 数量 FROM inserted) 
      SET @图书编号 = (SELECT TOP 1 图书编号 FROM inserted)
        UPDATE 图书
        SET 库存总量=库存总量-@数量,现存量=现存量-@数量
        WHERE 图书编号= @图书编号 
    GO

     

    第6章 测试数据

    6.1完整的测试数据

    /*在出版社表插入5行数据 
    */
     INSERT INTO 出版社 VALUES (1 ,'清华大学出版社','北京');
     INSERT INTO 出版社 VALUES (2 ,'高等教育出版社','北京');
     INSERT INTO 出版社 VALUES (3 ,'天津大学出版社','天津');
     INSERT INTO 出版社 VALUES (4 ,'复旦大学出版社','上海');
     INSERT INTO 出版社 VALUES (5 ,'山东大学出版社','济南');
    /*在书库表插入4行数据*/
     INSERT INTO 书库 VALUES(1,'文史库' ); 
     INSERT INTO 书库 VALUES(2,'理工库' );
     INSERT INTO 书库 VALUES(3,'经管库' ); 
     INSERT INTO 书库 VALUES(4,'政法库' ); 
    
    /*在图书类型表插入5行数据,注意图书类型编号为字符型   
    */
     INSERT INTO 图书类型 VALUES('T','工业技术', 2);
     INSERT INTO 图书类型 VALUES('A','马克思,列,毛,邓', 4);
     INSERT INTO 图书类型 VALUES('K','历史地理', 1);
     INSERT INTO 图书类型 VALUES('F','经济', 3);
     INSERT INTO 图书类型 VALUES('I','文学', 1);
    
    /*在图书表插入20行数据 */
    INSERT INTO 图书(图书类型编号, 出版社编号, 图书编号,书名,作者,价格,页码,现存量,库存总量,入库时间,借出次数) 
    VALUES ( 'T', 1, '101',  '数据库系统原理' , '王珊' , '20' , '400', 100,100,'6-10-2019',0);
    INSERT INTO 图书(图书类型编号, 出版社编号, 图书编号,书名,作者,价格,页码,现存量,库存总量,入库时间,借出次数) 
    VALUES ( 'T', 1, '102',  'C程序设计' , '谭浩强 ', '18 ' , '300' ,100,100,'6-10-2019',0);
    INSERT INTO 图书(图书类型编号, 出版社编号, 图书编号,书名,作者,价格,页码,现存量,库存总量,入库时间,借出次数) 
    VALUES ( 'T', 1, '103',  '计算机组成原理' , '张兵' , '20' , '400' ,100,100,'6-10-2019',0);
    INSERT INTO 图书(图书类型编号, 出版社编号, 图书编号,书名,作者,价格,页码,现存量,库存总量,入库时间,借出次数) 
    VALUES ( 'A', 2, '104',  '毛思想和中特社' , '高英王洋' , '20' , '400' ,100,100,'6-19-2019',0);
    INSERT INTO 图书(图书类型编号, 出版社编号, 图书编号,书名,作者,价格,页码,现存量,库存总量,入库时间,借出次数) 
    VALUES ( 'F ',3, '105',  '经济学导论' , '罗丽英' , '20' , '400' ,100,100,'6-19-2019',0);
    INSERT INTO 图书(图书类型编号, 出版社编号, 图书编号,书名,作者,价格,页码,现存量,库存总量,入库时间,借出次数) 
    VALUES ( 'K', 4, '106',  '中国近代史' , '张鸣' , '40' , '400' ,100,100,'6-19-2019',0);
    INSERT INTO 图书(图书类型编号, 出版社编号, 图书编号,书名,作者,价格,页码,现存量,库存总量,入库时间,借出次数) 
    VALUES ( 'I', 5, '107',  '鲁迅文集' , '鲁迅' , '30' , '400' ,100,100,'6-20-2019',0);
    
    /*在读者类型表插入4行数据 
    
    */
    INSERT INTO 读者类型(读者类型编号,读者类型名,可借阅册数,借期天数,可续借天数) VALUES('bk01','本科生',30,90,10  );
    INSERT INTO 读者类型(读者类型编号,读者类型名,可借阅册数,借期天数,可续借天数) VALUES('yj01','研究生',40,100,10  );
    INSERT INTO 读者类型(读者类型编号,读者类型名,可借阅册数,借期天数,可续借天数) VALUES('js01','讲师',50,110,20  );
    INSERT INTO 读者类型(读者类型编号,读者类型名,可借阅册数,借期天数,可续借天数) VALUES('js02','教授',60,120,30  );
    /*在读者表插入10行数据*/
    
    INSERT INTO 读者(证书编号,姓名,读者类型编号,性别,出生日期,身份证编号,图书借阅次数,是否挂失,已借册数,未交罚款金额)
    VALUES(10,'王陆','bk01','','1999-5-6','370683199905066815',10,0,20,10);
    
    INSERT INTO 读者(证书编号,姓名,读者类型编号,性别,出生日期,身份证编号,图书借阅次数,是否挂失,已借册数,未交罚款金额)
    VALUES(11,'王舞','bk01','','1998-5-16','370683199805166816',10,0,20,0);
    
    INSERT INTO 读者(证书编号,姓名,读者类型编号,性别,出生日期,身份证编号,图书借阅次数,是否挂失,已借册数,未交罚款金额)
    VALUES(12,'陆飘','yj01','','1995-4-16','370683199504166816',10,0,20,20);
    
    INSERT INTO 读者(证书编号,姓名,读者类型编号,性别,出生日期,身份证编号,图书借阅次数,是否挂失,已借册数,未交罚款金额)
    VALUES(13,'张山','js01','','1988-5-16','370683198805166816',10,0,20,30);
    
    INSERT INTO 读者(证书编号,姓名,读者类型编号,性别,出生日期,身份证编号,图书借阅次数,是否挂失,已借册数,未交罚款金额)
    VALUES(14,'刘勇','js02','','1977-5-17','370683199805176816',10,0,20,0);
    
    INSERT INTO 读者(证书编号,姓名,读者类型编号,性别,出生日期,身份证编号,图书借阅次数,是否挂失,已借册数,未交罚款金额)
    VALUES(15,'孔燕','js02','','1978-5-16','370683197807166816',10,0,20,0);
    
    /*在职工插入5行数据*/
     INSERT INTO 职工 VALUES(10001,'王小伟','', '1995-3-7','本科');
     INSERT INTO 职工 VALUES(10002,'张三','', '1996-7-8','本科');
     INSERT INTO 职工 VALUES(10003,'李四','', '1994-5-3','本科');
     INSERT INTO 职工 VALUES(10004,'王五','', '1995-4-23','本科');
     INSERT INTO 职工 VALUES(10005,'小六','', '1997-3-17','本科');
    /*在图书入库单表插入5行数据,是否已入库的值是0
         注意,日期格式:  ‘月-日-年’, 例如 ’6-20-2016’
    */
    INSERT INTO 图书入库单(入库单编号,入库日期,经手人编号,是否入库) 
    VALUES(100,'6-10-2019' ,10001,0);
    INSERT INTO 图书入库单(入库单编号,入库日期,经手人编号,是否入库) 
    VALUES(101,'6-19-2019' ,10002,0);
    INSERT INTO 图书入库单(入库单编号,入库日期,经手人编号,是否入库) 
    VALUES(102,'6-20-2019' ,10003,0);
    /*对应每个入库单,各输入3个明细数据  
    */
    INSERT INTO 图书入库单明细(入库单编号,图书编号,数量) VALUES(100,101,100);
    INSERT INTO 图书入库单明细(入库单编号,图书编号,数量) VALUES(100,102,100);
    INSERT INTO 图书入库单明细(入库单编号,图书编号,数量) VALUES(100,103,100);
    
    INSERT INTO 图书入库单明细(入库单编号,图书编号,数量) VALUES(101,104,100);
    INSERT INTO 图书入库单明细(入库单编号,图书编号,数量) VALUES(101,105,100);
    INSERT INTO 图书入库单明细(入库单编号,图书编号,数量) VALUES(101,106,100);
    
    INSERT INTO 图书入库单明细(入库单编号,图书编号,数量) VALUES(102,107,100);
    
    /*在图书报损单表插入2行数据,报损单号为5,日期为2016.6.20 
    */
    INSERT INTO 图书报损单(报损单编号,报损日期,经手人编号) 
    VALUES(5,'6-20-2019' ,10004);
    INSERT INTO 图书报损单(报损单编号,报损日期,经手人编号) 
    VALUES(6,'6-20-2019' ,10005);
    /*对应每个入库单,各输入3个明细数据  
    */
    
    INSERT INTO 图书报损单明细(报损单编号,图书编号,数量,报损原因) VALUES(5,101,1,'图书丢失');
    INSERT INTO 图书报损单明细(报损单编号,图书编号,数量,报损原因) VALUES(5,102,1,'图书丢失');
    INSERT INTO 图书报损单明细(报损单编号,图书编号,数量,报损原因) VALUES(5,103,1,'图书丢失');
    INSERT INTO 图书报损单明细(报损单编号,图书编号,数量,报损原因) VALUES(6,104,1,'图书丢失');
    INSERT INTO 图书报损单明细(报损单编号,图书编号,数量,报损原因) VALUES(6,105,1,'图书丢失');
    INSERT INTO 图书报损单明细(报损单编号,图书编号,数量,报损原因) VALUES(6,106,1,'图书丢失');
    /*在借书表插入10行数据 */
    
    INSERT INTO 借阅(借书证编号, 图书编号,借书日期,还书日期,是否续借,罚款金额) VALUES(10,'101','2019-6-11',NULL,0,0);
    INSERT INTO 借阅(借书证编号, 图书编号,借书日期,还书日期,是否续借,罚款金额) VALUES(10,'102','2019-6-11',NULL,0,0);
    INSERT INTO 借阅(借书证编号, 图书编号,借书日期,还书日期,是否续借,罚款金额) VALUES(11,'102','2019-6-12',NULL,0,0);
    INSERT INTO 借阅(借书证编号, 图书编号,借书日期,还书日期,是否续借,罚款金额) VALUES(12,'103','2019-6-20',NULL,0,0);
    INSERT INTO 借阅(借书证编号, 图书编号,借书日期,还书日期,是否续借,罚款金额) VALUES(13,'104','2019-6-21',NULL,0,0);
    INSERT INTO 借阅(借书证编号, 图书编号,借书日期,还书日期,是否续借,罚款金额) VALUES(14,'107','2019-6-20',NULL,0,0);
    INSERT INTO 借阅(借书证编号, 图书编号,借书日期,还书日期,是否续借,罚款金额) VALUES(15,'106','2019-6-21',NULL,0,0);
    INSERT INTO 借阅(借书证编号, 图书编号,借书日期,还书日期,是否续借,罚款金额) VALUES(15,'105','2019-6-22',NULL,0,0);
    /*在罚款交费单表插入5行数据 */
    
    INSERT INTO 罚款交费单(交费单号,日期,职工编号,金额,借书证编号)  
    VALUES(1,'2019-6-22',10001,10,10);
    INSERT INTO 罚款交费单(交费单号,日期,职工编号,金额,借书证编号)  
    VALUES(2,'2019-6-22',10004,20,12);
    INSERT INTO 罚款交费单(交费单号,日期,职工编号,金额,借书证编号)  
    VALUES(3,'2019-6-22',10005,30,13);

    6.2测试查询语句

     

    1 完成设计报告《6.1完整的测试数据》

     查询图书表,看看结果是否正确,截图到设计报告. (注意报损的图书册数未计入, 应如何解决?)

     

    SELECT *
    FROM 图书

     

    查询读者表,看看结果是否正确,截图到设计报告.

    SELECT *
    FROM 读者

     

    完成设计报告《6.2 测试查询语句》。

    写出下列SQL语句并运行通过

      例如:写出用LIKE的查询要求, 并写出查询语句.

        查询要求:

    查询书名中含有’数据库’的图书编号,书名

              查询语句:

     

    SELECT 图书编号,书名 
    FROM 图书
    WHERE 书名 LIKE%数据库%

       

    (1)    写出用到2表连接的查询要求, 并写出查询语句.

    SELECT 出版社.出版社编号,出版社名称,出版社地址
    FROM  出版社,图书
    WHERE 图书.出版社编号=出版社.出版社编号

     

     

    (2)    写出用到3表连接的查询要求, 并写出查询语句.

    SELECT *
    FROM  读者,图书,借阅
    WHERE 图书.图书编号=借阅.图书编号 AND 读者.证书编号=借阅.借书证编号

     

     

    (3)    写出用到GROUP BY的查询要求, 并写出查询语句.

    SELECT 图书.图书类型编号,书名
    FROM  图书,图书类型
    WHERE 图书.图书类型编号=图书类型.图书类型编号
    GROUP BY 图书.图书类型编号,书名

     

     

     

    (4)    写出用到IN 子查询的查询要求, 并写出查询语句.

    查询出版社地址在北京的图书

    SELECT 书名
    FROM 图书
    WHERE 出版社编号 IN
    (
    SELECT 出版社编号
    FROM 出版社
    WHERE 出版社地址='北京'
    )

     

     

    (5)    写出用到NOT IN 子查询的查询要求, 并写出查询语句.

    查询出版社地址不在北京的图书

    SELECT 书名
    FROM 图书
    WHERE 出版社编号 NOT IN
    (
    SELECT 出版社编号
    FROM 出版社
    WHERE 出版社地址='北京'
    )

     

     

    (6)    写出用到EXISTS子查询的查询要求, 并写出查询语句.

    SELECT 书名
    FROM 图书
    WHERE EXISTS
    (
    SELECT *
    FROM 出版社
    WHERE 图书.出版社编号=出版社.出版社编号 AND 出版社地址='北京'
    )

     

     

    (7)    写出用到NOT EXISTS子查询的查询要求, 并写出查询语句.

    SELECT 书名
    FROM 图书
    WHERE NOT EXISTS
    (
    SELECT *
    FROM 出版社
    WHERE 图书.出版社编号=出版社.出版社编号 AND 出版社地址='北京'
    )
     

     

     

    (8)对每个视图,写出查询语句

     

    1.入库单视图

    SELECT *
    FROM 入库单

     

     

    2.报损单视图

    SELECT *
    FROM 报损单

     

     

    3.读者未还借书视图

    SELECT *
    FROM 读者未还借书

     

     

    4.图书分类库存视图

    SELECT *
    FROM 图书分类库存

     

     

    4.借出次数前100图书视图

    SELECT *
    FROM 借出次数前100图书

     

     

     

    第7章 结论

    7.1 创新和特点

      数据库的概念设计,对E-R图的设计和简化;数据库的逻辑结构设计,建立起表结构;建立索引,索引表结构的设计;SQL建表,建立存储过程,建立触发器,数据插入后的测试。

    7.2 遇到的主要问题和解决方法

    在数据库概念设计中对各个实体性的确立和划分,这要从图书管理使用的实际出发,确定实体型和各个实体之间关系。

    E-R图向关系模式转换的过程中要明确好主码、外码等属性,建立好各个表之间的逻辑结构。

    7.3 进一步改进的设想

    该图书借阅管理系统还存在着许多问题,在逻辑结构设计的过程中一些表虽然减少了冗余,但在查询使用的过程中却存在着语句复杂,使用复杂的问题。同时用于实时检验和修改的触发器设计过于简陋,触发器数量太少,使得该系统不太成熟。

    7.4 课程设计体会

    通过对图书借阅管理系统的设计,一方面让我明白了数据库原理在图书管理上运用的流程,另一方面也让我初步了解了SQL-server 2017的开发工具的使用方法,熟悉了SQL建立数据库的一系列过程。在课程设计的过程中也遇到了一些问题,但是通过请教老师和同学讨论,解决了不少问题,对数据库系统原理也用了一个体系化的理解,收获很大。

    7.5 学习数据库系统原理后的体会

       数据库的使用和高级程序开发的关系密不可分,学好数据库系统原理对于进一步理解程序设计流程和软件开发应用有着很大作用,通过本学期数据库系统原理的学习,虽然现在还没有真正使用数据库和高级语言一起用于程序的开发,但对开发流程和其中用到的数据库原理已经有所理解了。

     

     

    转载于:https://www.cnblogs.com/wkfvawl/p/11052660.html

    展开全文
  • 经过长达四天的咸鱼,我在课设的进展只有一个ER...图书借阅管理系统 系统基本功能要求 1.登录连接数据库管理系统 系统须有登录连接数据库管理系统的功能。2.增、删、改、查询功能系统须有增加、删除、修改、查...

     

     

     

     

    经过长达四天的咸鱼,我在课设的进展只有一个ER图。这对我来说是远远落后于理想中进度的。

    所以在昨天下午我到达学校宿舍,给自己营造一个不受干扰的环境,好好开始做课设了。

     

    课程设计题目 

    图书借阅管理系统

     

    系统基本功能要求

     

    1.登录连接数据库管理系统
    系统须有登录连接数据库管理系统的功能。
    2.增、删、改、查询功能
    系统须有增加、删除、修改、查询数据的功能。
    3.简单的统计分析功能
    系统须有统计、排名等功能。
    4.完整性约束功能
    系统须有实体完整性约束和参照完整性约束。

     


    系统其它功能要求(可选)
    尝试在系统使用视图、存储过程、触发器、用户定义完整性约束等功能。

     

    E-R图

    数据库实现:SqlServer2012

     

    转载于:https://www.cnblogs.com/earsonlau/p/8356186.html

    展开全文
  • 图书管理系统数据库设计 一系统概述 1系统介绍 图书管理是每个图书馆全部需要进行工作一个设计良好图书管理系统数据库能够给图书管理带来很大便利 2需求分析 图书管理系统需求定义为 1.学生能够直接经过借阅终端来...
  • 4.1图书借阅管理系统模块设计举例 4.2 数据库设计 4.2.1概念结构设计 4.2.2本系统中所涉及到的主要实体及其属性 4.2.3本系统的实体-联系(E-R)图 4.2.4各表的物理结构 4.3计算机系统的配置方案 第五章 图书借阅...
  • 采用JSP技术构建的一个管理系统。整个开发过程首先对软件系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全...
  • 学校的数据库设计的课设作业; 基于B/S架构; 前端选择Vue.js; 后端选择node.js; 项目部署选择nginx进行反向代理;...- 综合运用《数据库系统原理》实验掌握的数据库知识与技术开发设计某小型数据库应用系统
  • 详细的图书借阅系统报告, 包括数据库需求分析、数据库概念结构设计数据库逻辑结构设计数据库实施阶段和数据库运行和维护。
  • 一个简单的数据库课程设计-图书借阅管理系统。包括图书的查询,借书和还书及图书的预约等业务 设计与实现
  • Oracle图书借阅系统数据库设计

    千次阅读 多人点赞 2018-12-10 10:51:34
    完成学生成绩管图书借阅理系统基本功能设计,提高学生的分析问题、解决问题的能力。 二、设备与环境 硬件:多媒体计算机 软件:WindowsXP以上的操作系统、Oracle 10g 数据库管理系统 三、实验内容及实验结...

    一、实验目的

    通过该实验把数据库的理论知识(数据库和数据表的设计理论、视图、索引、存储过程、触发器、数据库备份、数据库安全等)应用到具体的综合实例中,达到数据库知识整合的目的。完成学生成绩管图书借阅理系统基本功能设计,提高学生的分析问题、解决问题的能力。

    二、设备与环境

    硬件:多媒体计算机

    软件:WindowsXP以上的操作系统、Oracle 10g 数据库管理系统

    三、实验内容及实验结果

    1.数据库设计

    设计思想

         创建一个表空间LIBTBS,用于保存图书管理系统的各种表,首先需要定义数据文件的存储地址,并且定义该数据文件的大小为500M、的分配方式为自动扩展、表空间的管理方式为本地管理。

       然后,将该表空间对应的数据文件的扩展方式定义为自动扩展,当该数据文件被写满时,每一次扩展50M,最大的数据文件大小为1000M,防止数据文件被填满而无法扩展。

     

    2.数据表设计

    设计思想

      创建四个表,定义在"SCOTT"模式下,存储在之前建立的表空间LIBTBS中。这四个表是读者表、图书表、借阅表和历史借阅表。

    读者表的作用是存放读者信息,读者号,读者姓名,性别,年级,学院,等等读者相关的信息。

    图书表的作用是存放图书信息,ISBN,书名,作者,存储量,价格等图书的相关信息。

    借阅表的作用是对读者表和图书表的一个链接,显示哪些人借的哪些书。借阅的日期和借阅过程产生的序列号信息。

    借阅历史表的作用是记录读者的借书和换书的过程,时间,书名,读者号码等等信息。对以前的借阅记录有迹可寻。

    具体实现

    创建读者表:

    CREATE TABLE "SCOTT"."READER"

    (

      "LNO" CHAR(12) PRIMARY KEY,

      "RNAME" VARCHAR2(10) NOT NULL,

      "SEX" CHAR(2),

      "BIRTHDAY" DATE,

      "DEPT" VARCHAR2(20),

      "SPEC" VARCHAR2(20),

      "GRADE" CHAR(4),

      "BORNUM" NUMBER(10) DEFAULT 0

    ) 

    TABLESPACE "LIBTBS";

    ALTER TABLE "SCOTT"."READER" ADD CONSTRAINTS "Sex_CK1" CHECK(Sex BETWEEN '男' AND '女');

    ALTER TABLE "SCOTT"."READER" ADD CONSTRAINTS "Bornum_CK2" CHECK(Bornum <= 10);

     

    创建图书表:

    CREATE TABLE "SCOTT"."BOOK"

    (

      "ISBN" CHAR(12) PRIMARY KEY,

      "BNAME" VARCHAR2(30) NOT NULL,

      "AUTHOR" VARCHAR2(10),

      "PRESS" VARCHAR2(40),

      "PRICE" NUMBER(7) DEFAULT 0 NOT NULL,

      "CD" CHAR(2) NOT NULL,

      "COPYNUM" NUMBER(10),

      "INVNUM" NUMBER(20),

      "CLASS" VARCHAR2(20) NOT NULL,

       CONSTRAINT "CD_CK1" CHECK(CD BETWEEN '有' AND '无')

    ) 

    TABLESPACE "LIBTBS";

     

    创建借阅表:

    CREATE TABLE "SCOTT"."LEND"

    (

       "LNO" CHAR(12) REFERENCES "SCOTT"."READER"(LNO),

       "ISBN" CHAR(12) REFERENCES "SCOTT"."BOOK"(ISBN),

       "BarNo" CHAR(10) PRIMARY KEY,

       "Bordate" DATE DEFAULT SYSDATE NOT NULL

    )

    TABLESPACE "LIBTBS";

     

    创建历史借阅表:

    CREATE TABLE "SCOTT"."HistoryLend"

    (

        "LNO" CHAR(12) REFERENCES "SCOTT"."READER"(LNO),

        "ISBN" CHAR(12) REFERENCES "SCOTT"."BOOK"(ISBN),

        "BarNum" CHAR(10) REFERENCES "SCOTT"."LEND"("BarNo"),

        "Bordate" DATE NOT NULL,

        "Retdate" DATE DEFAULT SYSDATE NOT NULL

    )

    TABLESPACE "LIBTBS";

    ALTER TABLE "SCOTT"."HistoryLend" ADD PRIMARY KEY(LNO,ISBN,"BarNum");

     

    3.视图设计

    设计思想

    视图可以作为一个特定查询,使用户可以重复使用,在本次综合实验中,我建立了一个查询图书、读者信息和借阅信息的视图,这样不同的操作员就可以直接使用不同的视图来查询,而不是每个人都要输入复杂的select语句
        同时,基于安全考虑,可以针对特定的视图赋给用户权限,而不是给用户赋给一个或几个表的权限,这样可以避免误操作更新数据的不安全因素。

     

    具体实现

        创建读者的图书信息查询视图:

    CREATE FORCE VIEW "SCOTT"."V_Reader_C1"

    AS

    SELECT "ISBN","BNAME","AUTHOR","PRESS","INVNUM" FROM "SCOTT"."BOOK"

    WITH READ ONLY;

     

    创建读者的借阅信息查询视图:

    CREATE FORCE VIEW "SCOTT"."V_Reader_C2"

    AS

    SELECT "LNO","ISBN","BarNo" FROM "SCOTT"."LEND"

    WITH READ ONLY;

     

    创建图书管理员的借阅信息查询视图:

    CREATE FORCE VIEW "SCOTT"."V_Manager_C1"

    AS

    SELECT * FROM "SCOTT"."LEND"

    WITH CHECK OPTION;

     

    创建图书管理员的历史借阅信息查询视图:

    CREATE FORCE VIEW "SCOTT"."V_Manager_C2"

    AS

    SELECT * FROM "SCOTT"."HistoryLend"

    WITH CHECK OPTION;

     

    创建图书管理员的图书信息查询视图:

    CREATE FORCE VIEW "SCOTT"."V_Manager_C3"

    AS

    SELECT * FROM "SCOTT"."BOOK"

    WITH CHECK OPTION;

     

     

    创建图书管理员的读者信息查询视图:

    CREATE FORCE VIEW "SCOTT"."V_Manager_C4"

    AS

    SELECT "LNO","RNAME","SEX","DEPT","SPEC","GRADE","BORNUM" FROM "SCOTT"."READER"

    WITH READ ONLY;

     

    4.索引设计

    设计思想

    建立一些索引可以用来加速对数据的检索。其实类似于图书前面的目录,你在一本书中找内容时会很耽误时间,所以一般会先看目录,找到感兴趣的条目,而那个条目上是指明内容在那一页的(内容所在的地址),然后就可以迅速找到需要的内容了。

     

    具体实现

    1. 在图书表的书名、出版社、作者、价格列是分别创建非唯一索引。

    CREATE INDEX index_1

    ON "SCOTT"."BOOK"("BNAME","PRESS","AUTHOR","PRICE");

     

    1. 在读者表的读者姓名、所在系部、就读专业列是分别创建非唯一索引。

    CREATE INDEX index_2

    ON "SCOTT"."READER"("RNAME","DEPT","SPEC");

     

    1. 在读者表的借阅数量列上创建一个反键索引。

    CREATE INDEX index_3

    ON "SCOTT"."READER"("BORNUM") REVERSE;

     

    (4)在读者表的性别列上创建一个位图索引。

    CREATE BITMAP INDEX index_4

    ON "SCOTT"."READER"("SEX");

     

    5.存储过程和函数设计

    设计思想

    存储过程的作用相当于单个表的操作方法,暂且只针对单个表的操作,例如调用存储过程的时候传一个Dept的参数,然后输出满足这个条件的学号和姓名,实现上面功能只调用这个存储过程就行。

    函数的创建与存储过程的创建相似,不同之处在于,函数有一个显示的返回值。所以函数里面必须包含一个return语句,来指明函数的返回值,能限定函数返回值的类型,但是无法约束返回值的长度,精度,刻度等。最终也只有一个return背执行。

     

    具体实现

    建立查询读者信息的存储过程:

    当调用该存储过程是传一个Dept的参数,然后就能输出满足这个条件的学号和姓名,这样管理员就可以快速查找到对应学生的信息。

    CREATE OR REPLACE PROCEDURE procedure_1(

           p_Deptno "SCOTT"."READER"."DEPT"%TYPE)

         AS

           v_Lno "SCOTT"."READER"."LNO"%TYPE,

           v_Rname "SCOTT"."READER"."RNAME"%TYPE;

         BEGIN

           DBMS_OUTPUT.PUT_LINE('The reader you found is:');

           FOR v_Lno,v_Rname INTO ( SELECT "LNO","RNAME" INTO v_Lno,v_Rname

             FROM "SCOTT"."READER"

             WHERE "DEPT"=p_Deptno;)

             LOOP

               DBMS_OUTPUT.PUT_LINE(v_Lno||' '||v_Rname);

             END LOOP;

         EXCEPTION

           WHEN NO_DATA_FOUND

           THEN

             DBMS_OUTPUT.PUT_LINE('The reader you found is error!!');

         END procedure_1;

     

    建立查询图书信息的存储过程:

    当调用该存储过程是传一个Class的参数,然后就能输出满足这个条件的Isbn号和书名,这样图书管理员就可以快速查找到对应类型的图书信息。

     

    CREATE OR REPLACE PROCEDURE procedure_2(

           p_Class "SCOTT"."BOOK"."CLASS"%TYPE)

         AS

           v_Isbn "SCOTT"."BOOK"."ISBN"%TYPE,

           v_Bname "SCOTT"."BOOK"."BNAME"%TYPE;

         BEGIN

           DBMS_OUTPUT.PUT_LINE('The book you found is:');

           FOR v_Isbnv_Bname INTO ( SELECT "ISBN","BNAME" INTO v_Isbn,v_Bname

             FROM "SCOTT"."BOOK"

             WHERE "CLASS"=p_Class;)

             LOOP

               DBMS_OUTPUT.PUT_LINE(v_Isbn||' '||v_Bname);

             END LOOP;

         EXCEPTION

           WHEN NO_DATA_FOUND

           THEN

             DBMS_OUTPUT.PUT_LINE('The book you found is error!!');

         END procedure_2;

     

    函数的创建:

    创建根据学生的学号返回学生平均借书数量的函数:

    调用函数并输入学生的学号时,函数计算对应学生的平均借书数量并返回,这样可以大大减少图书管理员的工作量,方便管理员进行统计分析。

    CREATE OR REPLACE FUNCTION scott.dept_fun

    (v_lno scott.historylend.lno%TYPE,

    V_rname OUT scott.reader.rname%TYPE)

    Return number

    Is

      V_num NUMBER(4);

    BEGIN

      Select rname into v_rname from scott.historylend

    Where lno = v_lno;

      Select avg(bornum) into v_num from scott.lend join scott.historylend

    On scott.lend.isbn = scott.historylend.isbn

    Where scltt.reader.lno = v_lno;

    Return v_number

    End;

     

    6.触发器及包设计

    设计思想

    触发器的作用很广泛并且在数据库里面的作用也很关键,它的作用是主要实现某种功能(读者借阅量的限制,读者操作权限等等),可以有效的阻拦一些操作并给予相关的提示!也可以用于某些数字的自增或者自减。

    包的作用同存储过程差不多,差别在于存储过程只能在单个表中运用,而包却可以在整个库中调用,相当于其权限是很大的!包相当于一个程序里的函数,可以反复调用、灵活性极强,对表的操作也是比较方便与快捷的。

     

    具体实现

    建立一个触发器,当图书馆的库存量大于复本量时,提示错误,以防止图书管理员的误操作。

    CREATE OR REPLACE TRIGGER trigger_book

    BEFORE UPDATE ON "SCOTT"."BOOK"

    FOR EACH ROW

    WHEN("INVNUM">"COPYNUM") 

    BEGIN

      RAISE_APPLICATION_ERROR(-20001,'The copynumber is lower than collectionnumber!!');

    END trigger_book;

     

    建立一个触发器,当在借阅表中添加或删除借阅信息时,将读者表中对应读者的借书数量加1或者减1,以防止两者无法对应。

    CREATE OR REPLACE TRIGGER trigger_borrow

    AFTER INSERT OR DELETE ON "SCOTT"."LEND"

    DECLARE

      v_lno "SCOTT"."LEND"."LNO"%TYPE;

    BEGIN

      IF INSERTING THEN

        SELECT "LNO" INTO v_lno FROM "SCOTT"."READER" WHERE "LNO"=:NEW."LNO";

        UPDATE "SCOTT"."READER" SET "BORNUM"="BORNUM"+1 WHERE "LNO"=:NEW."LNO";

      ELSIF DELETING THEN

        SELECT "LNO" INTO v_lno FROM "SCOTT"."READER" WHERE "LNO"=:NEW."LNO";

        UPDATE "SCOTT"."READER" SET "BORNUM"="BORNUM"+1 WHERE "LNO"=:OLD."LNO";

      END IF;

    END trigger_borrow;    

     

     

     

    7.备份与恢复设计

    设计思想

    在对Oracle数据库进行备份与恢复设计时,要考虑发生故障后,利用已备份的数据或控制文件,重新建立一个完整的数据库。恢复可以是实例恢复或者是介质恢复,实例恢复是在当oracle实例出现失败后,oracle自动进行的恢复。而介质恢复则是在当存放数据库的介质出现故障时进行恢复。

     

    8.数据库安全设计

    设计思想

    数据库安全设计主要体现在为数据库建立用户,密码,以及不同等级用户的的权限!这样做就可以有效的让不同用户查阅的权限都在管理员的管理下,防止数据的改动和丢失!因此要访问数据库,用户必须指定有效的数据库用户账户,而且还要根据该用户账户的要求成功通过验证,每个数据库用户都有一个唯一的数据库账户。Oracle建议这样做是为了避免潜在的安全漏洞以及为特定的审计活动提供有意义的数据。

    在本次综合实验中,我主要创建了Reader和Manager两个角色,分别对应不同的权限,将读者用户加到Reader角色中,将图书管理员用户加到Manager角色中,这样就加强了对数据库的保护。另外,创建概要文件来描述如何使用系统的资源(主要是CPU资源)。将概要文件赋予某个数据库用户,在用户连接并访问数据库服务器时,系统就按照概要文件给他分配资源。

    最后,添加审计功能,审计权限的调用记录、用户的dml操作记录、查询操作记录,对行为异常的用户进行判断并警告。另外,用户都只能访问视图而不能直接访问表,这也是数据库安全设计的体现。

     

    具体实现

        创建学生用户:

    CREATE USER student1

    IDENTIFIED BY 123

    DEFAULT TABLESPACE USERS

    QUOTA 5M ON USERS

    PASSWORD EXPIRE;

     

    CREATE USER student2

    IDENTIFIED BY 123

    DEFAULT TABLESPACE USERS

    QUOTA 5M ON USERS

    PASSWORD EXPIRE;

     

    创建图书管理员用户:

    CREATE USER manager1

    IDENTIFIED BY 123

    DEFAULT TABLESPACE USERS

    QUOTA 5M ON USERS

    PASSWORD EXPIRE;

     

    创建角色:

    CREATE ROLE student

    NOT IDENTIFIED;

    CREATE ROLE manager

    NOT IDENTIFIED;

     

    将角色赋予用户:

    GRANT CONNECT,student TO student1;

    GRANT CONNECT,student TO student2;

    GRANT CONNECT,manager TO manager1;

     

    为角色赋予权限:

    GRANT SELECT ON "SCOTT"."V_Reader_C1" TO student;

    GRANT SELECT ON "SCOTT"."V_Reader_C2" TO student;

    GRANT CONNECT,RESOURCE,EXECUTE TO manager;

    GRANT SELECT,INSERT,DELETE,UPDATE ON "SCOTT"."V_Manager_C1" TO manager;

    GRANT SELECT,INSERT,DELETE,UPDATE ON "SCOTT"."V_Manager_C2" TO manager;

    GRANT SELECT,INSERT,DELETE,UPDATE ON "SCOTT"."V_Manager_C3" TO manager;

    GRANT SELECT,INSERT,DELETE,UPDATE ON "SCOTT"."V_Manager_C4" TO manager;

     

    展开全文
  • 数据库课程设计 有数据流图数据字典 有程序代码
  • 简单的图书借阅系统,改系统能实现基本的查询,删除,增加功能,包含模块:借书管理,还书管理,账号管理等基本功能。
  • 图书借阅管理系统数据库设计 图书借阅管理系统数据库设计
  • 数据库系统概论课程综合设计,内容丰富详细,格式规范整齐。运行环境为win7及以上,采用微软sqlserver2017版本。
  • 本学期的数据库实验的设计性实验。通过ODBC连接数据库。使用MFC提供的CDataBase(数据库)和Crecore(记录集类)访问数据库
  • 图书借阅系统课程设计的详细报告,需求分析,概念结构设计 逻辑结构设计 数据库物理设计 代码和界面设计
  • 大学本科毕业设计 基于jsp的图书借阅管理系统 数据库 sqlserver
  • 数据库基础与应用课程设计是计算机专业集中实践性环节之一,是学习完《数据库系统概论》课程后进行的一次全面的综合练习。其目的在于加深对数据库基础理论和基本知识的理解,掌握使用VB进行数据库开发的全过程,提高...
  • 图书借阅管理系统

    2012-04-26 10:42:25
    图书借阅管理系统设计,C#语言开发,后台数据库
  • 这是手写的一个jsp课程设计-图书借阅管理系统。是基于jsp+serverlet+mysql数据库实现的,里面有详细的源码和mysql数据库,另外还进行了一些前端的美化,适合于大学生的jsp课程设计
  • 本次课程设计的题目是《图书借阅管理系统设计与实现》 通过设计一个管理信息系统,考察学生运用所学知识的能力,针对相关的课程:计算机语言、数据库原理等的检验;还有助于提高学生的实践能力、综合应用能力,为...
  • 图书借阅管理系统的本科毕业设计,VS2008平台上用c#语言开发,使用SQL SERVER 2005数据库
  • 这是用java写的一个图书管理系统 分为读者信息管理、借阅管理、还书管理、借阅信息查询等模块 用的数据库是MYSQL
  • 为方便对图书馆书籍、读者资料、借书、还书等进行高效的管理,特设计编写该程序以提高图书馆的管理效率。使用该程序之后,工作...还可以对当前图书借阅情况进行一些统计,给出统计表格,以便全面掌握图书的流通情况。
  • 系统是运用VF数据库软件开发的一套用来对图书馆图书借阅进行数字化管理工作的数据库系统,经过对本校图书馆图书借阅系统的仔细研究分析,我决定将此系统分为三大部分,分别为读者信息管理,图书信息管理,图书信息...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 543
精华内容 217
关键字:

数据库图书借阅管理系统设计