【MySql】实验十六 综合练习:图书管理系统数据库结构

文章目录

  • 创建图书管理系统数据库结构
    • 一、创建数据表
      • 1.1 book表
      • 1.2 reader表
      • 1.3 borrow表
    • 二、插入示例数据
      • 2.1 向book表插入数据
      • 2.2 向reader表插入数据
      • 2.3 向borrow表插入数据
    • 三、查询操作
      • 3.1 根据语义为借书表borrow的bno列和 rno列建立外键
      • 3.2 查询张小海编写的“数据库原理”的出版日期。
      • 3.3 查询“操作系统”的所有借书记录。
      • 3.4 查询图书表的所有记录,按出版社和出版日期排序。
      • 3.5 查询每个读者借书的次数。
      • 3.6 查询没有被任何人借过的图书的图书编号、图书名称、作者。
    • 四、视图和索引
      • 4.1 建立视图bookview
      • 4.2 在图书表 book 的出版日期列上建立索引
      • 4.2 继承book创建tbook表信息插入
      • 4.3 删除tbook表
    • 五、存储过程和触发器
      • 5.1 创建存储过程bookproc
      • 5.2 执行存储过程bookproc
      • 5.3 创建触发器newtrigger
    • 六、自定义函数
      • 6.1 创建自定义函数borrowcount
    • 七、数据库备份
      • 7.1 备份数据库


创建图书管理系统数据库结构

在本篇博客中,我们将一步步创建一个简单的图书管理系统数据库。我们将定义三个主要的数据表:book(图书信息)、reader(读者信息)和borrow(借书记录)。下面是每个表的详细结构。

一、创建数据表

1.1 book表

存储图书信息的表。

列名数据类型是否可为空主键
bnoachar(4)
bnamechar(20)
authorchar(10)
publishchar(20)
pubdatedatetime
-- 创建book表
CREATE TABLE book(bnoa char(4) NOT NULL PRIMARY KEY,  -- 图书编号,主键,不允许为空bname char(20) NOT NULL,             -- 图书名称,不允许为空author char(10) NOT NULL,            -- 作者,不允许为空publish char(20) NOT NULL,           -- 出版社,不允许为空pubdate datetime NOT NULL            -- 出版日期,不允许为空
);

1.2 reader表

存储读者信息的表。

列名数据类型是否可为空主键
rnochar(4)
rnamechar(10)
-- 创建reader表
CREATE TABLE reader(rno char(4) NOT NULL PRIMARY KEY,  -- 读者编号,主键,不允许为空rname char(10) NOT NULL             -- 读者姓名,不允许为空
);

1.3 borrow表

存储借书记录的表。

列名数据类型是否可为空主键
borrownoint
bnochar(4)
rnochar(4)
borrowdatedatetime
-- 创建borrow表
CREATE TABLE borrow(borrowno int PRIMARY KEY,           -- 借书记录编号,主键,不允许为空bno char(4),                        -- 图书编号,可以为空rno char(4),                        -- 读者编号,可以为空borrowdate datetime                 -- 借书日期,可以为空
);

二、插入示例数据

2.1 向book表插入数据

-- 向book表插入数据
INSERT into book(bnoa,bname,author,publish,pubdate)
VALUES 
(0001,"数据库原理","张小海","人民邮电出版社","2020-10-01"),
(0002,"软件工程","李莎莎","高等教育出版社","2020-08-09"),
(0003,"操作系统","钱东升","人民邮电出版社","2021-03-06"),
(0004,"数据结构","鲁明浩","清华大学出版社","2021-05-28"),
(0005,"编译原理","张悦","高等教育出版社","2021-10-30");

2.2 向reader表插入数据

-- 向reader表插入数据
insert into reader(rno,rname)
VALUES
("0001","全志忠"),
("0002","孙佳佳"),
("0003","司马精");

2.3 向borrow表插入数据

-- 向borrow表插入数据
insert into borrow
VALUES
("1","0001","0001","2021-11-15"),
("2","0002","0001","2021-11-20"),
("3","0002","0002","2021-11-30"),
("4","0003","0002","2021-12-05"),
("5","0003","0001","2021-12-12"),
("6","0004","0001","2021-12-21");

