关系数据库练习题1


写在前面

这篇文章主要以几个作者做过的关系数据库练习题为主,多在SQL语言上以伪代码的方式实现,为各位分享一下学习的经验,如有不足,还请多多指教


一、题目描述

有一个图书馆管理数据库,分别为表名以及列名,信息如下

  • 读者(读者编号,姓名,单位)
  • 图书(书号,书名,作者,出版社,单价,类型)
  • 借阅记录(读者编号,书号,借阅日期,应还日期)
  • 还书记录(读者编号,书号,归还日期)

有查询要求如下

  1. 查询"人民邮电出版社"出版的所有图书的相关信息
  2. 查询单价在15元以上的书名和作者
  3. 查询8号读者2017年3月10日所借的图书的相关信息
  4. 查询超期归还图书的读者姓名和单位
  5. 查询借阅过《天龙八部》的读者的信息
  6. 查询借阅过“金庸”所有著作的读者的姓名
  7. 查询没有借阅过任何图书的读者的姓名

二、习题解答

1.关系代数解答

  1. 查询"人民邮电出版社"出版的所有图书的相关信息
    σ 出版社 = 人民邮电 ( 图书 ) \sigma _{\text{出版社}=\text{人民邮电}}\left( \text{图书} \right) σ出版社=人民邮电(图书)

  2. 查询单价在15元以上的书名和作者
    Π 书名,作者 ( σ 单价 > 15 元 ( 图书 ) ) \varPi _{\text{书名,作者}}\left( \sigma _{\text{单价}>15\text{元}}\left( \text{图书} \right) \right) Π书名,作者(σ单价>15(图书))

  3. 查询8号读者2017年3月10日所借的图书的相关信息
    Π 书号 ( σ 读者编号 = 8 ( 读者 ) ∧ σ 借阅日期 = 20170310 ( 借阅记录 ) ) ⋈ ( 图书 ) \varPi _{\text{书号}}\left( \sigma _{\text{读者编号}=8}\left( \text{读者} \right) \land \sigma _{\text{借阅日期}=20170310}\left( \text{借阅记录} \right) \right)\bowtie \left( \text{图书} \right) Π书号(σ读者编号=8(读者)σ借阅日期=20170310(借阅记录))(图书)

  4. 查询超期归还图书的读者姓名和单位

注意: 这个题目十分具有迷惑性,如果直接将借阅记录和还书记录两个表直接作(归还日期>应还日期)条件下的 θ \theta θ连接是不可取的,因为DBMS有可能是读取两个不同读者的归还日期和应还日期,所以应当将两个表进行等值连接后再判断
Π 姓名 ( σ 归还日期 > 应还日期 ( ( 借阅记录 ) ⋈ ( 还书记录 ) ) ⋈ ( 读者 ) ) \varPi _{\text{姓名}}\left( \sigma _{\text{归还日期}>\text{应还日期}}\left( \left( \text{借阅记录} \right) \bowtie \left( \text{还书记录} \right) \right) \bowtie \left( \text{读者} \right) \right) Π姓名(σ归还日期>应还日期((借阅记录)(还书记录))(读者))

  1. 查询借阅过《天龙八部》的读者的信息
    Π 读者编号 ( σ 书名 = 《天龙八部》 ( 图书 ) ⋈ ( 借阅记录 ) ) ⋈ ( 读者 ) \varPi _{\text{读者编号}}\left( \sigma _{\text{书名}=\text{《天龙八部》}}\left( \text{图书} \right) \bowtie \left( \text{借阅记录} \right) \right) \bowtie \left( \text{读者} \right) Π读者编号(σ书名=《天龙八部》(图书)(借阅记录))(读者)
  2. 查询借阅过“金庸”所有著作的读者的姓名
    Π 读者姓名 ( ( Π 读者编号 , 书号 ( 借阅记录 ) ÷ σ 作者 = “ 金庸 ” ( 图书 ) ) ⋈ ( 读者 ) ) \varPi _{\text{读者姓名}}\left( \left( \varPi _{\text{读者编号},\text{书号}}\left( \text{借阅记录} \right) \div \sigma _{\text{作者}=“\text{金庸}”}\left( \text{图书} \right) \right) \bowtie \left( \text{读者} \right) \right) Π读者姓名((Π读者编号,书号(借阅记录)÷σ作者=金庸(图书))(读者))
  3. 查询没有借阅过任何图书的读者的姓名
    Π 姓名 ( ( Π 读者编号 ( 读者 ) − Π 读者编号 ( 借阅记录 ) ) ⋈ ( 读者 ) ) \varPi _{\text{姓名}}\left( \left( \varPi _{\text{读者编号}}\left( \text{读者} \right) -\varPi _{\text{读者编号}}\left( \text{借阅记录} \right) \right) \bowtie \left( \text{读者} \right) \right) Π姓名((Π读者编号(读者)Π读者编号(借阅记录))(读者))

2.使用带where选择条件的SQL语句解答

代码如下(示例):

1.查询8号读者2017年3月10日所借的图书的相关信息

SELECT 图书.*
FROM 图书,借阅记录
WHERE 图书.书号 = 借阅记录.书号 and 读者编号 = '8' and 借阅日期 = '20170310'

2.查询超期归还图书的读者姓名和单位

