实验5 sql语句练习 - 图书馆数据库答案

更新时间:2023-11-19 20:12:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验5 sql语句练习——图书馆数据库

实验5 sql语句练习——图书馆数据库

实验目的

(1)了解SQL Server数据库的逻辑结构和物理结构; (2)了解表的结构特点;

(3)了解SQL Server的基本数据类型; (4)了解空值概念;

(5)学会在企业管理器中创建数据库和表; (6)学会使用T-SQL语句创建数据库和表。 (7)学会使用T-SQL语句更新数据。 (7)学会使用T-SQL语句创建多种查询。

实验准备

首先要明确,能够创建数据库的用户必须是系统管理员,或是被授权使用CREATE DATABASE语句的用户。 其次创建数据库必须要确定数据库名、数据库大小(最初的大小、最大的大小、是否允许增长及增长方式)和存储数据库的文件。

然后,确定数据库包含哪些表,以及所包含的各表的结构,还要了解SQL Server的常用数据类型,以创建数据库的表。

此外还要了解两种常用的创建数据库、表的方法,即在企业管理器中创建和使用T-SQL的CREATE DATABASE语句。

实验内容

假设有5本书

设有一图书馆数据库,其中包括3个表,即图书表、读者表和借阅表。三个表的结构如图: 图书表结构 列名 书号 书名 作者 出版社 单价 说明 图书唯一的编号 图书的名称 图书的编著者名 图书的出版社 出版社确定的图书的单价 数据类型 定长字符串,长度为10 定长字符串,长度为50 定长字符串,长度为30 定长字符串,长度为30 浮点型,Float 约束说明 主键 空值 空值 空值 空值 读者表结构

假设有10位读者 列名 说明 数据类型 约束说明 读者号 姓名 性别 办公电话 部门 借阅表结构 列名 读者号 书号 借出日期 归还日期 读者唯一的编号 读者姓名 读者性别 读者办公电话 读者所在部门 说明 读者的唯一编号 图书的唯一编号 借出图书的日期 归还图书的日期 定长字符串,长度为10 定长字符串,长度为8 定长字符串,长度为2 定长字符串,长度为8 定长字符串,长度为30 数据类型 定长字符串,长度为10 定长字符串,长度为20 定长字符串,长度为8 定长字符串,长度为8 主键 非空值 非空值 空值 空值 约束说明 外码,引用读者表的主键 外码,引用图书表的主键 非空值 空值 主键为:(读者号,图书号) (1) 用Sql语句创建图书馆数据库

Create database Lab05

(2) 用Sql语句创建上述3个表

create table book (

bookId char(10)primary key, bookName varchar(50), bookWriter varchar(30), bookPublish varchar(30), bookPrice float )

create table reader (

readerId char(10) primary key, readerName varchar(8)not null, readerSex char(2)not null, readerOfficeTel char(8),

readerDepartment varchar(30) )

create table 借阅表 (

readerId char(10), bookId char(10),

checkOutTime char(8), checkInTime char(8),

primary key(readerId,bookId),

foreign key (readerId) references reader(readerId), foreign key (bookId) references book(bookId), )

(3) 基于图书馆数据库的3个表,用sql语言完成一下操作:

1) 为图书表增加一列“ISBN”,数据类型为CHAR(10)

alter table book add ISBN char(10)

2) 为刚添加的ISBN列增加缺省值约束,约束名为ISBNDEF,缺省值为‘7111085949’

ALTER TABLE book ADD CONSTRAINT ISBNDEF DEFAULT ('7111085949') FOR ISBN 3) 删除图书表中ISBN列增加的缺省值约束

alter table book drop ISBNDEF 4) 删除图书表中新增的ISBN列

ALTER TABLE book DROP COLUMN ISBN

5) 查询全体图书的图书号、书名、作者、出版社和单价

select bookId,bookName,bookWriter,bookPublish,bookPrice from book

6) 查询全体图书的信息,其中单价打8折,并设置该列的别名为‘打折价’

select bookId,bookName,bookWriter,bookPublish,(bookPrice*0.8) as打折价 from book

7) 显示所有借阅者的读者号,并去掉重复行

select distinct readerId from 借阅表

8) 查询所有单价在20—30元之间的图书信息

select bookId,bookName,bookWriter,bookPublish,bookPrice,ISBN from book

