数据库实验二:图书信息管理系统数据查询与数据更新

实验项目名称:图书信息管理系统数据查询与数据更新

  • 实验目的与要求
  • 实验原理与内容
    • 1. 实验原理:
    • 2 . 实验内容:
    • 2. 数据查询
  • 实验设备与软件环境
  • 实验过程与结果
    • 1. 数据更新
      • 图书信息表t_book
      • 新增馆藏可借图书c_book
      • 借书证表t_libraryCard
      • 学生信息表t_student
      • 班级信息表t_class
      • 借阅信息表 t_borrow
      • 图书类别信息表 t_book_type
    • 1.2 添加数据
    • 1.3 删除数据
    • 2. 数据查询
      • 2.1单表查询
        • 1.查询所有图书的基本信息
        • 2.查询所有图书的编号、名称和价格
        • 3. 查询计算机系学生读者的借书证号、姓名和联系电话
        • 4. 查询学生借书证号为L0001且所借图书编号为B0003的借阅记录信息
        • 5. 查询t_borrow表未还书的记录(假设当前的日期是2023-10-20号)。要求:
        • 6. 查询借阅日期“2023-08-05”至“2023-9-21”的借书记录信息
        • 7. 查询与本人姓氏(如:学生林小娜)相同的学生读者(包括自己,姓林的)的基本信息;
      • 2.2对查询结果进行编辑
        • 1. 查询所有曾经借书学生的姓名和所在院系,输出结果的字段名是:姓名和所在院系。
        • 2. 查询借书证号为L0002的读者所借图书至今的天数总和。
        • 3. 查询借书证号为L0003的读者一共借了多少本书(同一本书多次续借的话,仅统计一次)。
        • 4. 查询所有图书信息,结果按价格的降序排列。
        • 5. 统计图书信息表中不同出版社的图书的数目,把统计结果大于或等于2的记录输出。
        • 6. 查询所有图书的库存总量。
        • 7. 输出借阅过期的借阅记录,并且输出的罚金翻倍。
        • 8. 持有L0002的读者已经缴纳了全部的罚金,请把对应借书记录的罚金更改为0,然后把续借的数量增加1,把过期记录的“是否过期”属性修改为“N”。
      • 2.3连接查询
        • 1. 采用等值连接的方式查询学生读者的学号、借书证号、姓名、联系电话以及所借书的图书编号,借阅日期。
        • 2. 采用内连接的方法查询图书信息以及对应图书类别的详细信息。
        • 3. 查询学生读者借书证号、姓名、班级以及所借图书的图书编号、借阅日期,没有借阅记录的学生也要输出。
        • 4. 查询借书信息表中读者的借书证号、图书编号、借阅日期以及所借图书在图书信息表中对应的出版社编号,图书信息表没有连接成功的记录也要输出。
        • 5. 查询在被罚款的同学的学号、姓名、电话、班级名称、借书证号、借书证发证日期、图书编号、图书名称、应还书日期、罚金数量。
        • 6. 查询读者的借书证号、姓名、联系电话、以及所借图书的图书编号、类别名称、借阅日期、出版社和~~编号~~ 。
        • 7. 利用查询语句与数据更新语句等实现每批次购进图书在馆数的修改。提示:在t_book中,用修改表语句增加在馆数量字段。
      • 2.4子查询
        • 1. 查询借阅了图书编号为B0001的图书的读者信息。
        • 2. 查询借阅了广东人民出版社和清华出版社的图书的读者信息。
        • 3. 查询还未归还图书的读者的借书证号、姓名、部门和联系电话(假设当前的日期是2022-10-20号,图书归还时候,一定要缴纳罚金)。
        • 4. 查询姓名为朱威读者的借阅记录。
        • 5. 查询跟徐广声借阅了相关图书的其他读者详细信息。
        • 6. 利用相关子查询邹思柔是否有借阅图书的记录,若有则输出借阅记录。
        • 7. 查询图书价格比所有图书平均价格高的图书信息。
        • 8. 查询图书价格比图书编号为B0002和B0003的价格都高的图书信息。
    • 2.4视图
      • 1.根据应用,请同学定义2张视图。第一个视图输出学生学号、姓名、电话号码、班级名称、系部名称。第二个视图输出罚金超过10元的学生学号、学生、电话号码、借书证、图书名字、借书日期、应还书日期及罚金。
      • ~~2.创建视图运用视图修改视图数据(与操作表一样,只是把table换成view)~~
        • ~~--1创建视图并修改字段的别名~~
        • ~~--2插入视图数据~~
        • ~~--3修改视图的数据值~~
        • ~~--4删除视图的行数据~~
  • 操作异常问题与解决方案
    • 问题1 : 被引用表中没有与外键...中的引用列表匹配的主键或候选键
    • 问题2:子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。

实验类型:综合性

实验目的与要求

  1. 掌握使用INSERT、UPDATE、DELETE语句向表中插入数据、修改和删除数据;
  2. 熟悉和掌握对数据表中数据的查询操作和SQL命令的使用;
  3. 能掌握各种查询方法,能通过查询获取对自己有用的数据,能对查询结果进行编辑;
  4. 理解不同类型的查询语句其执行原理及查询效率;
  5. 加深理解关系运算的各种操作(尤其是关系的选择,投影,连接和除运算);
  6. 理解视图概念、运用视图;
  7. 报告中,要有重要方法、讨论与思考过程等内容书写。

实验原理与内容

1. 实验原理:

1.1表的概念
表是数据的集合,是用来存储数据和操作数据的逻辑结构。和电子表格类似,数据在表中是按照行和列的格式来组织排列的,每一行代表一条唯一的记录,每一列代表一个属性。

1.2数据类型
常用的数据类型:整型、浮点型、货币类、日期和时间、字符类型(含Unicode字符串)、二进制类型等

1.3数据的完整性
数据完整性是指数据的正确性、一致性和安全性,它是衡量数据库中数据质量好坏的重要标准。当用户使用INSERT、DELETE或UPDATE语句修改数据库内容时,数据的完整性就可能会遭到破环。为此,SQL Sever提供了实施数据完整性的方法包括约束、规则等。数据的完整性大致分为四种类型:实体完整性:表中的每一行都能由主键的属性列来唯一标识,且不存在重复的数据行;域完整性:限制向表中输入值的范围,保证给定列的输入的有效性。可以通过限制数据类型,值域或数据格式实现;参照完整性:当一个表引用了另一个表中的某些数据时,要防止非法的数据更新,以保持表间数据的一致性;用户自定义完整性:体现实际运用的业务规则。

1.4 各种查询语句其执行原理及查询效率

1.5 视图作为一种数据库对象,可以让用户对数据源进行查询和修改。视图是SQL Sever中重要的数据库对象。视图常用于集中、简化和定制数据库中的数据信息,为用户从多角度观察数据库中的数据提供方便。

2 . 实验内容:

1. 数据更新
请使用SQL语句方法完成以下操作。
1.1建立数据库后,运行实验二提供的相关代码。每个学生根据下面提供的表结构,用SQL命令方式,给图书信息表添加本课程教材书籍。同时添加学生本人的班级和学生信息。

   图书信息表t_book
   
字段英文名称	列名	数据类型		字段约束	可否为空
Bid			图书编号	char(15)	主键	否
Tid			类别编号	char(10)	外键	否
BName		书名	varchar(50)			否
ISBN		标准书号	char(15)			否
BWriter		作者	varchar(50)			否
BCompany	出版社	varchar(20)			否
BDate		出版日期	date				否
BPrice		图书价格	Numeric(10,2)		否
BBrief		简介	varchar(100)		是
BNum		图书存量	tinyint		默认1
借书证表t_libraryCard

字段英文名称	列名			数据类型			字段约束		可否为空
LCardNo		借书证号			char(7)			主键		否
LName		借阅者			varchar(50)					否
IssueTime	发证日期			datetime					否
Available	是否有效			char(1)			默认‘Y’		否
BorrowNum	现借书数量		Numeric(2,0)	默认为0		否
MaxNum		最大允许借书数	Numeric(2,0)	默认为10
学生信息表t_student

字段英文名称	列名	数据类型		字段约束		可否为空
Sid			学号	char(11)	主键		否
LCardNo		借书证号	char(7)		外键		是
SName		姓名	varchar(50)				否
SPwd		密码	char(6)					否
SGender		性别	char(2)		男或者女		否
DoB			生日	date					否
STel		联系电话	varchar(15)				是
SClassID	所在班级	char(10)	外键		否
班级信息表t_class

字段英文名称	列名	数据类型		字段约束		可否为空
SClassID	班级编号	char(10)	主键		否
CName		班级名称	varchar(50)				否
MajorName	专业名称	varchar(50)				否
DName		所属系部	varchar(50)				否
EYear		入学学年	int
借阅信息表 t_borrow

字段英文名称	列名	数据类型		字段约束				可否为空
Book_id		图书编号	char(15)	联合主键,外键		否
LCardNo		借书证号	char(7)		联合主键,外键		否
BorrowDate	借阅日期	datetime	联合主键				否
ReturnDate	还书日期	datetime(讨论)
Overdue		是否逾期	char(1)		默认‘N’				否
RenewTimes	续借次数	tinyint		默认0(最大值讨论) 	否
Fine 		罚金	Numeric(10,2)	默认0
图书类别信息表 t_book_type

字段英文名称	列名	数据类型		字段约束		可否为空
Tid			类别编号	char(10)	主键		否
TName		类别名称	varchar(50)

