整理自博主本科《数据库系统原理》专业课自己完成的实验报告,以便各位学习数据库系统概论的小伙伴们参考、学习。
专业课本:
————
本次实验使用到的图形化工具: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。
具体情况如下表:
-
根据以上表的情况,做出如下查询,逐题给出代码及截图。
-
R-B-OD数据库建库建表代码:
-
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);
-
1.找出读者所在城市是“shanghai”的身份是“professor”的读者,或所在城市名包含“jing”的身份为“student”的读者的读者号及身份,按读者号的降序排列
- 代码:
-
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;
运行结果:
-
2.对每一种有读者订购的图书,找出书号及有读者订购该书读者所在的所有城市,输出结果包括:书号和城市(输出的列取别名)
- 代码:
-
运行结果: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'
);