where bookPrice between 20 and 30

9) 查询机械工业出版社、科学出版社、人民邮电出版社的图书信息

select bookId,bookName,bookWriter,bookPublish,bookPrice,ISBN from book

where bookPublish in('机械工业出版社' , '科学出版社','人民邮电出版社') 10) 查询既不是机械工业出版社、人民邮电出版社、也不是科学出版社出版的图书信息

select bookId,bookName,bookWriter,bookPublish,bookPrice,ISBN from book

where bookPublish not in('机械工业出版社' , '科学出版社','人民邮电出版社')

11) 查询姓名的第二个字符是’建’,并且只有2个字的读者的读者号及姓名

select readerId,readerName from reader

where readerName like '_建'

12) 查询姓名不是以‘王’、‘张’或‘李’开头的所有读者的读者号及姓名

【方式一】查询出来的结果有问题! select readerId,readerName from reader

where readerName not in ('王%','张%','李%') 【方式二】

select readerId,readerName from reader

where readerName not in ( select readerName from reader where readerName like'王%'or readerName like'张%'or readerName like'李%' )

13) 查询无归还日期的借阅信息

select book.bookId,book.bookName,reader.readerId,

reader.readerName,借阅表.checkOutTime as 借书时间, 借阅表.checkInTime as 还书时间 from 借阅表,book,reader

where 借阅表.bookId = book.bookId and 借阅表.readerId = reader.readerId and 借阅表.checkInTime is null

14) 查询机械工业出版社图书的平均价格、最高价、最低价

select avg(bookPrice)as 平均价格,max(bookPrice) as 最高价 ,min(bookPrice) as 最低价 from book

where bookPublish = '机械工业出版社图书'

15) 查询读者的基本信息及借阅情况 select reader.readerId,reader.readerName ,借阅表.bookId,book.bookName,book.bookPublish

from reader , 借阅表 ,book

where reader.readerId = 借阅表.readerId

and book.bookId = 借阅表.bookId and 借阅表.readerId ='1000000007'

16) 查询至少借阅过1本机械工业出版社出版的图书的读者的读者号、姓名、书名及借阅本数,并按借

阅本书多少降序排列

select r.Rno,Rname,count(borrow.Bno) 借阅册数 from borrow,b,r

where b.bno=borrow.bno and press='机械工业出版社' and borrow.rno=r.rno group by r.rno,Rname

order by count(borrow.Bno) desc

17) 查询与‘王小平’的办公电话相同的读者的姓名

/* 使用“自连接方式”求解 */

select b.readerName,b.readerId,a.readerOfficeTel

from reader a, reader b

where a.readerName like '王小平'and a.readerOfficeTel = b.readerOfficeTel /*

18) 查询所有单价小于平均单价的图书的书号、书名及出版社

select bookId,bookName,bookPublish,bookPrice from book

where bookPrice < ( select avg(bookPrice) as averagePrice from book )

19) 查询‘科学出版社’的图书单价比‘机械工业出版社’最高单价还高的图书书名及单价

select bookId,bookName,bookPublish,bookPrice from book

where bookPublish like '科学出版社' and bookPrice > ( select max(bookPrice) from book where bookPublish = '机械工业出版社' )

20)

21)

查询‘科学出版社’的图书中单价比‘机械工业出版社’最低单价高的图书书名及单价 select bookId,bookName,bookPublish,bookPrice from book

where bookPrice < ( select max(bookPrice) from book where bookPublish = '机械工业出版社' )

and bookPublish like '科学出版社' 创建机械工业出版社图书的视图

CREATE VIEW 机械工业出版社View AS

SELECT bookId,bookName,bookPrice FROM book

WHERE bookPublish = '机械工业出版社'

创建一个借阅统计视图,名为CountView,包含读者的读者号和总借阅本数 CREATE VIEW CountView AS

SELECT readerId as 读者号,count(*) as 总借阅本数 FROM 借阅表

GROUP BY readerId

创建一个借阅统计视图,名为CountView10,包含借阅总本数打于2的读者号和总借阅本数 CREATE VIEW 借阅统计视图View AS

SELECT readerId as 读者号,count(*) as 总借阅本数 FROM 借阅表

GROUP BY readerId HAVING COUNT(*) >2

22)

23)

本文来源:https://www.bwwdw.com/article/rfov.html

Top