1.2 在图书表里面的B0001的记录中,作者信息更改为“阿历克斯”,图书的价格为50.5元。修改学生信息,密码为Ab12@@,联系电话为,18812345688。
1.3 删除学生信息表中,上题修改学生的记录。

2. 数据查询

请针对以下业务的具体需求,对上述参考表及其数据做对应查询。
2.1 单表查询

  1. 查询所有图书的基本信息
  2. 查询所有图书的编号、名称和价格
  3. 查询计算机系学生读者的借书证号、姓名和联系电话
  4. 查询学生借书证号为L0001且所借图书编号为B0003的借阅记录信息
  5. 查询t_borrow表未还书的记录(假设当前的日期是2022-10-20号)。
  6. 查询借阅日期“1998-02-06”至“2021-12-06”的借书记录信息
  7. 查询姓徐的学生读者的基本信息

2.2对查询结果进行编辑

  1. 查询所有曾经借书学生的姓名和所在院系,输出结果的字段名是:姓名和所在院系。
  2. 查询借书证号为L0002的读者所借图书至今的天数总和。
  3. 查询借书证号为L0003的读者一共借了多少本书(同一本书多次续借的话,仅统计一次)。
  4. 查询所有图书信息,结果按价格的降序排列。
  5. 统计图书信息表中不同出版社的图书的数目,把统计结果大于或等于2的记录输出。
  6. 查询所有图书的库存总量。
  7. 输出借阅过期的借阅记录,并且输出的罚金翻倍。
  8. 持有L0002的读者已经缴纳了全部的罚金,请把对应借书记录的罚金更改为0,然后把续借的数量增加1,把过期记录的“是否过期”属性修改为“N”。

2.3连接查询
17. 采用等值连接的方式查询学生读者的学号、借书证号、姓名、联系电话以及所借书的图书编号,借阅日期。
18. 采用内连接的方法查询图书信息以及对应图书类别的详细信息。
19. 查询学生读者借书证号、姓名、班级以及所借图书的图书编号、借阅日期,没有借阅记录的学生也要输出。
20. 查询借书信息表中读者的借书证号、图书编号、借阅日期以及所借图书在图书信息表中对应的出版社编号,图书信息表没有连接成功的记录也要输出。
21. 查询在被罚款的同学的学号、姓名、电话、班级名称、借书证号、借书证发证日期、图书编号、图书名称、应还书日期、罚金数量。
22. 查询读者的借书证号、姓名、联系电话、以及所借图书的图书编号、类别名称、借阅日期、出版社和编号。

2.3子查询
23. 查询借阅了图书编号为B0001的图书的读者信息。
24. 查询借阅了广东人民出版社和清华出版社的图书的读者信息。
25. 查询还未归还图书的读者的借书证号、姓名、部门和联系电话(假设当前的日期是2022-10-20号,图书归还时候,一定要缴纳罚金)。
26. 查询姓名为朱威读者的借阅记录。
27. 查询跟徐广声借阅了相关图书的其他读者详细信息。
28. 利用相关子查询邹思柔是否有借阅图书的记录,若有则输出借阅记录。
29. 查询图书价格比所有图书平均价格高的图书信息。
30. 查询图书价格比图书编号为B0002和B0003的价格都高的图书信息。

2.4视图
1.根据应用,请同学定义2张视图。第一个视图输出学生学号、姓名、电话号码、班级名称、系部名称。第二个视图输出罚金超过10元的学生学号、学生、电话号码、借书证、图书名字、借书日期、应还书日期及罚金。
2.创建视图运用视图修改视图数据(与操作表一样,只是把table换成view)

实验设备与软件环境

1.Windows XP Professional SP3/Windows7/win10
2.SQL Server 2012/2019

实验过程与结果

(查询的代码和查询的结果,贴图放在每个题目的下面)

1. 数据更新

请使用SQL语句方法完成以下操作。
建表之前要求创建数据库:st_db

所有的表与视图要在自建的数据库中创建。
答:create database st_db;

–先判断,后删除,再创建

1.1建立数据库后,运行实验二提供的相关代码。每个学生根据下面提供的表结构,用SQL命令方式,给图书信息表添加本课程教材书籍。同时添加学生本人的班级和学生信息。
要求:以下所有表的字段要用英文名称,为了达到训练效果,首先在答题区直接输入代码(不要有注释),然后,选择复制后粘贴到客户端界面进行调试,最后,再把客户端调试完成的正确代码(要有注释)复制其后。

图书信息表t_book

   图书信息表t_book
   
字段英文名称	列名	数据类型		字段约束	可否为空
Bid			图书编号	char(15)	主键	否
Tid			类别编号	char(10)	外键	否
BName		书名	varchar(50)			否
ISBN		标准书号	char(15)			否
BWriter		作者	varchar(50)			否
BCompany	出版社	varchar(20)			否
BDate		出版日期	date				否
BPrice		图书价格	Numeric(10,2)		否
BBrief		简介	varchar(100)		是
BNum		图书存量	tinyint		默认1

要求:主键、外键在列约束条件定义,即定义类型同时定义。
答:--建表t_book
改进:(讨论)
语句:

create table t_book_type(
Tid			char(10)	PRIMARY KEY		NOT NULL,
TName		varchar(50)					NOT NULL,
);


create table t_book(
Bid			char(15)	PRIMARY KEY	NOT NULL,
Tid			char(10)	FOREIGN KEY REFERENCES t_book_type(Tid)	NOT NULL,
BName		varchar(50)				NOT NULL,
ISBN		char(15)				NOT NULL,
BWriter		varchar(50)				NOT NULL,
BCompany	varchar(20)				NOT NULL,
BDate		date					NOT NULL,
BPrice		Numeric(10,2)			NOT NULL,
BBrief		varchar(100)					,
BNum		tinyint		DEFAULT(1)	NOT NULL
);

通用:(添加了指定用户)

use st_db
go
create table t_book_type( -- 建立前置表格t_book_type
Tid			char(10)	PRIMARY KEY		NOT NULL,
TName		varchar(50)					NOT NULL,
);


create table t_book( --建立t_book
Bid			char(15)	PRIMARY KEY	NOT NULL, --设置主键
Tid			char(10)	FOREIGN KEY REFERENCES t_book_type(Tid)	NOT NULL, -- 建立外键
BName		varchar(50)				NOT NULL,
ISBN		char(15)				NOT NULL,
BWriter		varchar(50)				NOT NULL,
BCompany	varchar(20)				NOT NULL,
BDate		date					NOT NULL,
BPrice		Numeric(10,2)			NOT NULL,
BBrief		varchar(100)					,
BNum		tinyint		DEFAULT(1)	NOT NULL -- 设置默认值
);
go

新增馆藏可借图书c_book

 馆藏可借图书c_book
字段英文名称	列名		数据类型			字段约束		可否为空					备注
Bid			入库图书编号	char(15)		外键		否	
CBid		可借书号		Decimal(12,0)	主键(讨论)	否						自动增量
CBposition	位置		char(15)					否 默认:'A1-F01-1-1'	楼号-架号-层号-格号
CBstatus	状态		varchar(10)					否 默认“可借”			在借|丢失

要求讨论为什么要建此表。结合现实图书馆讨论读者所借阅的图书是什么样的?如何改进?

答:
原始表格创建语句:

use st_db
go
create table c_book(
Bid				char(15)		FOREIGN KEY  REFERENCES t_book(Bid)		NOT NULL,	
CBid			Decimal(12,0)	PRIMARY KEY								NOT NULL,						--自动增量
CBposition		char(15)												NOT NULL DEFAULT('A1-F01-1-1'),	--楼号-架号-层号-格号
CBstatus		varchar(10)												NOT NULL DEFAULT('可借')		--在借|丢失
);
go

改进1 : 添加自动增量,检查状态是否符合标准

use st_db
go
create table c_book(
Bid				char(15)		FOREIGN KEY  REFERENCES t_book(Bid)		NOT NULL,	
CBid			Decimal(12,0)	PRIMARY KEY								NOT NULL IDENTITY(1,1), --自动增量
CBposition		char(15)												NOT NULL DEFAULT('A1-F01-1-1'),	--楼号-架号-层号-格号
CBstatus		varchar(10)												NOT NULL DEFAULT('可借')		check(CBstatus = '可借' or CBstatus = '在借' or CBstatus = '丢失') -- 检查状态是否符合标准
);
go

改进2 : 将主键改为联合主键 (原因在后面操作异常问题与解决方案中问题一)

use st_db
go
create table c_book(
Bid				char(15)		FOREIGN KEY  REFERENCES t_book(Bid)		NOT NULL,	
CBid			Decimal(12,0)											NOT NULL IDENTITY(1,1), --自动增量
CBposition		char(15)												NOT NULL DEFAULT('A1-F01-1-1'),	--楼号-架号-层号-格号
CBstatus		varchar(10)												NOT NULL DEFAULT('可借')		check(CBstatus = '可借' or CBstatus = '在借' or CBstatus = '丢失') -- 检查状态是否符合标准
PRIMARY KEY(CBid,Bid);
);
go

借书证表t_libraryCard

借书证表t_libraryCard

字段英文名称	列名			数据类型			字段约束		可否为空
LCardNo		借书证号			char(7)			主键		否
LName		借阅者			varchar(50)					否
IssueTime	发证日期			datetime					否
Available	是否有效			char(1)			默认‘Y’		否
BorrowNum	现借书数量		Numeric(2,0)	默认为0		否
MaxNum		最大允许借书数	Numeric(2,0)	默认为10