三、查询操作

3.1 根据语义为借书表borrow的bno列和 rno列建立外键

alter table borrow add FOREIGN KEY (bno)  REFERENCES book(bnoa); 
alter table borrow add FOREIGN KEY (rno)  REFERENCES reader(rno);

3.2 查询张小海编写的“数据库原理”的出版日期。

-- 查询张小海编写的“数据库原理”的出版日期
select pubdate
FROM book
where author="张小海" AND bname="数据库原理";

在这里插入图片描述
在这里插入图片描述

3.3 查询“操作系统”的所有借书记录。

-- 查询“操作系统”的所有借书记录
select *
from book b,borrow bo,reader r
where b.bnoa=bo.bno and bo.rno=r.rno
and b.bname="操作系统";

在这里插入图片描述

3.4 查询图书表的所有记录,按出版社和出版日期排序。

查询图书表的所有记录,查询结果按出版社和出版日期排序,出版社的排序条件为降序,出版日期的排序条件为升序。

-- 查询图书表的所有记录,按出版社和出版日期排序
SELECT *
FROM book
ORDER BY publish DESC, pubdate ASC;

在这里插入图片描述

3.5 查询每个读者借书的次数。

查询每个读者借书的次数,查询结果由“读者编号”和“借书次数”两列组成。

-- 查询每个读者借书的次数
select r.rno as "读者编号",COUNT(bw.borrowno) as "借书次数"
FROM reader r
left join borrow bw on r.rno=bw.rno
GROUP BY r.rno;

在这里插入图片描述

3.6 查询没有被任何人借过的图书的图书编号、图书名称、作者。

-- 查询没有被任何人借过的图书的图书编号、图书名称、作者
select b.bnoa,b.bname,b.author
from book b
LEFT JOIN borrow bw on b.bnoa =bw.bno
where bw.bno is NULL;

在这里插入图片描述

四、视图和索引

4.1 建立视图bookview

建立新的名为bookview的视图,该视图检索“人民邮电出版社”出版的所有图书的图书名称、作者和出版日期。

-- 建立视图bookview
CREATE VIEW bookview as
select bname,author,pubdate
FROM book
where publish="人民邮电出版社";

在这里插入图片描述

4.2 在图书表 book 的出版日期列上建立索引

在图书表 book 的出版日期列上建立名为pubdatcindex的普通索引,要求该索引采取降序排列。

-- 在图书表 book 的出版日期列上建立索引
CREATE INDEX pubdatcindex ON book (pubdate DESC);

4.2 继承book创建tbook表信息插入

建立新的名为tbook 的表,该表的结构与 book表完全一样,利用一个INSERT语句将“人民邮电出版社”出版的所有图书信息插人入book表中。

-- 建立tbook表格 继承 book
CREATE table tbook like book;

在这里插入图片描述

  • 将“人民邮电出版社”出版的所有图书信息插人tbook表中。
INSERT INTO tbook
SELECT *
FROM book
WHERE publish = '人民邮电出版社';

在这里插入图片描述
在这里插入图片描述

4.3 删除tbook表

12)删除第(11)步建立的表tbook。DROP TABLE tbook;

五、存储过程和触发器

5.1 创建存储过程bookproc

创建拥有一个参数的bookproc()存储过程,用来查询图书表中由该参数指定作者的所有图书的图书名称、出版社和出版日期,然后执行该存储过程,并将输入参数赋值“张小海”。

-- 创建存储过程bookproc
DELIMITER //
CREATE PROCEDURE bookproc(IN authorName char(10))
BEGINSELECT bname, publish, pubdateFROM bookWHERE author = authorName;
END //
DELIMITER ;

在这里插入图片描述

5.2 执行存储过程bookproc

-- 执行存储过程bookproc
CALL bookproc("张小海");

在这里插入图片描述

5.3 创建触发器newtrigger

建立名为newtrigger的触发器,触发器规定,当删除读者表中的一条记录时将借书表中相应读者的借书记录一并删除,然后删除读者表中的一条记录以触发触发器。

