七天掌握SQL--->第七天:项目实践与总结

一、项目实践

1.1 项目背景

假设我们正在开发一个名为“在线图书管理系统”的项目。该项目旨在帮助图书馆管理员管理图书的借阅、归还、库存等操作,同时为读者提供一个便捷的图书查询和借阅平台。

1.2 数据库设计

1.2.1 需求分析

根据项目的需求,我们需要设计以下几个实体:

  • 读者(Reader):包括读者ID、姓名、性别、年龄、联系方式等字段。
  • 图书(Book):包括图书ID、书名、作者、出版社、ISBN、库存数量等字段。
  • 借阅记录(BorrowRecord):包括借阅ID、读者ID、图书ID、借阅日期、归还日期等字段。
1.2.2 E-R图

根据需求分析,我们可以绘制出如下的E-R图:

实体属性
读者(Reader)读者ID(PK)、姓名、性别、年龄、联系方式
图书(Book)图书ID(PK)、书名、作者、出版社、ISBN、库存数量
借阅记录(BorrowRecord)借阅ID(PK)、读者ID(FK)、图书ID(FK)、借阅日期、归还日期

其中,PK表示主键,FK表示外键。

1.2.3 数据库表结构

根据E-R图,我们可以设计出如下的数据库表结构:

Reader表:

字段名称数据类型约束条件
ReaderIDINTPRIMARY KEY
NameVARCHARNOT NULL
GenderCHAR(1)NOT NULL
AgeINTNOT NULL
ContactVARCHARNOT NULL

Book表:

字段名称数据类型约束条件
BookIDINTPRIMARY KEY
TitleVARCHARNOT NULL
AuthorVARCHARNOT NULL
PublisherVARCHARNOT NULL
ISBNVARCHARUNIQUE
StockINTNOT NULL

BorrowRecord表:

字段名称数据类型约束条件
BorrowIDINTPRIMARY KEY
ReaderIDINTFOREIGN KEY REFERENCES Reader(ReaderID)
BookIDINTFOREIGN KEY REFERENCES Book(BookID)
BorrowDateDATENOT NULL
ReturnDateDATENULL

1.3 SQL查询实践

1.3.1 创建数据库和表

首先,我们需要创建数据库和表:

CREATE DATABASE LibraryManagement;USE LibraryManagement;CREATE TABLE Reader (ReaderID INT PRIMARY KEY,Name VARCHAR(100) NOT NULL,Gender CHAR(1) NOT NULL,Age INT NOT NULL,Contact VARCHAR(100) NOT NULL
);CREATE TABLE Book (BookID INT PRIMARY KEY,Title VARCHAR(200) NOT NULL,Author VARCHAR(100) NOT NULL,Publisher VARCHAR(100) NOT NULL,ISBN VARCHAR(20) UNIQUE,Stock INT NOT NULL
);CREATE TABLE BorrowRecord (BorrowID INT PRIMARY KEY,ReaderID INT,BookID INT,BorrowDate DATE NOT NULL,ReturnDate DATE NULL,FOREIGN KEY (ReaderID) REFERENCES Reader(ReaderID),FOREIGN KEY (BookID) REFERENCES Book(BookID)
);

1.3.2 插入数据

接下来,我们向表中插入一些数据:

-- 插入读者数据
INSERT INTO Reader (ReaderID, Name, Gender, Age, Contact) VALUES
(1, '张三', '男', 25, '12345678901'),
(2, '李四', '女', 30, '09876543210');-- 插入图书数据
INSERT INTO Book (BookID, Title, Author, Publisher, ISBN, Stock) VALUES
(1, 'SQL必知必会', 'Ben Forta', '人民邮电出版社', '9787115430547', 10),
(2, 'Java编程思想', 'Bruce Eckel', '机械工业出版社', '9787111544303', 5);-- 插入借阅记录数据
INSERT INTO BorrowRecord (BorrowID, ReaderID, BookID, BorrowDate, ReturnDate) VALUES
(1, 1, 1, '2023-10-01', NULL),
(2, 2, 2, '2023-10-02', '2023-10-05');
1.3.3 查询数据
  • 查询所有读者信息:
SELECT * FROM Reader;
  • 查询库存数量大于5的图书信息:
SELECT * FROM Book WHERE Stock > 5;
  • 查询张三借阅的图书信息:
SELECT b.Title
FROM BorrowRecord br
JOIN Book b ON br.BookID = b.BookID
WHERE br.ReaderID = (SELECT ReaderID FROM Reader WHERE Name = '张三');
  • 查询未归还的借阅记录:
SELECT * FROM BorrowRecord WHERE ReturnDate IS NULL;

1.3.4 更新数据
  • 更新图书《SQL必知必会》的库存数量:
UPDATE Book SET Stock = Stock - 1 WHERE BookID = 1;
  • 更新读者张三的联系方式:
UPDATE Reader SET Contact = '11122233344' WHERE Name = '张三';

 1.3.5 删除数据

  • 删除读者李四的借阅记录:
DELETE FROM BorrowRecord WHERE ReaderID = 2;

  • 删除库存数量为0的图书:
DELETE FROM Book WHERE Stock = 0;

1.4 事务处理

在图书管理系统中,借阅和归还操作需要保证数据的一致性,因此我们需要使用事务来处理这些操作。

1.4.1 借阅操作

借阅操作需要同时更新图书的库存数量和插入借阅记录,我们可以使用事务来保证这两个操作要么都成功,要么都失败。

START TRANSACTION;-- 更新图书库存数量
UPDATE Book SET Stock = Stock - 1 WHERE BookID = 1;-- 插入借阅记录
INSERT INTO BorrowRecord (BorrowID, ReaderID, BookID, BorrowDate, ReturnDate) VALUES (3, 1, 1, '2023-10-10', NULL);-- 提交事务
COMMIT;
如果在执行过程中发生错误,我们可以使用ROLLBACK来回滚事务:
START TRANSACTION;-- 更新图书库存数量(假设图书ID不存在,会报错)
UPDATE Book SET Stock = Stock - 1 WHERE BookID = 999;-- 插入借阅记录(由于前面的语句报错,此语句不会执行)
INSERT INTO BorrowRecord (BorrowID, ReaderID, BookID, BorrowDate, ReturnDate) VALUES (4, 1, 1, '2023-10-11', NULL);-- 回滚事务
ROLLBACK;
1.4.2 归还操作

归还操作需要同时更新借阅记录的归还日期和图书的库存数量,同样可以使用事务来处理。

START TRANSACTION;-- 更新借阅记录的归还日期
UPDATE BorrowRecord SET ReturnDate = '2023-10-15' WHERE BorrowID = 1;-- 更新图书库存数量
UPDATE Book SET Stock = Stock + 1 WHERE BookID = 1;-- 提交事务
COMMIT;

  创作不易,感谢打赏

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

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

相关文章

【C++】IO库(三):string流

8.3 string 流 sstream 头文件定义了三个类型来支持内存 IO,这些类型可以向 string 写入数据,也可以从 string 读取数据,就像 string 是一个 IO 流一样。 istringstream 从 string 读数据;ostringstream 向 string 写入数据&…

React Hooks中use的细节

文档 useState useState如果是以函数作为参数,那要求是一个纯函数,不接受任何参数,同时需要一个任意类型的返回值作为初始值。 useState可以传入任何类型的参数作为初始值,当以一个函数作为参数进行传入的时候需要注意&#xff…

springboot 配置跨域访问

什么是 CORS? CORS,全称是“跨源资源共享”(Cross-Origin Resource Sharing),是一种Web应用程序的安全机制,用于控制不同源的资源之间的交互。 在Web应用程序中,CORS定义了一种机制&#xff0…

应用于蛋白-小分子柔性对接的等变VAE模型 - FlexPose 测评

FlexPose 应用于蛋白-小分子柔性对接场景下,能够在欧几里得空间中直接对蛋白-小分子复合结构的进行预测的等变神经网络模型,而无需传统的采样和评分策略。此模型考虑了蛋白氨基酸主链和侧链的柔性,会根据小分子的情况对氨基酸的侧链和主链进行…

【Web前端】如何构建简单HTML表单?

HTML 表单是 Web 开发中非常重要的组成部分。它们是与用户交互的主要方式,能够收集用户输入的数据。表单的灵活性使它们成为 HTML 中最复杂的结构之一,但若使用正确的结构和元素,可以确保其可用性和无障碍性。 表单的基本结构 HTML 表单使用…

Spring Boot英语知识分享网站:技术与实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

乌班图单机(不访问外网)部署docker和服务的方法