答:

use st_db
go
create table t_libraryCard(
LCardNo			char(7)			PRIMARY KEY 	NOT NULL,
LName			varchar(50)						NOT NULL,
IssueTime		datetime						NOT NULL,
Available		char(1)			DEFAULT('Y')	NOT NULL,
BorrowNum		Numeric(2,0)	DEFAULT(0)		NOT NULL,
MaxNum			Numeric(2,0)	DEFAULT(10)		NOT NULL
);
go

学生信息表t_student

学生信息表t_student

字段英文名称	列名	数据类型		字段约束		可否为空
Sid			学号	char(11)	主键		否
LCardNo		借书证号	char(7)		外键		是
SName		姓名	varchar(50)				否
SPwd		密码	char(6)					否
SGender		性别	char(2)		男或者女		否
DoB			生日	date					否
STel		联系电话	varchar(15)				是
SClassID	所在班级	char(10)	外键		否

要求主键、外键用定义约束条件名形式定义
答:

use st_db
go

create table t_class( --前置表格
SClassID	char(10)	PRIMARY KEY		NOT NULL,
CName		varchar(50)					NOT NULL,
MajorName	varchar(50)					NOT NULL,
DName		varchar(50)					NOT NULL,
EYear		int							NOT NULL,
);

--create table t_libraryCard( -- 之前创建好的前置表格
--LCardNo			char(7)			PRIMARY KEY 	NOT NULL,
--LName			varchar(50)						NOT NULL,
--IssueTime		datetime						NOT NULL,
--Available		char(1)			DEFAULT('Y')	NOT NULL,
--BorrowNum		Numeric(2,0)	DEFAULT(0)		NOT NULL,
--MaxNum			Numeric(2,0)	DEFAULT(10)		NOT NULL
--);

create table t_student(
Sid				char(11)	CONSTRAINT PR_SID PRIMARY KEY 										NOT NULL, --约束条件名形式
LCardNo			char(7)		CONSTRAINT FR_LC  FOREIGN KEY  REFERENCES	t_libraryCard(LCardNo)			,--约束条件名形式
SName			varchar(50)																		NOT NULL,
SPwd			char(6)																			NOT NULL,
SGender			char(2)		CHECK(SGender = '男' or SGender = '女')								NOT NULL,
DoB				date																			NOT NULL,
STel			varchar(15)																				,
SClassID		char(10)	CONSTRAINT FR_SC FOREIGN KEY  REFERENCES	t_class	(SClassID)		NOT NULL,--约束条件名形式
);
go

约束条件名形式定义 语法:

CONSTRAINT <完整性约束条件名><完整性约束条件>

班级信息表t_class

班级信息表t_class

字段英文名称	列名	数据类型		字段约束		可否为空
SClassID	班级编号	char(10)	主键		否
CName		班级名称	varchar(50)				否
MajorName	专业名称	varchar(50)				否
DName		所属系部	varchar(50)				否
EYear		入学学年	int

要求主键定义用修改表形式定义。
答:

use st_db
go

drop table if exists t_class;

create table t_class( 
SClassID	char(10)			NOT NULL,
CName		varchar(50)			NOT NULL,
MajorName	varchar(50)			NOT NULL,
DName		varchar(50)			NOT NULL,
EYear		int					NOT NULL,
);
ALTER TABLE t_class ADD  CONSTRAINT  PE_SC PRIMARY KEY (SClassID);
go

借阅信息表 t_borrow

借阅信息表 t_borrow

字段英文名称	列名	数据类型		字段约束				可否为空
Book_id		图书编号	char(15)	联合主键,外键		否
LCardNo		借书证号	char(7)		联合主键,外键		否
BorrowDate	借阅日期	datetime	联合主键				否
ReturnDate	还书日期	datetime(讨论)
Overdue		是否逾期	char(1)		默认‘N’				否
RenewTimes	续借次数	tinyint		默认0(最大值讨论) 	否
Fine 		罚金	Numeric(10,2)	默认0

要求讨论ReturnDate字段是否可空的讨论。请注意:这里Book_id的类型以及引用的是哪个表中书号?
答:
–对ReturnDate是否可空的讨论

(1)可以,因为书本可能在被借阅状态,因此没有还书日期。
(2)不可以,我们可以定义最晚还书日期进行填充,如果提前还书再修改即可!

–对这里Book_id的类型以及引用的是哪个表中书号?

类型是char(15)
引用的是c_book中的Bid书号

语句:

use st_db
go
create table t_borrow(
Book_id			char(15)		FOREIGN KEY REFERENCES c_book(Bid)					NOT NULL,
LCardNo			char(7)			FOREIGN KEY REFERENCES t_libraryCard(LCardNo)		NOT NULL,
BorrowDate		datetime															NOT NULL,
ReturnDate		datetime															NOT NULL,
Overdue			char(1)			DEFAULT('N')										NOT NULL,
RenewTimes		tinyint			DEFAULT(0) check(RenewTimes <= 3) 					NOT NULL,
Fine 			Numeric(10,2)	DEFAULT(0)											NOT NULL,
PRIMARY KEY(Book_id,LCardNo,BorrowDate)
);
go

图书类别信息表 t_book_type

图书类别信息表 t_book_type

字段英文名称	列名	数据类型		字段约束		可否为空
Tid			类别编号	char(10)	主键		否
TName		类别名称	varchar(50)

答:(其实在定义图书信息表t_book的时候就已经将 图书类别信息表 t_book_type当成前置表格创建了 )

use st_db
go
create table t_book_type(
Tid		char(10)	PRIMARY KEY		NOT NULL,
TName	varchar(50)					NOT NULL
);
go

1.2 添加数据

在图书表里面的B0001的记录中,作者信息更改为“阿历克斯”,图书的价格为50.5元。
在学生表中,修改学号为21210120117的学生信息,密码为Ab12@@,联系电话为,18812345688。

在借书证表中,插入本人信息。
在学生表中,插入本人的信息。
在借阅表中,插入一条本人所借的一本书信息。
关于以上各表数据准备的顺序(表)是什么?为什么?用实验说明。
数据准备数据语句(每个表写3个有代表性,但,在SQL脚本中是全的)

答:

--前置添加
use st_db
go
INSERT INTO t_book_type(Tid, TName)
VALUES (1,'科幻');

INSERT INTO t_book (Bid , Tid , BName , ISBN , BWriter , BCompany , BDate , BPrice , BBrief , BNum)
VALUES ('B0001' , 1 , '三体' ,1312544551231 , '刘慈欣' , '重庆出版社' ,'2006-05-01' , 36 , '好看' ,3);
go
--前置添加
use st_db
go
INSERT INTO t_class(SClassID,CName,MajorName,DName,EYear)
VALUES				('1','软件工程1班','软件工程','计算机系',2022);

INSERT INTO t_student (Sid ,SName ,SPwd ,SGender ,DoB ,SClassID)
VALUES				  ('21210120117' , '张三' ,123456 , '男' ,'2003-01-01' , '1');
go

显示数据语句:

use st_db 
go 
SELECT * from t_book;
go
use st_db
go
SELECT * FROM t_student;
go

修改前数据(复制):

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

修改语句:

use st_db 
go 
UPDATE t_book
SET BWriter = '阿历克斯' , BPrice = 50.5
WHERE Bid = 'B0001';
go
use st_db
go
UPDATE t_student
SET SPwd = 'Ab12@@' , STel = '18812345688'
WHERE Sid= '21210120117';
go

修改后显示语句:

use st_db 
go 
SELECT * from t_book where Bid = 'B0001';
go
use st_db
go
SELECT * from t_student WHERE Sid= '21210120117';
go

修改后数据(复制):
数据库实验二:图书信息管理系统数据查询与数据更新_第1张图片
在这里插入图片描述

上面只是简单样例

增加数据语句:

use st_db
go

insert into t_book_type values('T0001','计算机');
insert into t_book_type values('T0002','历史');
insert into t_book_type values('T0003','人文');
insert into t_book_type values('T0004','经济');
insert into t_book_type values('T0005','体育');
insert into t_book_type values('T0006','军事');


insert into t_book values('B0001','T0001','数据化决策','9787218122106','道格拉斯','广东人民出版社','2019-12-13',34.5,'麻省理工学院指定教材',6);
insert into t_book values('B0002','T0001','大数据时代','9787218122107','吉格斯','浙江人民出版社','2023-4-15',26.5,'央视推荐书籍',5);
insert into t_book values('B0003','T0001','正在来到的数字革命','9787218122108','徐子平','广西师范大学出版社','2019-06-19',42.1,'大数据深刻影响人类',3);
insert into t_book values('B0004','T0002','拖拖拉拉影响前途','9787218122109','安计划','东软电子出版社','2023-08-03',54.5,'青少年推荐读物',3);
insert into t_book values('B0005','T0002','明朝那些事','9787218122110','朱小青','清华出版社','2023-07-03',34.5,'青少年推荐读物',2);
insert into t_book values('B0006','T0002','chatGPT','9787218122111','魏征','机械工业出版社','2023-01-07',63.5,'青少年推荐读物',3);
insert into t_book values('B0007','T0003','中国崛起','9787218122112','吕小国','清华出版社','2023-02-17',33.5,'爱国主题优秀书籍',2);
insert into t_book values('B0008','T0003','宗教起源','9787218122113','本尼','广东人民出版社','2022-05-17',42.0,'趣味世界书籍',1);
insert into t_book values('B0009','T0001','AIGC','9787218122114','爱思考','广东人民出版社','2023-05-17',47.0,'趣味世界书籍',15);


