数据库系统原理实验报告5 | 数据查询

本文档详细记录了一位博主整理的数据库系统概论实验报告,涉及多种SQL查询操作,如筛选特定读者信息、查找订购图书的城市、图书订购数量统计等,旨在帮助学习者理解和实践数据库查询技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整理自博主本科《数据库系统原理》专业课自己完成的实验报告,以便各位学习数据库系统概论的小伙伴们参考、学习。

专业课本:

————

本次实验使用到的图形化工具:Heidisql

目录

一、实验目的

二、实验内容

1.找出读者所在城市是“shanghai”的身份是“professor”的读者,或所在城市名包含“jing”的身份为“student”的读者的读者号及身份,按读者号的降序排列

2.对每一种有读者订购的图书,找出书号及有读者订购该书读者所在的所有城市,输出结果包括:书号和城市(输出的列取别名)

3.找出订购了书号为B2的图书的读者姓名及所在城市(用两种方法做:连接、嵌套)

4.找出有一个以上读者订购的图书书号和图书名 

5.求至少订购了一本《Pascal》的读者姓名

6.找出没有订购B1号图书的读者号

7.找出价格大于等于15.00或者读者R2最近订购的图书的书号及书名

8.求图书B2的订购数

9.查询订购的书的数量不确定的(qty是空值),读者编号和书号

10.查询图书单价不是15,17,10的图书的图书号和图书名及价格 

11.查询所有订购了图书的读者的读者号和姓名

12.查询单价小于等于10的所有图书被读者订购的数量,输出书名和订购总数量 

13.查询订购了至少两种书的读者姓名和书的种类数

14.查询书价比同一出版社的平均书价高的图书的书号和书名

15.查询每个出版社书价最高的图书是哪些, 输出出版社,书号,书名

16.找出没有订购B2号图书的读者号,读者的姓名(用存在谓词查询)

17.查询读者R4订购的图书的书号和书名(用存在谓词查询)

18.查询订购了全部书籍的读者的姓名

19.查询至少订购了R1所订购的书籍的读者的编号 

20.把所有Commerce出版社的图书的价格都增加1 

21.把B2读者订购的所有图书的数量改为0

23.查出每个出版社的图书的平均价格,保存到数据库中

24.将所有Beijing读者订购的图书数量改为一本 

25.删去Shanghai的所有读者的订书单

三、实验结果总结

四、实验结果的运用


缅怀!

一、实验目的

1、掌握 数据查询select语句,能够灵活使用它的各个子句进行各种查询,包括分组查询、链接查询、嵌套查询、集合查询等。

2、进一步掌握数据更新语句,insert,update,delete,尤其是数据更新的嵌套操作。


二、实验内容

现有读者购书数据库,该数据库中包含三个表:读者相关信息表R,图书信息表B,读者订购图书表OD。