-- 创建触发器newtrigger
DELIMITER //
CREATE TRIGGER newtrigger AFTER DELETE ON reader
FOR EACH ROW
BEGINDELETE FROM borrow WHERE rno = OLD.rno;
END //
DELIMITER ;

在这里插入图片描述

六、自定义函数

6.1 创建自定义函数borrowcount

建立borrowcount(自定义函数,该函数用于输人读者的编号以返回该读者的借书次数,如果编号不存在则返回-1。

-- 创建自定义函数borrowcount
DELIMITER //
CREATE FUNCTION borrowcount(rno char(4))
RETURNS int
BEGINDECLARE borrowCount int;SELECT COUNT(*) INTO borrowCount FROM borrow WHERE rno = rno;IF borrowCount IS NULL THENSET borrowCount = -1;END IF;RETURN borrowCount;
END //
DELIMITER ;

在这里插入图片描述

七、数据库备份

7.1 备份数据库

-- 备份数据库
mysqldump -u username -p Book > D:/bookbackup.sql

请注意,以上备份命令需要在MySQL命令行中执行,并且您需要将username替换为您的MySQL用户名。此命令会将整个Book数据库备份到D盘根目录下的bookbackup.sql文件中。

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

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

相关文章

AutoDL部署视觉大模型llama3.2-vision,从视频中寻找特定目标

注: windows11系统。示例为此项目:https://github.com/win4r/VideoFinder-Llama3.2-vision-Ollama 在当今的人工智能领域,深度学习模型的计算需求日益增长,特别是在处理复杂的视觉任务时,强大的算力往往是实现高效应用…

SHELL笔记(条件测试)

基本概念: 条件测试用于在 Shell 脚本中对各种条件进行判断,根据判断结果来决定是否执行特定的命令或代码块。条件测试可以用于比较数值、字符串,检查文件或目录的属性,以及判断命令的执行结果等。 格式: 格式1&…

JDK、MAVEN与IDEA的安装与配置

1.认识JDK、MAVEN与IDEA JDK 提供了编译和运行Java程序的基本环境。Maven 帮助管理项目的构建和依赖。IDEA 提供了一个强大的开发环境,使得编写、调试和运行Java程序更加高效。 2. 安装与环境配置 2.1 官网地址 选择你需要的版本下载: MAVEN下载传送…

微信小程序-prettier 格式化

一.安装prettier插件 二.配置开发者工具的设置 配置如下代码在setting.json里: "editor.formatOnSave": true,"editor.defaultFormatter": "esbenp.prettier-vscode","prettier.documentSelectors": ["**/*.wxml"…

【Mac】未能完成该操作 Unable to locate a Java Runtime

重生之我做完产品经理之后回来学习Data Mining Mac打开weka.jar报错"未能完成该操作 Unable to locate a Java Runtime" 1. 打开终端执行 java -version 指令,原来是没安装 JDK 环境 yyzccnn-mac ~ % java -version The operation couldn’t be comple…

【ArcGIS微课1000例】0127:计算城市之间的距离

本文讲述,在ArcGIS中,计算城市(以地级城市为例)之间的距离,效果如下图所示: 一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析…

【WPF】Prism学习(五)

Prism Commands 1.错误处理(Error Handling) Prism 9 为所有的命令(包含AsyncDelegateCommand)提供了更好的错误处理。 避免用try/catch包装每一个方法根据不同遇到的异常类型来提供特定的逻辑处理可以在多个命令之间共享错误处…

【element-tiptap】Tiptap编辑器核心概念----结构篇

core-concepts 前言:这篇文章来介绍一下 Tiptap 编辑器的一些核心概念 (一)结构 1、 Schemas 定义文档组成方式。一个文档就是标题、段落以及其他的节点组成的一棵树。 每一个 ProseMirror 的文档都有一个与之相关联的 schema,…

2024.6使用 UMLS 集成的基于 CNN 的文本索引增强医学图像检索

Enhancing Medical Image Retrieval with UMLS-Integrated CNN-Based Text Indexing 问题 医疗图像检索中,图像与相关文本的一致性问题,如患者有病症但影像可能无明显异常,影响图像检索系统准确性。传统的基于文本的医学图像检索&#xff0…

初识Linux · 信号处理 · 续

目录 前言: 可重入函数 重谈进程等待和优化 前言: 在前文,我们已经介绍了信号产生,信号保存,信号处理的主题内容,本文作为信号处理的续篇,主要是介绍一些不那么重要的内容,第一个…

微信小程序 最新获取用户头像以及用户名

一.在小程序改版为了安全起见 使用用户填写来获取头像以及用户名 二.代码实现 <view class"login_box"><!-- 头像 --><view class"avator_box"><button wx:if"{{ !userInfo.avatarUrl }}" class"avatorbtn" op…

WPF MVVM框架

一、MVVM简介 MVC Model View Control MVP MVVM即Model-View-ViewModel&#xff0c;MVVM模式与MVP&#xff08;Model-View-Presenter&#xff09;模式相似&#xff0c;主要目的是分离视图&#xff08;View&#xff09;和模型&#xff08;Model&#xff09;&#xff0c;具有低…

【算法】【优选算法】前缀和(下)

目录 一、560.和为K的⼦数组1.1 前缀和1.2 暴力枚举 二、974.和可被K整除的⼦数组2.1 前缀和2.2 暴力枚举 三、525.连续数组3.1 前缀和3.2 暴力枚举 四、1314.矩阵区域和4.1 前缀和4.2 暴力枚举 一、560.和为K的⼦数组 题目链接&#xff1a;560.和为K的⼦数组 题目描述&#x…

两大新兴开发语言大比拼:Move PK Rust

了解 Move 和 Rust 的差异有助于开发者根据项目的具体需求选择最合适的语言。选择不恰当的语言可能会导致项目后期出现技术债务。不同语言有其独特的优势。了解 Move 和 Rust 的差异可以帮助开发者拓展技术视野&#xff0c;发现不同语言在不同领域的应用潜力。 咱们直奔主题&a…

Scaling Law的“终结“还是新起点?——开源实践者的深度思考

作者&#xff1a;宋大宝&#xff0c;与大宝同学因那篇《回顾总结展望「融合RL与LLM思想&#xff0c;探寻世界模型以迈向AGI」》结识于今年春天&#xff0c;虽我们当时某些思想观念有些出入&#xff0c;也碰撞出了很多火花与共鸣&#xff0c;并持续地相互启发的走到了现在。他是…

“fc-async”提供了基本的异步处理能力

在开发中,异步处理已经成为提升系统性能和用户体验的常用方式。然而,传统的@Async注解和基础的异步处理工具在面对复杂的任务场景时,存在局限性。这些局限性包括但不限于高并发环境下的稳定性、任务失败后的恢复机制、以及任务的监控和管理。 开源项目“fc-async”提供了基…

Ubuntu 的 ROS 操作系统 turtlebot3 导航仿真

引言 导航仿真是机器人自动化系统中不可或缺的一部分&#xff0c;能够帮助开发者在虚拟环境中测试机器人在复杂场景下的运动与路径规划。 在 Gazebo 仿真环境中&#xff0c;TurtleBot3 配合 ROS 操作系统提供了强大的导航功能。在进行导航仿真时&#xff0c;首先需要准备地图&…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析

前提&#xff1a; 注意的是&#xff1a;我们这里是从avframe转换成avpacket 后&#xff0c;从avpacket中查看NALU。 在实际开发中&#xff0c;我们有可能是从摄像头中拿到 RGB 或者 PCM&#xff0c;然后将pcm打包成avframe&#xff0c;然后将avframe转换成avpacket&#xff0…

java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程

文章目录 PC Register堆虚拟机栈方法区(Metaspace元空间双亲委派机制类加载器 类装载的执行过程 PC Register 程序计数器&#xff08;Program Counter Register&#xff09;是 Java 虚拟机&#xff08;JVM&#xff09;中的一个组件&#xff0c;它在 JVM 的内存模型中扮演着非常…

使用Web Animations API实现复杂的网页动画效果

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Animations API实现复杂的网页动画效果 使用Web Animations API实现复杂的网页动画效果 使用Web Animations API实现复杂…