insert into c_book(Bid) values('B0001');
insert into c_book(Bid) values('B0002');
insert into c_book(Bid) values('B0003');
insert into c_book(Bid) values('B0004');
insert into c_book(Bid) values('B0005');
insert into c_book(Bid) values('B0006');
insert into c_book(Bid) values('B0007');
insert into c_book(Bid) values('B0008');
insert into c_book(Bid) values('B0009');


insert into t_class values('C0001','21软件大数据1班','软件工程','计算机系',2021);
insert into t_class values('C0002','21软件大数据2班','软件工程','计算机系',2021);
insert into t_class values('C0003','21软件大数据3班','软件工程','计算机系',2021);
insert into t_class values('C0004','21软件1班','软件工程','计算机系',2021);
insert into t_class values('C0005','21软件2班','软件工程','计算机系',2021);
insert into t_class values('C0006','19会计1班','工商管理','信息管理系',2023);
insert into t_class values('C0007','19外贸英语1班','商务英语','外国语系',2023);


insert into t_libraryCard values('L0001','余骏昌','2021-09-01','Y',0,3);
insert into t_libraryCard values('L0002','朱威','2021-09-01','Y',0,3);
insert into t_libraryCard values('L0003','徐广声','2021-09-01','Y',0,3);
insert into t_libraryCard values('L0004','潘奕寰','2021-05-02','Y',0,3);
insert into t_libraryCard values('L0005','战美','2021-05-02','Y',0,3);
insert into t_libraryCard values('L0006','邹思柔','2021-09-01','Y',0,3);
insert into t_libraryCard values('L0007','黄小宇','2021-09-01','Y',0,3);
insert into t_libraryCard values('L0008','梁帅峰','1999-06-22','Y',0,3);
insert into t_libraryCard values('L0009','林武文','1999-08-23','Y',0,3);
insert into t_libraryCard values('L0010','曾紫怡','2023-09-20','Y',0,3);
insert into t_libraryCard values('L0011','卢君羽','2023-09-20','Y',0,3);
insert into t_libraryCard values('L0012','林小娜','2021-07-05','Y',0,3);
insert into t_libraryCard values('L0013','庞勇斌','2021-07-05','Y',0,3);

insert into t_student values('21210120113','L0001','余骏昌','123456','男','1995-12-23','18988567873','C0001');
insert into t_student values('21210120114','L0002','朱威','123456','男','1996-08-03','18988567873','C0001');
insert into t_student values('21210120115','L0003','徐广声','123456','男','1995-09-02','18988567873','C0002');
insert into t_student values('21210120116','L0004','潘奕寰','123456','男','1995-02-20','18988567873','C0002');
insert into t_student values('21210120117','L0005','战美','123456','男','1996-10-13','18988567873','C0003');
insert into t_student values('21210120118','L0006','邹思柔','123456','女','1996-02-05','18988567873','C0003');
insert into t_student values('21210120119','L0007','黄小宇','123456','女','1996-09-08','18988567873','C0003');
insert into t_student values('21210120120','L0008','梁帅峰','123456','男','1993-09-09','18988567873','C0003');
insert into t_student values('21210120121','L0009','林武文','123456','男','1993-09-16','18988567873','C0004');
insert into t_student values('21210120122','L0010','曾紫怡','123456','女','1995-07-15','18988567873','C0004');
insert into t_student values('21210120123','L0011','李晓君','123456','女','1995-06-08','18988567873','C0004');
insert into t_student values('21210120124','L0012','林小娜','123456','女','1996-07-02','18988567873','C0005');
insert into t_student values('21210120125','L0013','庞勇斌','123456','男','1996-08-13','18988567873','C0006');


insert into t_borrow values('B0001','L0002','2023-09-17','2023-10-17','N',0,0);
insert into t_borrow values('B0003','L0001','2023-10-02','','N',0,0);
insert into t_borrow values('B0004','L0008','2023-08-03','','N',3,0);
insert into t_borrow values('B0005','L0009','2023-06-04','2023-07-27','N',0,0);
insert into t_borrow values('B0006','L0002','2023-07-05','2023-08-27','Y',0,15.5);
insert into t_borrow values('B0007','L0011','2023-08-06','2023-09-27','N',0,0);
insert into t_borrow values('B0008','L0012','2023-09-08','','N',0,0);
insert into t_borrow values('B0009','L0004','2023-10-09','','N',0,0);
insert into t_borrow values('B0001','L0005','2023-09-03','','N',0,0);
insert into t_borrow values('B0002','L0006','2023-08-07','2023-09-27','N',0,0);

go

注: 插入语法为

-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse and Microsoft Fabric

INSERT [INTO] { database_name.schema_name.table_name | schema_name.table_name | table_name }
    [ ( column_name [ ,...n ] ) ]  
    {   
      VALUES ( { NULL | expression } )  
      | SELECT <select_criteria>  
    }  
    [ OPTION ( <query_option> [ ,...n ] ) ]  
[;]

所以 插入单行数据 的写法为:

INSERT INTO 表名  
VALUES ('values1', 'values2', 'values3');
--由于提供了所有列的值并按表中各列的顺序列出这些值,因此不必在列列表中指定列名**

如果要 按与表列顺序不同的顺序插入数据

INSERT INTO 表名 (Column_2, Column_1, Column_3)  
VALUES ('values2', 'values1', 'values3');

分别显示三个插入本人信息的表的数据(包括本人信息 ):

use st_db
go
SELECT * FROM t_student;
SELECT * FROM t_libraryCard;
SELECT * FROM t_borrow;
go

如果要查询某人(本人 )信息 eg.查询 潘奕寰 相关信息

use st_db
go
SELECT * FROM t_student WHERE SName = '潘奕寰';
SELECT * FROM t_libraryCard WHERE LName = '潘奕寰';
SELECT * FROM t_borrow WHERE LCardNo = 'L0004  '; -- 因为在搜查上一个表中知道L0004是潘奕寰的借书卡号了
go

1.3 删除数据

1.3 在学生信息表中,删除上题中修改过的学生记录。
答:

use st_db
go
DELETE FROM t_student
WHERE Sid= '21210120117';  
go

当然根据之前表格信息,要完整删除该学生所有的信息,应该删除其他表该学生相关信息

use st_db
go
DELETE FROM t_borrow --借书信息
WHERE LCardNo= 'L0005'; 

DELETE FROM t_libraryCard -- 借书卡
WHERE LCardNo= 'L0005';  
go

关于以上各表数据准备的顺序(表)是什么?为什么?用实验说明。
答:

图书类别信息表 t_book_type --> 图书信息表t_book -->新增馆藏可借图书c_book
借书证表t_libraryCard
班级信息表t_class – > 学生信息表t_student
其中图书类别信息表 t_book_type , 借书证表t_libraryCard , 班级信息表t_class 无前提准备要求,可以同时第一时间创建/数据准备
但 借阅信息表 t_borrow需要 在 新增馆藏可借图书c_book 和 借书证表t_libraryCard 这两个表之后

理由: 无外键约束的为第一梯队,用第一梯队为外键约束的为第二梯队以此类推。外键是从属关系。如果不这么做,会报错:消息 547,级别 16,状态 0,第 3 行 INSERT 语句与 FOREIGN KEY 约束"FR_LC"冲突。该冲突发生于数据库"st_db",表"dbo.t_libraryCard", column 'LCardNo'。 说的就是因为有外键约束"FR_LC" ,并且 表"dbo.t_libraryCard", column 'LCardNo’里面没有这个值,所以无法添加。 (具体外键约束 :LCardNo char(7) CONSTRAINT FR_LC FOREIGN KEY REFERENCES t_libraryCard(LCardNo)

2. 数据查询

请针对以下业务的具体需求,对上述参考表及其数据做对应查询。

2.1单表查询

1.查询所有图书的基本信息

答:
语句:

use st_db
go
select*from t_book
Select*from c_book
go

结果:

Bid	Tid	BName	ISBN	BWriter	BCompany	BDate	BPrice	BBrief	BNum
B0001          	T0001     	数据化决策	9787218122106  	道格拉斯	广东人民出版社	2019-12-13	34.50	麻省理工学院指定教材	6
B0002          	T0001     	大数据时代	9787218122107  	吉格斯	浙江人民出版社	2023-04-15	26.50	央视推荐书籍	5
B0003          	T0001     	正在来到的数字革命	9787218122108  	徐子平	广西师范大学出版社	2019-06-19	42.10	大数据深刻影响人类	3
B0004          	T0002     	拖拖拉拉影响前途	9787218122109  	安计划	东软电子出版社	2023-08-03	54.50	青少年推荐读物	3
B0005          	T0002     	明朝那些事	9787218122110  	朱小青	清华出版社	2023-07-03	34.50	青少年推荐读物	2
B0006          	T0002     	chatGPT	9787218122111  	魏征	机械工业出版社	2023-01-07	63.50	青少年推荐读物	3
B0007          	T0003     	中国崛起	9787218122112  	吕小国	清华出版社	2023-02-17	33.50	爱国主题优秀书籍	2
B0008          	T0003     	宗教起源	9787218122113  	本尼	广东人民出版社	2022-05-17	42.00	趣味世界书籍	1
B0009          	T0001     	AIGC	9787218122114  	爱思考	广东人民出版社	2023-05-17	47.00	趣味世界书籍	15
Bid	CBid	CBposition	CBstatus
B0001          	1	A1-F01-1-1     	可借
B0002          	2	A1-F01-1-1     	可借
B0003          	3	A1-F01-1-1     	可借
B0004          	4	A1-F01-1-1     	可借
B0005          	5	A1-F01-1-1     	可借
B0006          	6	A1-F01-1-1     	可借
B0007          	8	A1-F01-1-1     	可借
B0008          	9	A1-F01-1-1     	可借
B0009          	10	A1-F01-1-1     	可借
2.查询所有图书的编号、名称和价格