具体情况如下表:

  1. 根据以上表的情况,做出如下查询,逐题给出代码及截图。

  2. R-B-OD数据库建库建表代码:

  3. CREATE DATABASE RBOD2;
    
    USE RBOD2;
    
    CREATE TABLE R
    (
    Rno CHAR(4)   PRIMARY KEY,
    Rname VARCHAR(20),
    STATUS VARCHAR(20),
    CITY VARCHAR(20)
    );
    
    
    CREATE TABLE B
    (
    Bno CHAR(4)   PRIMARY KEY,
    Bname VARCHAR(20),
    Price numeric(5,2),
    Pub VARCHAR(20)
    );
    
    
    CREATE TABLE OD
    (
    Rno CHAR(4) NOT NULL,
    Bno CHAR(4) NOT NULL,
    Qty SMALLINT,
    PRIMARY KEY(Rno,Bno),
    FOREIGN KEY (Rno) REFERENCES R(Rno),
    FOREIGN KEY (Bno) REFERENCES B(Bno)
    );
    
    INSERT INTO R VALUES('R1','CHenBing','Student','Beijing');
    INSERT INTO R VALUES('R2','ZhouYucai','Professor','Shanghai');
    INSERT INTO R VALUES('R3','WangLiping','Doctor','Nanjing');
    INSERT INTO R VALUES('R4','LiYong','Student','Shanghai');
    INSERT INTO R VALUES('R5','DingWei','Assistant','Beijing');
    
    
    INSERT INTO B VALUES('B1','Modern',15,'Education');
    INSERT INTO B VALUES('B2','Pascal',17,'Qinghua');
    INSERT INTO B VALUES('B3','Scentific',10,'Commerce');
    INSERT INTO B VALUES('B4','PenHuai',9.8,'People');
    INSERT INTO B VALUES('B5','Date Stru',12.6,'Commerce');
    
    INSERT INTO OD VALUES('R1','B1',2);
    INSERT INTO OD VALUES('R1','B2',1);
    INSERT INTO OD VALUES('R2','B1',3);
    INSERT INTO OD VALUES('R2','B2',3);
    INSERT INTO OD VALUES('R2','B4',4);
    INSERT INTO OD VALUES('R3','B3',1);
    INSERT INTO OD VALUES('R4','B2',2);
    INSERT INTO OD VALUES('R4','B5',1);

  4. 1.找出读者所在城市是“shanghai”的身份是“professor”的读者,或所在城市名包含“jing”的身份为“student”的读者的读者号及身份,按读者号的降序排列

  5. 代码:
  6. SELECT rno,rname
    FROM r
    WHERE city='Shanghai' AND STATUS='professor'
    UNION 
    SELECT rno,rname
    FROM r
    WHERE city LIKE '%jing%' AND STATUS='student'
    ORDER BY rno DESC;

      运行结果:

  7. 2.对每一种有读者订购的图书,找出书号及有读者订购该书读者所在的所有城市,输出结果包括:书号和城市(输出的列取别名)

  8. 代码:
  9. SELECT bno 书号,city 城市
    FROM od,r
    WHERE od.Rno=r.Rno;
    运行结果:

3.找出订购了书号为B2的图书的读者姓名及所在城市(用两种方法做:连接、嵌套)

代码:

SELECT rname,city
FROM od,r
WHERE od.Rno=r.Rno AND bno='B2'

运行结果: 

  

代码:

SELECT rname,city
FROM r
WHERE rno IN (
	SELECT rno
	FROM od
	WHERE bno='B2'
);

运行结果:

4.找出有一个以上读者订购的图书书号和图书名 

代码:

SELECT od.Bno,bname
FROM b,od
WHERE b.Bno=od.Bno
GROUP BY Bno HAVING COUNT(*)>1

 运行结果:

  

5.求至少订购了一本《Pascal》的读者姓名

代码:

SELECT rname
FROM r,b,od
WHERE r.Rno=od.Rno AND b.Bno=od.Bno AND qty>=1 AND bname='Pascal'

运行结果:

6.找出没有订购B1号图书的读者号

代码:

SELECT rno
FROM r
WHERE rno NOT IN(
	SELECT rno
	FROM od
	WHERE Bno='B1' 
);

运行结果:

7.找出价格大于等于15.00或者读者R2最近订购的图书的书号及书名

代码:

SELECT bno,bname
FROM b
WHERE price>=15
UNION
SELECT b.Bno,bname
FROM od,b
WHERE od.Bno=b.Bno AND rno='R2'

 运行结果:

  

8.求图书B2的订购数

代码:

SELECT SUM(Qty)
FROM od
WHERE Bno='B2';

运行结果:

9.查询订购的书的数量不确定的(qty是空值),读者编号和书号

代码:

SELECT rno,bno
FROM od
WHERE qty IS NULL;

运行结果:

10.查询图书单价不是15,17,10的图书的图书号和图书名及价格 

代码:

SELECT bno,bname,price
FROM b
WHERE price NOT IN (15,17,10);

运行结果:

11.查询所有订购了图书的读者的读者号和姓名

代码:

SELECT rno,rname
FROM r
WHERE EXISTS (
	SELECT *
	FROM od
	WHERE od.Rno=r.Rno
)

运行结果:

12.查询单价小于等于10的所有图书被读者订购的数量,输出书名和订购总数量 

代码:

SELECT Bname,SUM(qty)
FROM b,od
WHERE Price <= 10 AND b.bno=od.Bno
GROUP BY od.Bno,Bname;

运行结果:

13.查询订购了至少两种书的读者姓名和书的种类数

代码:

SELECT rname,COUNT(bno) 书的种类数
FROM od,r
WHERE od.Rno=r.Rno
GROUP BY od.Rno HAVING COUNT(*)>=2

运行结果:

14.查询书价比同一出版社的平均书价高的图书的书号和书名

代码:

SELECT bno,bname
FROM b x
WHERE price> (
	SELECT AVG(price)
	FROM b y
	WHERE x.Pub=y.Pub 
)

运行结果:

15.查询每个出版社书价最高的图书是哪些, 输出出版社,书号,书名

代码:

SELECT pub,bno,bname
FROM b x
WHERE price= (
	SELECT MAX(price)
	FROM b y
	WHERE x.Pub=y.Pub
);

运行结果:

16.找出没有订购B2号图书的读者号,读者的姓名(用存在谓词查询)

代码:

SELECT rno,rname
FROM r
WHERE NOT EXISTS (
	SELECT *
	FROM od
	WHERE od.rno=r.Rno AND bno='B2'
);

运行结果:

17.查询读者R4订购的图书的书号和书名(用存在谓词查询)

代码:

SELECT bno,bname
FROM b
WHERE EXISTS (
	SELECT *
	FROM od
	WHERE od.bno=b.bno AND rno='R4'
);

运行结果:

18.查询订购了全部书籍的读者的姓名

代码:

SELECT rname
FROM r
WHERE NOT EXISTS (
	SELECT *
	FROM b
	WHERE NOT EXISTS (
		SELECT *
		FROM od
		WHERE od.Rno=r.Rno AND od.Bno=b.bno
	)
);

运行结果:

19.查询至少订购了R1所订购的书籍的读者的编号 

代码:

SELECT DISTINCT  rno
FROM od X
WHERE NOT EXISTS (
	SELECT *
	FROM od y
	WHERE rno='R1' AND NOT EXISTS (
		SELECT *
		FROM od z
		WHERE z.Rno=x.rno AND z.Bno=y.Bno
	)
);

运行结果:

20.把所有Commerce出版社的图书的价格都增加1 

代码:

UPDATE b 
SET price=price+1
WHERE pub='Commerce';

运行结果:

21.把B2读者订购的所有图书的数量改为0

代码:

UPDATE od
SET qty=0
WHERE rno='R2'

运行结果:

22.查询读者表中是否有一个Beijing的读者WangWei,如果有,把他删除

代码:

DELETE FROM r
WHERE city='Beijing' AND rname='WangWei'

运行结果:

23.查出每个出版社的图书的平均价格,保存到数据库中

代码:

CREATE TABLE pub_price (
	pub CHAR(15),
	Avg_price smallint
);
INSERT 
INTO pub_price(pub,Avg_price)
SELECT pub,AVG(price)
FROM b
GROUP BY pub;

运行结果:

24.将所有Beijing读者订购的图书数量改为一本 

代码:

update od
SET Qty=1
WHERE Rno IN
(
	select Rno
	from R
	where CITY='北京'
);

运行结果:

25.删去Shanghai的所有读者的订书单

代码:

delete
from od
where Rno IN
(
	select Rno
	from R
	where CITY='上海'
);

运行结果:

(备注:由于我是代码全部写完,执行过了之后最后再截图粘贴到实验报告的,后五题是增删改,有的数据已经被更改过了,再运行前面的查询代码截图时结果可能会和正确的不太一样。不过前面的代码我是多次更改后保证正确之后才写上去的,实际结果应没有问题。)