SELECT 借阅记录.读者号
FROM 借阅记录,还书记录
WHERE 借阅记录.书号 = 还书记录.书号 and 借阅记录.读者编号 = 还书记录.读者号 and 归还日期 > 应还日期

3. 查询借阅过《天龙八部》的读者的信息

SELECT 读者.*
FROM 读者,图书,借阅记录
WHERE 读者.读者号 = 借阅记录.读者号 and 图书.书号 = 借阅记录.书号 and 书名 = '《天龙八部》'

3.嵌套式查询描述SQL

1.查询8号读者2017年3月10日所借的图书的相关信息
S o l u t i o n 1 \color{#FF3030}{Solution1} Solution1

SELECT *
FROM 图书
WHERE 书号 in (
		SELECT 书号
		FROM 借阅记录
		WHERE 借阅日期 = '20170310' and 读者编号 = 8) 

S o l u t i o n 2 ( 带 e x i s t s ) \color{#FF3030}{Solution2(带exists)} Solution2(exists)

SELECT *
FROM 图书
WHERE EXISTS(
	SELECT *
	FROM 借阅记录
	WHERE 书号 = 图书.书号 and 读者编号 = '8' and 借阅日期 = '20170310')

2.查询超期归还图书的读者姓名和单位

SELECT  姓名,单位
FROM 读者
WHERE 读者 in (
	SELECT 借阅记录,读者编号
	FROM 借阅记录,还书记录
	WHERE借阅记录.读者号 = 还书记录.读者号 and 借阅记录.书号 = 还书记录.书号 and 应还日期 < 归还日期)

3. 查询借阅过《天龙八部》的读者的信息
S o l u t i o n 1 \color{#FF3030}{Solution1} Solution1

SELECT *
FROM 读者
WHERE 读者编号 in (
	SELECT 读者编号
	FROM 借阅记录
	WHERE 书号 = (
		SELECT 书号
		FROM 图书
		WHERE 书名 = '《天龙八部》')
	)

S o l u t i o n 2 ( 带 e x i s t s ) \color{#FF3030}{Solution2(带exists)} Solution2(exists)

SELECT *
FROM 读者
WHERE EXISTS(
   SELECT *
   FROM 借阅记录
   WHERE 读者编号 = 读者.读者编号 and  EXISTS(
   				SELECT *
   				FORM 图书
   					WHERE 书号 = 借阅记录.书号 and 书名 = '《天龙八部》')
   				)

4.查询借阅过“金庸”所有著作的读者的姓名

SELECT 姓名
FROM 读者
WHERE not EXISTS(
	SELECT *
	FROM 图书(怎样的书?)
	WHERE 作者 = '金庸' and not EXISTS(
		SELECT *
		FROM 借阅记录
		WHERE 读者号 = 读者.读者号 and 书号 = 图书.书号
		)
	)

5.查询没有借阅过任何图书的读者的姓名
S o l u t i o n 1 \color{#FF3030}{Solution1} Solution1

SELECT 姓名
FROM 读者
WHERE 读者编号 not in (
	SELECT 读者编号
	FROM 借阅记录
	WHERE 读者编号 = 读者.读者编号
	)

S o l u t i o n 2 ( 带 e x i s t s ) \color{#FF3030}{Solution2(带exists)} Solution2(exists)

SELECT 姓名
FROM 读者
WHERE 读者编号 not EXISTS(
	SELECT *
	FROM 借阅记录
	WHERE 读者编号 = 读者.读者编号
	)

写在最后

本文作者才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请与作者联系,望悉知

SQL是高级的非过程化编程语言,是沟通数据库服务器和客户端的重要工具,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以,具有完全不同底层结构的不同数据库系统,可以使用相同的SQL语言作为数据输入与管理的SQL接口。 它以记录集合作为操作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使它具有极大的灵活性和强大的功能,在多数情况下,在其他语言中需要一大段程序实现的功能只需要一个SQL语句就可以达到目的,这也意味着用SQL语言可以写出非常复杂的语句。    结构化查询语言(Structured Query Language)最早是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。如今无论是像Oracle、Sybase、DB2、Informix、SQL Server这些大型的数据库管理系统,还是像Visual Foxpro、PowerBuilder这些PC上常用的数据库开发系统,都支持SQL语言作为查询语言。    美国国家标准局(ANSI)与国际标准化组织(ISO)已经制定了SQL标准。ANSI是一个美国工业和商业集团组织,负责开发美国的商务和通讯标准。ANSI同时也是ISO和International Electrotechnical Commission(IEC)的成员之一。ANSI 发布与国际标准组织相应的美国标准。1992年,ISO和IEC发布了SQL国际标准,称为SQL-92。ANSI随之发布的相应标准是ANSI SQL-92。ANSI SQL-92有时被称为ANSI SQL。尽管不同的关系数据库使用的SQL版本有一些差异,但大多数都遵循 ANSI SQL 标准。SQL Server使用ANSI SQL-92的扩展集,称为T-SQL,其遵循ANSI制定的 SQL-92标准。    SQL语言包含4个部分:    数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句。    数据操作语言(DML),例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。    数据查询语言(DQL),例如:SELECT语句。    数据控制语言(DCL),例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句。    SQL语言包括三种主要程序设计语言类别的语句:数据定义语言(DDL),数据操作语言(DML)及数据控制语言(DCL)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值