答:

use st_db
go
select Bid,BName,BPrice
from t_book
go

结果:

Bid	BName	BPrice
B0001          	数据化决策	34.50
B0002          	大数据时代	26.50
B0003          	正在来到的数字革命	42.10
B0004          	拖拖拉拉影响前途	54.50
B0005          	明朝那些事	34.50
B0006          	chatGPT	63.50
B0007          	中国崛起	33.50
B0008          	宗教起源	42.00
B0009          	AIGC	47.00
3. 查询计算机系学生读者的借书证号、姓名和联系电话

答:
步骤一,查询计算机系班级编号

use st_db
go
select SClassID
from  t_class WHERE DName = '计算机系'
go

第一步结果:

SClassID
C0001     
C0002     
C0003     
C0004     
C0005        

语句:

use st_db
go
select LCardNo,SName,STel
from t_student WHERE SClassID = 'C0001' OR SClassID = 'C0002' OR SClassID = 'C0003' OR  SClassID = 'C0004' OR SClassID = 'C0005'
go

结果:

LCardNo	SName	STel
L0001  	余骏昌	18988567873
L0002  	朱威	18988567873
L0003  	徐广声	18988567873
L0004  	潘奕寰	18988567873
L0006  	邹思柔	18988567873
L0007  	黄小宇	18988567873
L0008  	梁帅峰	18988567873
L0009  	林武文	18988567873
L0010  	曾紫怡	18988567873
L0011  	李晓君	18988567873
L0012  	林小娜	18988567873

当然 我们还可以一步到位!!!!
语句:

use st_db
go
select  LCardNo,SName,STel from t_student where SClassID in (select SClassID from t_class where DName = '计算机系')
go

结果: 发现结果是一样的

LCardNo	SName	STel
L0001  	余骏昌	18988567873
L0002  	朱威	18988567873
L0003  	徐广声	18988567873
L0004  	潘奕寰	18988567873
L0006  	邹思柔	18988567873
L0007  	黄小宇	18988567873
L0008  	梁帅峰	18988567873
L0009  	林武文	18988567873
L0010  	曾紫怡	18988567873
L0011  	李晓君	18988567873
L0012  	林小娜	18988567873

具体用法参考 sql—如何把sql查询出来的结果当做另一个sql的条件查询,1、语句2、with as

4. 查询学生借书证号为L0001且所借图书编号为B0003的借阅记录信息

答:
语句:

use st_db
go
select * from t_borrow 
where LCardNo = 'L0001' and Book_id = 'B0003'
go

结果:

Book_id	LCardNo	BorrowDate	ReturnDate	Overdue	RenewTimes	Fine
B0003          	L0001  	2023-10-02 00:00:00.000	1900-01-01 00:00:00.000	N	0	0.00
5. 查询t_borrow表未还书的记录(假设当前的日期是2023-10-20号)。要求:

答:
语句:

use st_db
go
Select*from t_borrow WHERE ReturnDate > CAST('2023-10-20' AS DATETIME)
go

结果:

Book_id	LCardNo	BorrowDate	ReturnDate	Overdue	RenewTimes	Fine

很不巧啊,上面添加没有符合要求的
那么我们添加一个试试

语句:

use st_db
go
insert into t_borrow values('B0008','L0003','2023-09-21','2023-10-21','N',0,0);
Select*from t_borrow WHERE ReturnDate > CAST('2023-10-20' AS DATETIME)
go

结果:

Book_id	LCardNo	BorrowDate	ReturnDate	Overdue	RenewTimes	Fine
B0008          	L0003  	2023-09-21 00:00:00.000	2023-10-21 00:00:00.000	N	0	0.00
6. 查询借阅日期“2023-08-05”至“2023-9-21”的借书记录信息

答:
语句:

use st_db
go
Select*from t_borrow WHERE  BorrowDate BETWEEN CAST('2023-08-05' AS DATETIME) AND CAST('2023-9-21' AS DATETIME)
go

结果:

Book_id	LCardNo	BorrowDate	ReturnDate	Overdue	RenewTimes	Fine
B0001          	L0002  	2023-09-17 00:00:00.000	2023-10-17 00:00:00.000	N	0	0.00
B0002          	L0006  	2023-08-07 00:00:00.000	2023-09-27 00:00:00.000	N	0	0.00
B0007          	L0011  	2023-08-06 00:00:00.000	2023-09-27 00:00:00.000	N	0	0.00
B0008          	L0003  	2023-09-21 00:00:00.000	2023-10-21 00:00:00.000	N	0	0.00
B0008          	L0012  	2023-09-08 00:00:00.000	1900-01-01 00:00:00.000	N	0	0.00
7. 查询与本人姓氏(如:学生林小娜)相同的学生读者(包括自己,姓林的)的基本信息;

答:
语句:

use st_db
go
Select*from t_student WHERE  SName = '林小娜' or SName LIKE ('林%')
-- Select*from t_student WHERE SName LIKE ('林%')
go

结果:

Sid	LCardNo	SName	SPwd	SGender	DoB	STel	SClassID
21210120121	L0009  	林武文	123456	男	1993-09-16	18988567873	C0004     
21210120124	L0012  	林小娜	123456	女	1996-07-02	18988567873	C0005     

查询姓名第二个字与本人姓名第二个字不同学生读者的基本信息。
语句:

use st_db
go
Select*from t_student WHERE NOT SName LIKE ('_小%')
go

结果:

Sid	LCardNo	SName	SPwd	SGender	DoB	STel	SClassID
21210120113	L0001  	余骏昌	123456	男	1995-12-23	18988567873	C0001     
21210120114	L0002  	朱威	123456	男	1996-08-03	18988567873	C0001     
21210120115	L0003  	徐广声	123456	男	1995-09-02	18988567873	C0002     
21210120116	L0004  	潘奕寰	123456	男	1995-02-20	18988567873	C0002     
21210120118	L0006  	邹思柔	123456	女	1996-02-05	18988567873	C0003     
21210120120	L0008  	梁帅峰	123456	男	1993-09-09	18988567873	C0003     
21210120121	L0009  	林武文	123456	男	1993-09-16	18988567873	C0004     
21210120122	L0010  	曾紫怡	123456	女	1995-07-15	18988567873	C0004     
21210120123	L0011  	李晓君	123456	女	1995-06-08	18988567873	C0004     
21210120125	L0013  	庞勇斌	123456	男	1996-08-13	18988567873	C0006     

2.2对查询结果进行编辑

1. 查询所有曾经借书学生的姓名和所在院系,输出结果的字段名是:姓名和所在院系。

答:
语句:

use st_db
go 
select t_student.SName , t_class.DName FROM t_student
INNER JOIN t_class ON t_student.SClassID = t_class.SClassID where LCardNo in (select LCardNo from t_borrow);
go

结果:

SName	DName
余骏昌	计算机系
朱威	计算机系
徐广声	计算机系
潘奕寰	计算机系
邹思柔	计算机系
梁帅峰	计算机系
林武文	计算机系
李晓君	计算机系
林小娜	计算机系
2. 查询借书证号为L0002的读者所借图书至今的天数总和。

答:
语句:

use st_db
go 
SELECT SUM(DATEDIFF(DAY,BorrowDate,GETDATE()))
BorrowDate FROM t_borrow where LCardNo = 'L0002'; -- 如果没有BorrowDate则是没列名的输出
go

结果:

BorrowDate
144
3. 查询借书证号为L0003的读者一共借了多少本书(同一本书多次续借的话,仅统计一次)。

答:
语句:

use st_db
go 
SELECT COUNT(distinct Book_id)  --distinct 去重
COUNT_NUM
FROM t_borrow where LCardNo = 'L0003';
go

结果:

COUNT_NUM
1
4. 查询所有图书信息,结果按价格的降序排列。

答:
语句:

use st_db
go 
SELECT * FROM t_book ORDER BY BPrice DESC;
go 

结果:

Bid	Tid	BName	ISBN	BWriter	BCompany	BDate	BPrice	BBrief	BNum
B0006          	T0002     	chatGPT	9787218122111  	魏征	机械工业出版社	2023-01-07	63.50	青少年推荐读物	3
B0004          	T0002     	拖拖拉拉影响前途	9787218122109  	安计划	东软电子出版社	2023-08-03	54.50	青少年推荐读物	3
B0009          	T0001     	AIGC	9787218122114  	爱思考	广东人民出版社	2023-05-17	47.00	趣味世界书籍	15
B0003          	T0001     	正在来到的数字革命	9787218122108  	徐子平	广西师范大学出版社	2019-06-19	42.10	大数据深刻影响人类	3
B0008          	T0003     	宗教起源	9787218122113  	本尼	广东人民出版社	2022-05-17	42.00	趣味世界书籍	1
B0005          	T0002     	明朝那些事	9787218122110  	朱小青	清华出版社	2023-07-03	34.50	青少年推荐读物	2
B0001          	T0001     	数据化决策	9787218122106  	道格拉斯	广东人民出版社	2019-12-13	34.50	麻省理工学院指定教材	6
B0007          	T0003     	中国崛起	9787218122112  	吕小国	清华出版社	2023-02-17	33.50	爱国主题优秀书籍	2
B0002          	T0001     	大数据时代	9787218122107  	吉格斯	浙江人民出版社	2023-04-15	26.50	央视推荐书籍	5
5. 统计图书信息表中不同出版社的图书的数目,把统计结果大于或等于2的记录输出。