三、实验结果总结

 1、本次实验我用时3个半小时,做得比较慢,有些地方有卡顿。单个查询作业没什么问题,但综合起来做,由于可选择的方法太多,以及对题目表述的不熟悉,导致完成起来有些不熟练。

2、为了避免上述问题,我需要再次进行综合性的梳理,以及保持每天的练习。

3、本次实验中遇到的部分问题通过上网搜索以及与同学讨论,已经成功解决。

4、在照着书敲代码时,结果报出了语法错误。意识到书本上的不是mysql,在实验过程中不能盲目跟随课本。

5、应当对之前章节或实验中学习的建表删除更新的语句语法进行复习,以免遗忘。 


四、实验结果的运用

在educ数据库中的应用。

educ数据库建库建表代码:

create database educ;
use educ;
CREATE TABLE Student
(
Sno CHAR(9) NOT NULL PRIMARY KEY,
Sname CHAR(20),
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);

CREATE TABLE Course
(
Cno CHAR(4) NOT NULL PRIMARY KEY,
Cname CHAR(40) NOT NULL,
Cpno CHAR(4),
Ccredit SMALLINT,
FOREIGN KEY (Cpno) REFERENCES Course(Cno)
);

CREATE TABLE SC
(
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno),
FOREIGN KEY (Cno) REFERENCES Course(Cno)
);

INSERT INTO Student VALUES('200215121','李勇','男',20,'CS');
INSERT INTO Student VALUES('200215122','刘晨','女',19,'CS');
INSERT INTO Student VALUES('200215123','王敏','女',18,'MA');
INSERT INTO Student VALUES('200215125','张立','男',19,'IS');
INSERT INTO Student VALUES('200215124','张立','男',19,'IS');

INSERT INTO Course VALUES('2','数学',null,2);
INSERT INTO Course VALUES('6','数据处理',null,2);
INSERT INTO Course VALUES('7','pascal语言','6',4);
INSERT INTO Course VALUES('5','数据结构','7',4);
INSERT INTO Course VALUES('4','操作系统','6',3);
INSERT INTO Course VALUES('1','数据库','5',4);
INSERT INTO Course VALUES('3','信息系统','1',4);

INSERT INTO SC VALUES('200215121','1',92);
INSERT INTO SC VALUES('200215121','2',85);
INSERT INTO SC VALUES('200215121','3',88);
INSERT INTO SC VALUES('200215122','2',90);
INSERT INTO SC VALUES('200215122','3',80);

代码:

/* 嵌套查询(不相关) */
SELECT sno,sname
FROM student
WHERE ssex='女' and sno IN 
		(SELECT sno
		FROM sc
		);
		
SELECT sno,cno 
FROM sc
WHERE sno IN 
		(SELECT sno
		FROM student
		WHERE sdept='CS'
		);


/* 嵌套查询(相关)	*/
SELECT cno,sno
FROM sc x
WHERE grade<
		(SELECT AVG(grade)
			FROM sc y
			WHERE x.Sno=y.Sno
		);
		
SELECT sno,AVG(grade)
FROM sc
GROUP BY sno HAVING  AVG(grade)>80

SELECT cno,sno
FROM sc x
WHERE grade<
		(SELECT avg(grade)
		 FROM sc y
		 WHERE x.sno=y.sno
		);

SELECT sno,sname
FROM student x
WHERE sage <
		(SELECT AVG(sage)
		FROM student y
		WHERE x.Sno=y.Sno
		GROUP BY sdept
		);
		
SELECT sno,sname
FROM student
WHERE NOT EXISTS (
		SELECT *
		FROM sc
		WHERE sno=student.Sno AND cno='1'
);


/* 嵌套查询(全称谓词) */
SELECT cno,cname
FROM course
WHERE NOT EXISTS (
		SELECT *
		FROM sc
		WHERE cno=course.Cno AND sno='200215121'
);

SELECT distinct sno
FROM sc X
WHERE NOT EXISTS (
	SELECT *
	FROM sc y
	WHERE y.Sno='200215122' AND NOT EXISTS (
		SELECT *
		FROM sc z
		WHERE z.sno=x.sno AND z.cno=y.Cno));
		