面向对象:Ubuntu不能访问外网的机子,部署mysql、redis、jdk8、minio 过程: 1、安装docker(照着图去这里找对应的下载下来https://download.docker.com/linux/static/stable/),将7个docker官网下载的文件下载下来后,传上去服务器随便一个文件夹或者常用的opt或者/usr/lo…

IDEA全局设置-解决maven加载过慢的问题

一、IDEA全局设置 注意:如果不是全局设置,仅仅针对某个项目有效;例在利用网上教程解决maven加载过慢的问题时,按步骤设置却得不到解决,原因就是没有在全局设置。 1.如何进行全局设置 a.在项目页面,点击f…

狂野飙车8+(Asphalt 8+) for Mac 赛车竞速游戏 安装教程

Mac分享吧 文章目录 狂野飙车8(Asphalt 8) for Mac 赛车竞速游戏软件 效果图展示一、狂野飙车8(Asphalt 8) 赛车竞速游戏 Mac电脑版——v2.1.11️⃣:下载软件2️⃣:安装软件2.1 左侧安装包拖入右侧文件夹中,等待安装完成,运行软件…

标贝科技:自动驾驶中的数据标注类别分享

国内的自动驾驶行业正处于快速发展阶段。伴随随着芯片算力的提升、算法的优化以及数据采集标注传感设备的日益成熟,自动驾驶技术正逐步从实验室转向商业化应用。电车时代的来临,加速了自动驾驶时代的全面降临,23年国内汽车行业内卷的开始&…

(详细文档!)java swing学生信息管理系统 +mysql

第一章:系统功能分析 1.1、系统简介与开发背景 学生信息管理系统是在信息化时代,特别是在教育领域中产生的。随着学校规模的不断扩大和信息化技术的不断发展,传统的纸质档案管理方式已经无法满足学校对学生信息管理的需求,因此需…

JVM逃逸分析机制

JVM逃逸分析机制 简单来说,逃逸分析是分析了对象是否只在当前函数范围内使用,来确定是否在栈上进行分配,主要涉及到栈是函数运行完,立即清理的,所以不需要等到gc了,为了大大缓解了gc的压力。 一、定义 JVM…

【Petri网导论学习笔记】Petri网导论入门学习(十) —— 3.2 关联矩阵与状态方程

目录 3.2 关联矩阵与状态方程定义 3.3 关联矩阵引理 3.4引理 3.5定理 3.4例 3.7例 3.83.2 关联矩阵与状态方程 正如 Petri 网的一个标识可以表示成一个 $ m $ 维非负整数向量一样,Petri 网的结构也可以用一个矩阵来表示。这样,就可以引入线性代数的方法对 Petri 网的性质进行…

微信小程序常用全局配置项及窗口组成部分详解

微信小程序常用全局配置项及窗口组成部分详解 引言 微信小程序作为一种新兴的应用形态,凭借其轻量级、便捷性和丰富的功能,已成为开发者和用户的热门选择。在开发小程序的过程中,了解全局配置项和窗口组成部分是至关重要的。本文将详细介绍微信小程序的常用全局配置项及窗…

【H2O2|全栈】Node.js(1)

目录 前言 开篇语 准备工作 ES6导入导出 导入 有名导出 匿名导出 Node概念 Node导入导出 导入 有名导出 匿名导出 Node常用模块 path模块 和路径有关的全局变量 常见方法 导入方法 fs模块 常见方法 导入方法 结束语 前言 开篇语 本系列博客主要分享Java…

matlab -炉温串级控制PID

1、内容简介 略 92-可以交流、咨询、答疑 2、内容说明 略 基于PID的反馈控制能够使得炉温控制达到较好的控制效果,但系统的调节时间还是较长,一般都大于20分钟。考虑能否用其他系统来改进控制系统使得调节时间变短的同时还能满足控制要求。一种最直接…

#渗透测试#红蓝攻防#HW#经验分享#溯源反制

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅 目录 一、溯源反制 1、溯源反制的重要性 2、溯源…

java——SpringBoot中常用注解及其底层原理

SpringBoot中的注解是简化配置、自动装配组件和实现声明式服务的关键。以下是对SpringBoot中常用注解及其底层原理的详细解析: 常用注解 SpringBootApplication 标注在主程序类上,表示这是一个Spring Boot应用的入口。它是一个复合注解,包括…

redis-cluster集群搭建

集群节点信息 192.168.222.131:46379 主要节点1 192.168.222.131:46380 从节点1 192.168.222.131:46381 从节点2192.168.222.132:46379 主要节点2 192.168.222.132:46380 从节点1 192.168.222.132:46381 从节点2192.168.222.133:46379 主要节点3 192.168.222.133:46380 从节点…

探索Python WebSocket新境界:picows库揭秘

文章目录 探索Python WebSocket新境界:picows库揭秘第一部分:背景介绍第二部分:picows库概述第三部分:安装picows库第四部分:简单库函数使用方法第五部分:场景应用第六部分:常见Bug及解决方案第…