答:
语句:

use st_db
go 
SELECT BCompany , COUNT(*) AS NUM
FROM t_book  
group by BCompany
having COUNT(BCompany)>=2
go 

结果:

BCompany	NUM
广东人民出版社	3
清华出版社	2
6. 查询所有图书的库存总量。

答:
语句:

use st_db
go 
SELECT BName , SUM(BNum) AS NUM
FROM t_book  
group by BName
go 

结果:

BName	NUM
AIGC	15
chatGPT	3
大数据时代	5
明朝那些事	2
数据化决策	6
拖拖拉拉影响前途	3
正在来到的数字革命	3
中国崛起	2
宗教起源	1
7. 输出借阅过期的借阅记录,并且输出的罚金翻倍。

答:
语句:

use st_db
go 
SELECT Book_id,
LCardNo,
BorrowDate,
ReturnDate,
Overdue,
RenewTimes,
Fine*2 AS Fine
FROM t_borrow
WHERE Overdue = 'Y'
go 

结果:

Book_id	LCardNo	BorrowDate	ReturnDate	Overdue	RenewTimes	Fine
B0006          	L0002  	2023-07-05 00:00:00.000	2023-08-27 00:00:00.000	Y	0	31.00
8. 持有L0002的读者已经缴纳了全部的罚金,请把对应借书记录的罚金更改为0,然后把续借的数量增加1,把过期记录的“是否过期”属性修改为“N”。

答:
语句:

use st_db -- 更新语句
go 
UPDATE t_borrow
SET Fine = 0, Overdue = 'N', RenewTimes = RenewTimes + 1
WHERE Overdue = 'Y' and LCardNo = 'L0002'  
go 
use st_db -- 查询语句
go 
SELECT *
FROM t_borrow
WHERE LCardNo = 'L0002'  
go 

结果:

Book_id	LCardNo	BorrowDate	ReturnDate	Overdue	RenewTimes	Fine
B0001          	L0002  	2023-09-17 00:00:00.000	2023-10-17 00:00:00.000	N	0	0.00
B0006          	L0002  	2023-07-05 00:00:00.000	2023-08-27 00:00:00.000	N	1	0.00

2.3连接查询

1. 采用等值连接的方式查询学生读者的学号、借书证号、姓名、联系电话以及所借书的图书编号,借阅日期。

答:
语句:

use st_db
go 
select t_student.Sid , t_student.LCardNo, t_student.SName, t_student.STel, t_borrow.Book_id , t_borrow.BorrowDate 
FROM t_student, t_borrow
WHERE t_student.LCardNo = t_borrow.LCardNo;
go

结果:

Sid	LCardNo	SName	STel	Book_id	BorrowDate
21210120113	L0001  	余骏昌	18988567873	B0003          	2023-10-02 00:00:00.000
21210120114	L0002  	朱威	18988567873	B0001          	2023-09-17 00:00:00.000
21210120114	L0002  	朱威	18988567873	B0006          	2023-07-05 00:00:00.000
21210120115	L0003  	徐广声	18988567873	B0008          	2023-09-21 00:00:00.000
21210120116	L0004  	潘奕寰	18988567873	B0009          	2023-10-09 00:00:00.000
21210120118	L0006  	邹思柔	18988567873	B0002          	2023-08-07 00:00:00.000
21210120120	L0008  	梁帅峰	18988567873	B0004          	2023-08-03 00:00:00.000
21210120121	L0009  	林武文	18988567873	B0005          	2023-06-04 00:00:00.000
21210120123	L0011  	李晓君	18988567873	B0007          	2023-08-06 00:00:00.000
21210120124	L0012  	林小娜	18988567873	B0008          	2023-09-08 00:00:00.000
2. 采用内连接的方法查询图书信息以及对应图书类别的详细信息。

答:
语句:

use st_db
go 
select t_book.Bid,
t_book.Tid,
t_book.BName,
t_book.ISBN,
t_book.BWriter,
t_book.BCompany,
t_book.BDate,
t_book.BPrice,
t_book.BBrief,
t_book.BNum,
t_book_type.Tid,
t_book_type.TName
FROM t_book
INNER JOIN t_book_type ON t_book_type.Tid = t_book.Tid
go

结果:

Bid	Tid	BName	ISBN	BWriter	BCompany	BDate	BPrice	BBrief	BNum	Tid	TName
B0001          	T0001     	数据化决策	9787218122106  	道格拉斯	广东人民出版社	2019-12-13	34.50	麻省理工学院指定教材	6	T0001     	计算机
B0002          	T0001     	大数据时代	9787218122107  	吉格斯	浙江人民出版社	2023-04-15	26.50	央视推荐书籍	5	T0001     	计算机
B0003          	T0001     	正在来到的数字革命	9787218122108  	徐子平	广西师范大学出版社	2019-06-19	42.10	大数据深刻影响人类	3	T0001     	计算机
B0009          	T0001     	AIGC	9787218122114  	爱思考	广东人民出版社	2023-05-17	47.00	趣味世界书籍	15	T0001     	计算机
B0004          	T0002     	拖拖拉拉影响前途	9787218122109  	安计划	东软电子出版社	2023-08-03	54.50	青少年推荐读物	3	T0002     	历史
B0005          	T0002     	明朝那些事	9787218122110  	朱小青	清华出版社	2023-07-03	34.50	青少年推荐读物	2	T0002     	历史
B0006          	T0002     	chatGPT	9787218122111  	魏征	机械工业出版社	2023-01-07	63.50	青少年推荐读物	3	T0002     	历史
B0007          	T0003     	中国崛起	9787218122112  	吕小国	清华出版社	2023-02-17	33.50	爱国主题优秀书籍	2	T0003     	人文
B0008          	T0003     	宗教起源	9787218122113  	本尼	广东人民出版社	2022-05-17	42.00	趣味世界书籍	1	T0003     	人文
3. 查询学生读者借书证号、姓名、班级以及所借图书的图书编号、借阅日期,没有借阅记录的学生也要输出。

答:
语句:

use st_db
go 
select t_student.LCardNo,
t_student.SName,
t_student.SClassID,
t_borrow.Book_id,
t_borrow.BorrowDate
FROM t_student
Left Outer Join t_borrow ON t_borrow.LCardNo = t_student.LCardNo
go

结果:

LCardNo	SName	SClassID	Book_id	BorrowDate
L0001  	余骏昌	C0001     	B0003          	2023-10-02 00:00:00.000
L0002  	朱威	C0001     	B0001          	2023-09-17 00:00:00.000
L0002  	朱威	C0001     	B0006          	2023-07-05 00:00:00.000
L0003  	徐广声	C0002     	B0008          	2023-09-21 00:00:00.000
L0004  	潘奕寰	C0002     	B0009          	2023-10-09 00:00:00.000
L0006  	邹思柔	C0003     	B0002          	2023-08-07 00:00:00.000
L0007  	黄小宇	C0003     	NULL	NULL
L0008  	梁帅峰	C0003     	B0004          	2023-08-03 00:00:00.000
L0009  	林武文	C0004     	B0005          	2023-06-04 00:00:00.000
L0010  	曾紫怡	C0004     	NULL	NULL
L0011  	李晓君	C0004     	B0007          	2023-08-06 00:00:00.000
L0012  	林小娜	C0005     	B0008          	2023-09-08 00:00:00.000
L0013  	庞勇斌	C0006     	NULL	NULL
4. 查询借书信息表中读者的借书证号、图书编号、借阅日期以及所借图书在图书信息表中对应的出版社编号,图书信息表没有连接成功的记录也要输出。

答:
语句:

use st_db
go 
select t_borrow.LCardNo,
t_borrow.Book_id,
t_borrow.BorrowDate,
t_book.BCompany
FROM t_borrow
Left Outer Join t_book ON t_borrow.Book_id = t_book.Bid
go

结果:

LCardNo	Book_id	BorrowDate	BCompany
L0002  	B0001          	2023-09-17 00:00:00.000	广东人民出版社
L0006  	B0002          	2023-08-07 00:00:00.000	浙江人民出版社
L0001  	B0003          	2023-10-02 00:00:00.000	广西师范大学出版社
L0008  	B0004          	2023-08-03 00:00:00.000	东软电子出版社
L0009  	B0005          	2023-06-04 00:00:00.000	清华出版社
L0002  	B0006          	2023-07-05 00:00:00.000	机械工业出版社
L0011  	B0007          	2023-08-06 00:00:00.000	清华出版社
L0003  	B0008          	2023-09-21 00:00:00.000	广东人民出版社
L0012  	B0008          	2023-09-08 00:00:00.000	广东人民出版社
L0004  	B0009          	2023-10-09 00:00:00.000	广东人民出版社
5. 查询在被罚款的同学的学号、姓名、电话、班级名称、借书证号、借书证发证日期、图书编号、图书名称、应还书日期、罚金数量。

