实验项目名称:图书信息管理系统数据查询与数据更新
- 实验目的与要求
- 实验原理与内容
- 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:子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
实验类型:综合性
实验目的与要求
- 掌握使用INSERT、UPDATE、DELETE语句向表中插入数据、修改和删除数据;
- 熟悉和掌握对数据表中数据的查询操作和SQL命令的使用;
- 能掌握各种查询方法,能通过查询获取对自己有用的数据,能对查询结果进行编辑;
- 理解不同类型的查询语句其执行原理及查询效率;
- 加深理解关系运算的各种操作(尤其是关系的选择,投影,连接和除运算);
- 理解视图概念、运用视图;
- 报告中,要有重要方法、讨论与思考过程等内容书写。
实验原理与内容
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 单表查询
- 查询所有图书的基本信息
- 查询所有图书的编号、名称和价格
- 查询计算机系学生读者的借书证号、姓名和联系电话
- 查询学生借书证号为L0001且所借图书编号为B0003的借阅记录信息
- 查询t_borrow表未还书的记录(假设当前的日期是2022-10-20号)。
- 查询借阅日期“1998-02-06”至“2021-12-06”的借书记录信息
- 查询姓徐的学生读者的基本信息
2.2对查询结果进行编辑
- 查询所有曾经借书学生的姓名和所在院系,输出结果的字段名是:姓名和所在院系。
- 查询借书证号为L0002的读者所借图书至今的天数总和。
- 查询借书证号为L0003的读者一共借了多少本书(同一本书多次续借的话,仅统计一次)。
- 查询所有图书信息,结果按价格的降序排列。
- 统计图书信息表中不同出版社的图书的数目,把统计结果大于或等于2的记录输出。
- 查询所有图书的库存总量。
- 输出借阅过期的借阅记录,并且输出的罚金翻倍。
- 持有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
修改后数据(复制):
上面只是简单样例
增加数据语句:
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