实验四:SQL Serve中的嵌套查询、数据更新和视图

实验内容与完成情况(记录所有的实验过程):

按照《数据库系统概论》(第五版)P79页的学生课程数据库和P70-71页中的SPJ数据库完成以下查询

  • 嵌套查询中的存在量词

1.查询还没有给任何工程供应过零件的供应商号sno和供应商名称sname,用带EXISTS谓词的子查询或相关联子查询实现。

SELECT SNO 供应商号,SNAME 供应商名称

FROM S

WHERE NOT EXISTS(

SELECT *

FROM SPJ

WHERE SNO=S.SNO

);

运行结果:

2.查询使用了全部零件的工程号JNO,用带EXISTS谓词的子查询实现。

SELECT JNO

FROM J

WHERE NOT EXISTS(

SELECT *

FROM P

WHERE NOT EXISTS(

SELECT *

FROM SPJ

WHERE JNO = J.JNO AND PNO = P.PNO

)

);

运行结果:

3.查询至少选修了’1’号和’2’号课程的学生学号, 用带EXISTS谓词的子查询或自身连接查询实现。

SELECT Sno

FROM Student

WHERE EXISTS (

SELECT *

FROM SC

WHERE Sno = Student.Sno AND Cno =1 AND EXISTS (

SELECT *

FROM SC

WHERE Sno = Student.Sno AND Cno =2

)

);

运行结果:

附加题:查询至少用了供应商S1所供应的所有零件的工程号JNO,用带EXISTS谓词的子查询实现。

SELECT DISTINCT JNO 工程号

FROM SPJ

WHERE EXISTS(

SELECT *

FROM S

WHERE SPJ.SNO=SNO

);

运行结果:

  • 数据更新 

1.P130 (8)把全部蓝色零件的颜色改为红色;

UPDATE P

SET COLOR = '红'

WHERE COLOR = '蓝';

更新前的表格:

更新后的表格:

2.将S5供应给J1的零件P3改为由S1供应,请作必要的修改;

UPDATE SPJ

SET SNO = 'S1'

WHERE SNO = 'S5' AND JNO = 'J1' AND PNO = 'P3';

更新前:

更新后:

3.从供应商关系中删除S3的记录,并从供应情况关系中删除相应的记录。

DELETE

FROM SPJ

WHERE SNO = 'S3'

DELETE

FROM S

WHERE SNO = 'S3';

更新前:

更新后:

4.删除所有信息系(IS)同学的信息。

DELETE

FROM Student

WHERE Sdept = 'IS';

更新前:

更新后:

自行设计案例对学生-课程数据库的数据更新,并观察是否有违反数据的完整性约束。

--添加信息

INSERT INTO Student(Sno,Sname,Ssex,Sage,Sdept)

VALUES('3171911134','黄湘平','男',21,'CS');

 

INSERT INTO SC(Sno,Cno,Grade)

VALUES('3171911134',4,99);

 

--更新信息

UPDATE SC

SET Grade = 100

WHERE Sno = '3171911134' AND Cno = 4;

 

--删除信息

DELETE

FROM SC

WHERE Sno = '3171911134';

 

DELETE

FROM Student

WHERE Sno = '3171911134';

 

观察结果:没有违反数据的完整性约束!

  • 视图
  1. P130 (9)请为”三建”工程项目建立一个供应情况的视图,包括供应商代码(SNO)、零件代码(PNO)、供应数量(QTY)。

CREATE VIEW view_spj AS

SELECT SNO,PNO,QTY

FROM SPJ

WHERE JNO = (

SELECT JNO

FROM J

WHERE JNAME = '三建'

);

针对该视图完成下列查询:

1.找出”三建”工程项目使用的各种零件代码及其数量;

SELECT PNO,QTY

FROM view_spj;

运行结果:

2.找出供应商S2的供应情况;

SELECT *

FROM view_spj

WHERE SNO = 'S2';

运行结果:

创建一个学生成绩统计视图,包括学号,姓名,选课门数,平均分,最高分。(没有选课的学生不参加统计)。

CREATE VIEW view_cal_gradeOfStudent AS

SELECT S.SNO 学号,S.Sname 姓名,COUNT(*) 选课门数, AVG(SC.Grade)平均分,MAX(SC.Grade)最高分

FROM Student S,SC

WHERE S.Sno = SC.Sno

GROUP BY S.Sno,S.sname;

运行结果:

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值