答:
语句:

use st_db
go 
select 
t_student.Sid,
t_student.SName,
t_student.STel,
t_class.CName,
t_student.LCardNo,
t_libraryCard.IssueTime,
t_borrow.Book_id,
t_book.BName,
t_borrow.ReturnDate,
t_borrow.Fine
FROM t_student
Left Outer Join t_class ON t_student.SClassID = t_class.SClassID
Left Outer Join t_borrow ON t_borrow.LCardNo = t_student.LCardNo
Left Outer Join t_book ON t_book.Bid = t_borrow.Book_id
Left Outer Join t_libraryCard ON t_libraryCard.LCardNo = t_student.LCardNo
WHERE t_borrow.Fine > 0 
go

结果:

Sid	SName	STel	CName	LCardNo	IssueTime	Book_id	BName	ReturnDate	Fine

添加一个看看效果:

use st_db --添加语句
go 
insert into t_borrow values('B0003','L0007','2023-07-07','2023-08-24','Y',0,15.5);
go

然后再次查询 , 结果:

Sid	SName	STel	CName	LCardNo	IssueTime	Book_id	BName	ReturnDate	Fine
21210120119	黄小宇	18988567873	21软件大数据3班	L0007  	2021-09-01 00:00:00.000	B0003          	正在来到的数字革命	2023-08-24 00:00:00.000	15.50
6. 查询读者的借书证号、姓名、联系电话、以及所借图书的图书编号、类别名称、借阅日期、出版社和编号

答:
语句:

use st_db
go 
select 
t_student.LCardNo,
--t_student.Sid,
t_student.SName,
t_student.STel,
--t_class.CName,
--t_libraryCard.IssueTime,
t_borrow.Book_id,
t_book_type.TName,
--t_book.BName,
t_book.BCompany,
t_book.Tid -- 编号??
--t_borrow.BorrowDate,
--t_borrow.Fine
FROM t_borrow
--Left Outer Join t_class ON t_student.SClassID = t_class.SClassID
Left Outer Join  t_student ON t_borrow.LCardNo = t_student.LCardNo
Left Outer Join t_book ON t_book.Bid = t_borrow.Book_id
--Left Outer Join t_libraryCard ON t_libraryCard.LCardNo = t_student.LCardNo
Left Outer Join t_book_type ON t_book_type.Tid =t_book.Tid

go

结果:

LCardNo	SName	STel	Book_id	TName	BCompany	Tid
L0002  	朱威	18988567873	B0001          	计算机	广东人民出版社	T0001     
L0006  	邹思柔	18988567873	B0002          	计算机	浙江人民出版社	T0001     
L0001  	余骏昌	18988567873	B0003          	计算机	广西师范大学出版社	T0001     
L0007  	黄小宇	18988567873	B0003          	计算机	广西师范大学出版社	T0001     
L0008  	梁帅峰	18988567873	B0004          	历史	东软电子出版社	T0002     
L0009  	林武文	18988567873	B0005          	历史	清华出版社	T0002     
L0002  	朱威	18988567873	B0006          	历史	机械工业出版社	T0002     
L0011  	李晓君	18988567873	B0007          	人文	清华出版社	T0003     
L0003  	徐广声	18988567873	B0008          	人文	广东人民出版社	T0003     
L0012  	林小娜	18988567873	B0008          	人文	广东人民出版社	T0003     
L0004  	潘奕寰	18988567873	B0009          	计算机	广东人民出版社	T0001     
7. 利用查询语句与数据更新语句等实现每批次购进图书在馆数的修改。提示:在t_book中,用修改表语句增加在馆数量字段。

答: 实话说没怎么看懂这个题目,个人理解是用新增馆藏可借图书c_book中的数据去增加
语句:
查询:

use st_db
go 
select * from c_book
select * from t_book
go

结果:

Bid	CBid	CBposition	CBstatus
B0001          	1	A1-F01-1-1     	可借
B0002          	2	A1-F01-1-1     	可借
B0003          	3	A1-F01-1-1     	可借
B0004          	4	A1-F01-1-1     	可借
B0005          	5	A1-F01-1-1     	可借
B0006          	6	A1-F01-1-1     	可借
B0007          	8	A1-F01-1-1     	可借
B0008          	9	A1-F01-1-1     	可借
B0009          	10	A1-F01-1-1     	可借


Bid	Tid	BName	ISBN	BWriter	BCompany	BDate	BPrice	BBrief	BNum
B0001          	T0001     	数据化决策	9787218122106  	道格拉斯	广东人民出版社	2019-12-13	34.50	麻省理工学院指定教材	6
B0002          	T0001     	大数据时代	9787218122107  	吉格斯	浙江人民出版社	2023-04-15	26.50	央视推荐书籍	5
B0003          	T0001     	正在来到的数字革命	9787218122108  	徐子平	广西师范大学出版社	2019-06-19	42.10	大数据深刻影响人类	3
B0004          	T0002     	拖拖拉拉影响前途	9787218122109  	安计划	东软电子出版社	2023-08-03	54.50	青少年推荐读物	3
B0005          	T0002     	明朝那些事	9787218122110  	朱小青	清华出版社	2023-07-03	34.50	青少年推荐读物	2
B0006          	T0002     	chatGPT	9787218122111  	魏征	机械工业出版社	2023-01-07	63.50	青少年推荐读物	3
B0007          	T0003     	中国崛起	9787218122112  	吕小国	清华出版社	2023-02-17	33.50	爱国主题优秀书籍	2
B0008          	T0003     	宗教起源	9787218122113  	本尼	广东人民出版社	2022-05-17	42.00	趣味世界书籍	1
B0009          	T0001     	AIGC	9787218122114  	爱思考	广东人民出版社	2023-05-17	47.00	趣味世界书籍	15

修改后并查询:

use st_db
go 
update t_book
SET BNum = BNum + 1
WHERE Bid in (
select Bid from c_book
)
select * from t_book -- 查询语句
go

结果:

Bid	Tid	BName	ISBN	BWriter	BCompany	BDate	BPrice	BBrief	BNum
B0001          	T0001     	数据化决策	9787218122106  	道格拉斯	广东人民出版社	2019-12-13	34.50	麻省理工学院指定教材	7
B0002          	T0001     	大数据时代	9787218122107  	吉格斯	浙江人民出版社	2023-04-15	26.50	央视推荐书籍	6
B0003          	T0001     	正在来到的数字革命	9787218122108  	徐子平	广西师范大学出版社	2019-06-19	42.10	大数据深刻影响人类	4
B0004          	T0002     	拖拖拉拉影响前途	9787218122109  	安计划	东软电子出版社	2023-08-03	54.50	青少年推荐读物	4
B0005          	T0002     	明朝那些事	9787218122110  	朱小青	清华出版社	2023-07-03	34.50	青少年推荐读物	3
B0006          	T0002     	chatGPT	9787218122111  	魏征	机械工业出版社	2023-01-07	63.50	青少年推荐读物	4
B0007          	T0003     	中国崛起	9787218122112  	吕小国	清华出版社	2023-02-17	33.50	爱国主题优秀书籍	3
B0008          	T0003     	宗教起源	9787218122113  	本尼	广东人民出版社	2022-05-17	42.00	趣味世界书籍	2
B0009          	T0001     	AIGC	9787218122114  	爱思考	广东人民出版社	2023-05-17	47.00	趣味世界书籍	16

2.4子查询

1. 查询借阅了图书编号为B0001的图书的读者信息。

答:
语句:

use st_db
go 
SELECT *
FROM t_libraryCard
WHERE  LCardNo = (
	select LCardNo
	FROM t_borrow WHERE Book_id = 'B0001'
	)
go 

当然 如果 不想重复 用 DISTINCT

use st_db
go 
SELECT DISTINCT *
FROM t_libraryCard
WHERE  LCardNo = (
	select LCardNo
	FROM t_borrow WHERE Book_id = 'B0001'
	)
go 

结果:

LCardNo	LName	IssueTime	Available	BorrowNum	MaxNum
L0002  	朱威	2021-09-01 00:00:00.000	Y	0	3
2. 查询借阅了广东人民出版社和清华出版社的图书的读者信息。

答:
语句:

use st_db
go 
SELECT DISTINCT *
FROM t_libraryCard
WHERE  LCardNo IN (
	select LCardNo
	FROM t_borrow WHERE Book_id IN (
		SELECT Book_id
		FROM t_book WHERE BCompany= '广东人民出版社' OR BCompany = '清华出版社'
	)
	)
go 

结果:

LCardNo	LName	IssueTime	Available	BorrowNum	MaxNum
L0001  	余骏昌	2021-09-01 00:00:00.000	Y	0	3
L0002  	朱威	2021-09-01 00:00:00.000	Y	0	3
L0003  	徐广声	2021-09-01 00:00:00.000	Y	0	3
L0004  	潘奕寰	2021-05-02 00:00:00.000	Y	0	3
L0006  	邹思柔	2021-09-01 00:00:00.000	Y	0	3
L0008  	梁帅峰	1999-06-22 00:00:00.000	Y	0	3
L0009  	林武文	1999-08-23 00:00:00.000	Y	0	3
L0011  	卢君羽	2023-09-20 00:00:00.000	Y	0	3
L0012  	林小娜	2021-07-05 00:00:00.000	Y	0	3
3. 查询还未归还图书的读者的借书证号、姓名、部门和联系电话(假设当前的日期是2022-10-20号,图书归还时候,一定要缴纳罚金)。