SELECT DISTINCT sno
FROM sc x
WHERE NOT EXISTS (
	SELECT *
	FROM sc y
	WHERE y.Cno='1' AND NOT EXISTS (
		SELECT *
		FROM sc z
		WHERE z.Cno=y.Cno AND z.Sno=x.Sno));
		
SELECT sname
FROM student
WHERE NOT EXISTS (
	SELECT *
	FROM course
	WHERE NOT EXISTS (
		SELECT *
		FROM sc
		WHERE sno=student.Sno AND cno=course.cno));
		
SELECT sname
FROM student
WHERE sno IN (
	SELECT sno
	FROM sc
	GROUP BY sno HAVING COUNT(*)>3);
	
SELECT sno,sname
FROM student x
WHERE sage<(
	SELECT AVG(sage)
	FROM student y
	WHERE y.Sdept=x.Sdept);
	
SELECT sno
FROM sc X
WHERE grade=(
	SELECT MIN(grade)
	FROM sc y
	WHERE y.Cno=x.Cno);	



/* 删除(带有子查询的) */
delete
from student
where sno IN
(
	select sno
	from sc
	where grade='88'
);


/* 更新(带有子查询的) */
update sc
SET grade=90
WHERE sno IN
(
	select sno
	from student
	where sdept='IS'
);
1、 Find the name, loan number and loan amount of all customers; rename the column name loan_number as loan_id. 2、 Find the names of all customers whose street includes the substring “Main”. 3、Find all customers who have a loan, an account, or both: 4、Find all customers who have both a loan and an account. 5、Find all customers who have an account but no loan. 6、Find the average account balance at the Perryridge branch. 7、 Find the number of tuples in the customer relation. 8、 Find the number of depositors in the bank. 9、 Find the number of depositors for each branch. 10、Find the names of all branches where the average account balance is more than $1,200. 11、Find all loan number which appear in the loan relation with null values for amount. 12、Find all customers who have both an account and a loan at the bank. 13、Find all customers who have a loan at the bank but do not have an account at the bank 14、Find all customers who have both an account and a loan at the Perryridge branch 15、Find all branches that have greater assets than some branch located in Brooklyn. 16、Find the names of all branches that have greater assets than all branches located in 1、创建一个School数据库,该数据库的主数据文件逻辑名称为SCHOOL_data,物理文件名为School.mdf,初始大小为10MB,最大尺寸为无限大,增长速度为10%;数据库的日志文件逻辑名称为School_log,物理文件名为School.ldf,初始大小为1MB,最大尺寸为5MB,增长速度为1MB。 2、用SQL语句建立上述表,自定义主键和外键,对于student表建立约束条件:ssex仅能取male或female;sage在18和22之间。并完成下面的查询语句1查询所有选修过“Bibliometrics”课的学生的姓名和成绩; 2、查询考试成绩不及格的学生的个数; 3、查询名字中至少含有一个“z”字符的学生的姓名、学号和性别; 4、查询选修了“Introduction to the Internet”课程的学生的学号及其成绩,查询结果按分数的降序排列; 5查询“Zuo li”同学选修课程的总学时(time)数 6、查询年龄不大于20岁的学生的平均考试成绩; 7、查询 “computer science”专业学生选修 “Database System”的人数; 8、查询同时选修课程“Database System”和“Introduction to the Internet”的学生姓名; 9、查询选修的课程中含有“Wang gang”同学所有选修课程的学生姓名。 10、查询“Information Technology for Information Management”考试成绩为空的学生姓名及专业名称。 11查询“computer science”专业学生每个人的选修课总学分。 12、查询个人考试平均成绩高于专业平均成绩的学生姓名 13、查询个人考试平均成绩高于女生平均成绩的男生姓名 14、查询比“computer science”专业所有学生年龄都大的学生姓名。 15查询考试成绩仅有一科不及格学生姓名
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值