答:
语句:

use st_db
go 
SELECT DISTINCT t_student.LCardNo , t_student.SName ,t_class.DName, t_student.STel
FROM t_student
INNER JOIN t_class ON t_student.SClassID = t_class.SClassID
WHERE  LCardNo IN (
	select LCardNo
	FROM t_borrow WHERE ReturnDate > '2022-10-20'
	)
go 

结果:

LCardNo	SName	DName	STel
L0002  	朱威	计算机系	18988567873
L0003  	徐广声	计算机系	18988567873
L0006  	邹思柔	计算机系	18988567873
L0009  	林武文	计算机系	18988567873
L0011  	李晓君	计算机系	18988567873
4. 查询姓名为朱威读者的借阅记录。

答:
语句:

use st_db
go 
SELECT  *
FROM t_borrow
WHERE  LCardNo IN (
	select LCardNo
	FROM t_libraryCard WHERE LName = '朱威'
	)
go 

结果:

Book_id	LCardNo	BorrowDate	ReturnDate	Overdue	RenewTimes	Fine
B0001          	L0002  	2023-09-17 00:00:00.000	2023-10-17 00:00:00.000	N	0	0.00
B0006          	L0002  	2023-07-05 00:00:00.000	2023-08-27 00:00:00.000	N	1	0.00
5. 查询跟徐广声借阅了相关图书的其他读者详细信息。

答:
语句:

use st_db
go 
SELECT  DISTINCT *
FROM t_libraryCard -- t_student
WHERE  LCardNo IN (
	SELECT LCardNo
	FROM t_borrow WHERE Book_id IN (
		SELECT Book_id
		FROM t_borrow WHERE LCardNo IN (
			select LCardNo
			FROM t_libraryCard WHERE LName = '徐广声'
			)
		)
	)
go 

结果:

LCardNo	LName	IssueTime	Available	BorrowNum	MaxNum
L0003  	徐广声	2021-09-01 00:00:00.000	Y	0	3
L0012  	林小娜	2021-07-05 00:00:00.000	Y	0	3
6. 利用相关子查询邹思柔是否有借阅图书的记录,若有则输出借阅记录。

答:
语句:

use st_db
go 
SELECT *
FROM t_borrow WHERE LCardNo IN (
	select LCardNo
	FROM t_libraryCard WHERE LName = '邹思柔'
)
go 

结果:

Book_id	LCardNo	BorrowDate	ReturnDate	Overdue	RenewTimes	Fine
B0002          	L0006  	2023-08-07 00:00:00.000	2023-09-27 00:00:00.000	N	0	0.00
7. 查询图书价格比所有图书平均价格高的图书信息。

答:
语句:

use st_db
go 
SELECT *
FROM t_book WHERE BPrice >  (SELECT AVG(BPrice) FROM t_book)
go 

结果:

Bid	Tid	BName	ISBN	BWriter	BCompany	BDate	BPrice	BBrief	BNum
B0003          	T0001     	正在来到的数字革命	9787218122108  	徐子平	广西师范大学出版社	2019-06-19	42.10	大数据深刻影响人类	3
B0004          	T0002     	拖拖拉拉影响前途	9787218122109  	安计划	东软电子出版社	2023-08-03	54.50	青少年推荐读物	3
B0006          	T0002     	chatGPT	9787218122111  	魏征	机械工业出版社	2023-01-07	63.50	青少年推荐读物	3
B0009          	T0001     	AIGC	9787218122114  	爱思考	广东人民出版社	2023-05-17	47.00	趣味世界书籍	15
8. 查询图书价格比图书编号为B0002和B0003的价格都高的图书信息。

答:
语句:

use st_db
go 
SELECT *
FROM t_book WHERE BPrice >  (SELECT BPrice FROM t_book WHERE Bid = 'B0002' ) AND  BPrice > (SELECT BPrice FROM t_book WHERE Bid = 'B0003')
go 

结果:

Bid	Tid	BName	ISBN	BWriter	BCompany	BDate	BPrice	BBrief	BNum
B0004          	T0002     	拖拖拉拉影响前途	9787218122109  	安计划	东软电子出版社	2023-08-03	54.50	青少年推荐读物	3
B0006          	T0002     	chatGPT	9787218122111  	魏征	机械工业出版社	2023-01-07	63.50	青少年推荐读物	3
B0009          	T0001     	AIGC	9787218122114  	爱思考	广东人民出版社	2023-05-17	47.00	趣味世界书籍	15

2.4视图

1.根据应用,请同学定义2张视图。第一个视图输出学生学号、姓名、电话号码、班级名称、系部名称。第二个视图输出罚金超过10元的学生学号、学生、电话号码、借书证、图书名字、借书日期、应还书日期及罚金。

答:
语句:

use st_db
go 
CREATE VIEW one AS 
SELECT t_student.Sid,
t_student.SName,
t_student.STel,
t_class.CName,
t_class.DName
FROM t_student
INNER JOIN t_class ON t_student.SClassID = t_class.SClassID
go
use st_db --  表2
go 
CREATE VIEW two AS 
select 
t_student.Sid,
t_student.SName,
t_student.STel,
t_student.LCardNo,
t_book.BName,
t_borrow.BorrowDate,
t_borrow.ReturnDate,
t_borrow.Fine
FROM t_student
Left Outer Join t_borrow ON t_borrow.LCardNo = t_student.LCardNo
Left Outer Join t_book ON t_book.Bid = t_borrow.Book_id
WHERE t_borrow.Fine > 10 
go

简单运用视图:

use st_db
go 
select * from one;
go

结果:

Sid	SName	STel	CName	DName
21210120113	余骏昌	18988567873	21软件大数据1班	计算机系
21210120114	朱威	18988567873	21软件大数据1班	计算机系
21210120115	徐广声	18988567873	21软件大数据2班	计算机系
21210120116	潘奕寰	18988567873	21软件大数据2班	计算机系
21210120118	邹思柔	18988567873	21软件大数据3班	计算机系
21210120119	黄小宇	18988567873	21软件大数据3班	计算机系
21210120120	梁帅峰	18988567873	21软件大数据3班	计算机系
21210120121	林武文	18988567873	21软件1班	计算机系
21210120122	曾紫怡	18988567873	21软件1班	计算机系
21210120123	李晓君	18988567873	21软件1班	计算机系
21210120124	林小娜	18988567873	21软件2班	计算机系
21210120125	庞勇斌	18988567873	19会计1班	信息管理系

语句:

use st_db
go 
select * from two;
go

结果:

Sid	SName	STel	LCardNo	BName	BorrowDate	ReturnDate	Fine
21210120119	黄小宇	18988567873	L0007  	正在来到的数字革命	2023-07-07 00:00:00.000	2023-08-24 00:00:00.000	15.50

2.创建视图运用视图修改视图数据(与操作表一样,只是把table换成view)

–1创建视图并修改字段的别名

直接运用视图查询与运行结果

–2插入视图数据

查询插入后的视图与运行结果

–3修改视图的数据值

查询修改了值的视图与运行结果

–4删除视图的行数据

查询删除了值的视图与运行结果

操作异常问题与解决方案

问题1 : 被引用表中没有与外键…中的引用列表匹配的主键或候选键

错误背景:
在建立 借阅信息表 t_borrow 中出现

语句:

use st_db
go
create table t_borrow(
Book_id			char(15)		FOREIGN KEY REFERENCES c_book(Bid)					NOT NULL,
LCardNo			char(7)			FOREIGN KEY REFERENCES t_libraryCard(LCardNo)		NOT NULL,
BorrowDate		datetime															NOT NULL,
ReturnDate		datetime															NOT NULL,
Overdue			char(1)			DEFAULT('N')										NOT NULL,
RenewTimes		tinyint			DEFAULT(0) check(RenewTimes <= 3) 					NOT NULL,
Fine 			Numeric(10,2)	DEFAULT(0)											NOT NULL,
PRIMARY KEY(Book_id,LCardNo,BorrowDate)
);
go
消息 1776,级别 16,状态 0,第 3 行
在被引用表 'c_book' 中没有与外键 'FK__t_borrow__Book_i__778AC167' 中的引用列列表匹配的主键或候选键

解决办法:

将 c_book表中 Bid 设置为主键即可解决

问题2:子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。

错误背景:2. 查询借阅了广东人民出版社和清华出版社的图书的读者信息。

use st_db
go 
SELECT DISTINCT *
FROM t_libraryCard
WHERE  LCardNo = (
	select LCardNo
	FROM t_borrow WHERE Book_id = (
		SELECT Book_id
		FROM t_book WHERE BCompany= '广东人民出版社' OR BCompany = '清华出版社'
	)
	)
go 
消息 512,级别 16,状态 1,第 3 行
子查询返回的值不止一个。当子查询跟随在 =!=<<=>>= 之后,或子查询用作表达式时,这种情况是不允许的。

解决办法:

将 = 改成 IN

正确语句:

use st_db
go 
SELECT DISTINCT *
FROM t_libraryCard
WHERE  LCardNo IN (
	select LCardNo
	FROM t_borrow WHERE Book_id IN (
		SELECT Book_id
		FROM t_book WHERE BCompany= '广东人民出版社' OR BCompany = '清华出版社'
	)
	)
go 

你可能感兴趣的:(数据库,oracle,sql)