数据库第一章实验报告

来源:工作范文网 时间:2020-11-21 09:50:43

PAGE 2

《数据库原理及应用》

实验报告

题目:实验四、五、六 SQL语言(视图、数据控制、空值处理)

学号: 132935

姓名: 么红帅

专业班级: 软件131

指导教师: 张满囤

完成日期: 2015年11月9日

实验1.1 数据定义

一、实验目的

熟悉SQL的数据定义语言,能够熟练地使用SQL语句来创建和更改基本表,创建和取消索引。

二、实验内容

(1) 创建数据库表CUSTOMERS(CID,CNAME,CITY,DISCNT)、数据库表AGENTS(AID,ANAME,CITY,PERCENT)、数据库表PRODUCTS(PID,PNAME)。其中CID、AID、PID分表是各表的主键,具有唯一性约束。

(2) 创建数据库表ORDERS(ORDNA,MONTH,CID,AID,PID,QTY,DOLLARS)。其中ORDNA分表是主键,具有唯一性约束。CID、AID、PID分别是外键引用自表CUSTOMERS、表AGENTS,表PRODUCTS。

(3) 增加数据库表PRODUCTS三个属性列:CITY、QUANTITY、PRICE。

(4) 为以上四个表建立各自的按主键增序排列的序列。

(5) 取消(4)建立的四个索引。

三、实验结果

(1)

CREATE TABLE CUSTOMERS(

CID CHAR(8) UNIQUE,

CNAME CHAR(20),

CITY CHAR(20),

DISCNT INT,

PRIMARY KEY(CID))

CREATE TABLE AGENTS(

AID CHAR(8) UNIQUE,

ANAME CHAR(20),

CITY CHAR(20),

[PERCENT] FLOAT,

PRIMARY KEY(AID))

CREATE TABLE PRODUCTS(

PID CHAR(8) UNIQUE,

PANME CHAR(20),

PRIMARY KEY(PID))

(2)

CREATE TABLE ORDERS(

ORDNA CHAR(8) UNIQUE,

MONTH INT,

CID CHAR(8) UNIQUE,

AID CHAR(8) UNIQUE,

PID CHAR(8) UNIQUE,

QTY INT,

DOLLARS FLOAT,

PRIMARY KEY(ORDNA),

FOREIGN KEY(CID) REFERENCES CUSTOMERS,

FOREIGN KEY(AID) REFERENCES AGENTS,

FOREIGN KEY(PID) REFERENCES PRODUCTS)

(3)

ALTER TABLE PRODUCTS ADD CITY CHAR(20)

ALTER TABLE PRODUCTS ADD QUANTITY INT

ALTER TABLE PRODUCTS ADD PRICE FLOAT

(4)

CREATE INDEX XSNO ON CUSTOMERS(CID)

CREATE INDEX XSNO ON AGENTS(AID)

CREATE INDEX XSNO ON PRODUCTS(PID)

CREATE INDEX XSNO ON ORDERS(ORDNA)

(5)

DROP INDEX CUSTOMERS.XSNO

DROP INDEX AGENTS.XSNO

DROP INDEX PRODUCTS.XSNO

DROP INDEX ORDERS.XSNO

实验1.2 数据查询

实验目的

熟悉SQL语句的数据查询语言,能够使用SQL语句对数据库进行单表查询、连接查询、嵌套查询、集合查询和统计查询。

实验内容

(1)查询全部课程的详细记录。

(2)查询所有有选课的学生的编号。

(3)查询课时<80(小时)的课程的编号。

(4)请找出总分超过400分的编号

(5)查询课程的总数。

(6)查询所有课程和选修该课程的学生总数。

(7)查询选修成绩合格的课程超过两门的学生的编号。

(8)统计各个学生的选修课程数目和平均成绩。

(9)查询选修java的所有学生的编号及姓名。

(10)分别使用等值连接和谓词IN两种方式查询姓名为sssht的学生所选的课程的编号和成绩。

(11) 查询课时比c++多的课程的名称。

(12)查询选修c++课程的成绩比姓名为znkoo学生高的所有学生的编号和姓名。

(13)找出和学生883794999或学生850955252的年级一样的学生的姓名。

(14)查询没有选修java的学生的名称。

(15) 查询课时最少的课程的详细信息。

(16)查询工资最高的教师的编号和开设的课号。

(17)找出选修课程ERP成绩最高的学生编号。

(18)查询没有学生选的课程的名称。

(19)找出讲授课程UML的教师讲授的所有课程名称。

(20查询选修了编号200102901的教师开设所有课程的学生编号。

(21)查询选修课程database的学生集合与选修UML的学生集合的并集。

(22)实现集合交运算,查询级选修课程database又选修UML的学生的编号。

(23)实现集合减运算,查询级选修课程database而又没有选修UML的学生的编号。

三、实验结果

(1)

SELECT *

FROM COURSES;

(2)

SELECT sid

FROM CHOICES;

(3)

SELECT cid

FROM COURSES

WHERE hour<88;

(4)

SELECT sid

FROM CHOICES

GROUP BY sid HAVING SUM(score)>400;

(5)

SELECT COUNT(cid)

FROM COURSES;

(6)

SELECT cid,COUNT(sid)

FROM CHOICES

GROUP BY cid;

(7)

SELECT sid

FROM CHOICES

WHERE score>60

GROUP BY sid

HAVING COUNT(cid)>2;

(8)

SELECT sid,COUNT(cid),AVG(score)

FROM CHOICES

GROUP BY sid;

(9)

SELECT sid,sname

FROM STUDENTS

WHERE sid IN

(SELECT sid

FROM CHOICES

WHERE cid=(SELECT cid

FROM COURSES

WHERE cname='Java'));

(10)

等值连接:

SELECT cid,score

FROM STUDENTS,CHOICES

WHERE STUDENTS.sid=CHOICES.sid AND sname='sssht';

谓词IN:

SELECT cid,score

FROM CHOICES

WHERE sid IN

(SELECT sid

FROM STUDENTS

WHERE sname='sssht');

(11)

SELECT cname

FROM COURSES

WHERE hour>

(SELECT hour

FROM COURSES

WHERE cname='C++');

(12)

SELECT sid,sname

FROM STUDENTS

WHERE sid IN

(SELECT C1.sid

FROM CHOICES C1,CHOICES C2

WHERE C1.score>C2.score AND C1.cid=C2.cid

AND C1.cid=(SELECT cid FROM COURSES WHERE cname='c++')

AND C2.sid=(SELECT sid FROM STUDENTS WHERE sname='znkoo'));

(13)

SELECT sname

FROM STUDENTS

WHERE grade IN

(SELECT grade

FROM STUDENTS

WHERE sid='883794999' OR sid='850955252');

(14)

SELECT sname

FROM STUDENTS

WHERE sid NOT IN

(SELECT sid

FROM CHOICES

WHERE cid=

(SELECT cid

FROM COURSES

WHERE cname='Java'));

(15)

SELECT *

FROM COURSES

WHERE hour=(SELECT MIN(hour) FROM COURSES);

(16)

SELECT tid,cid

FROM CHOICES

WHERE tid IN

(SELECT tid

FROM TEACHERS

WHERE salary=

(SELECT MAX(salary)

FROM TEACHERS));

(17)

SELECT sid

FROM CHOICES

WHERE score=

(SELECT MAX(score)

FROM CHOICES

WHERE cid=

(SELECT cid

FROM COURSES

WHERE cname='ERP')) AND

cid=(SELECT cid

FROM COURSES

WHERE cname='ERP');

(18)

SELECT cname

FROM COURSES

WHERE cid NOT IN

(SELECT cid

FROM CHOICES);

(19)

SELECT cname

FROM COURSES

WHERE cid IN

(SELECT cid

FROM CHOICES

WHERE tid IN

(SELECT tid

FROM CHOICES

WHERE cid=

(SELECT cid

FROM COURSES

WHERE cname='UML')));

(20)

SELECT sid

FROM CHOICES

WHERE cid IN

(SELECT cid

FROM CHOICES

WHERE tid='200102901')

GROUP BY sid

HAVING COUNT(*)=

(SELECT COUNT(DISTINCT cid)

FROM CHOICES

WHERE tid='200102901');

(21)

SELECT sid

FROM CHOICES

WHERE cid=

(SELECT cid

FROM COURSES

WHERE cname='Database')

UNION

SELECT sid

FROM CHOICES

WHERE cid=

(SELECT cid

FROM COURSES

WHERE cname='UML');

(22)

SELECT C1.sid

FROM CHOICES C1,CHOICES C2

WHERE C1.cid=(SELECT cid FROM COURSES WHERE cname='Database')

AND C2.cid=(SELECT cid FROM COURSES WHERE cname='UML')

AND C1.sid=C2.sid;

(23)

SELECT C1.sid

FROM CHOICES C1,CHOICES C2

WHERE C1.cid=(SELECT cid FROM COURSES WHERE cname='Database')

AND C1.sid=C2.sid

AND C2.cid<>(SELECT cid FROM COURSES WHERE cname='UML');

实验1.3 数据更新

实验目的

熟悉数据库的数据更新操作,能够使用SQL语句对数据库进行数据的插入、更新、删除操作

实验内容

(1) 向STUDENTS表插入编号是800022222且姓名是WangLan的元组。

(2) 向 TEACHERS表插入元组(200001000,LXL,s4zrck@pew.net,3024)

(3) 将 TEACHERS表中编号为200010493的老师工资改为4000。

(4) 将 TEACHERS表中所有工资小于2500的老师工资改为2500。

(5) 将有编号200016731老师讲授的课程全部改成姓名rnupx的老师讲授。

(6) 更新编号800071780的学生年纪为2001。

(7) 删除没有学生选修的课程。

(8) 删除年级高于1998的学生信息。

(9) 删除没有选修课程的学生信息。

(10) 删除成绩不及格的选课记录。

三、实验结果

(1)

INSERT

INTO STUDENTS(sid,sname)

VALUES ('800022222','WangLan');

(2)

INSERT

INTO TEACHERS

VALUES ('200001000','LXL','s4zrck@pew.net',3024);

(3)

UPDATE TEACHERS

SET salary=4000

WHERE tid='200010493';

(4)

UPDATE TEACHERS

SET salary=2500

WHERE salary<2500;

(5)

UPDATE CHOICES

SET tid=(SELECT tid FROM TEACHERS WHERE tname='rnupx')

WHERE tid='200016721';

(6)

UPDATE STUDENTS

SET grade='2001'

WHERE sid='800071780';

(7)

DELETE

FROM COURSES

WHERE cid NOT IN

(SELECT DISTINCT cid

FROM CHOICES);

(8)

DELETE

FROM STUDENTS

WHERE grade<1998;

(9)

DELETE

FROM STUDENTS

WHERE sid NOT IN

(SELECT DISTINCT sid

FROM CHOICES);

(10)

DELETE

FROM CHOICES

WHERE score<60;

软件131-么红帅-132935

PAGE 14

实验1.4 视图

实验目的

熟悉SQL支持的有关视图的操作,能够熟练地使用SQL语句来创建需要的视图,对视图进行查询和取消视图。

实验内容

(1) 定义选课信息和课程名称的视图VIEWC;

CREATE VIEW VIEWC

AS

SELECT CHOICES.no,CHOICES.sid,CHOICES.tid,CHOICES.score,COURSES.cname

FROM CHOICES,COURSES

WHERE CHOICES.cid=COURSES.cid;

(2) 定义学生姓名与选课信息的视图VIEWS;

CREATE VIEW VIEWS

AS

SELECT STUDENTS.sname,CHOICES.no,CHOICES.tid,CHOICES.cid,CHOICES.score

FROM STUDENTS,CHOICES

WHERE STUDENTS.sid=CHOICES.sid;

(3) 定义年级低于1998的学生的视图S1(SID,SNAME,GRADE);

CREATE VIEW S1(sid,sname,grade)

AS

SELECT sid,sname,grade

FROM STUDENTS

WHERE grade>1998;

(4) 查询学生为“uxjof”的学生的选课信息;

SELECT *

FROM VIEWS

WHERE sname='uxjof';

(5) 查询选修课程“UML”的学生的编号和成绩;

SELECT sid,score

FROM VIEWC

WHERE cname='UML';

(6) 向视图S1插入记录(Lily,2001”);

INSERT

INTO S1

VALUES (,'Lily',2001);

(7) 定义包括更新和插入约束的视图S1,尝试向视图插入记录(Lily,1997”),删除所有年级为1999的学生记录,讨论更新和插入约束带来的影响。

定义视图:

CREATE VIEW S1(sid,sname,grade)

AS

SELECT sid,sname,grade

FROM STUDENTS

WHERE grade>1998

WITH CHECK OPTION;

插入元组:

INSERT

INTO S1

VALUES(,'Lily',1997);

执行结果:

消息550,级别16,状态1,第1 行

试图进行的插入或更新已失败,原因是目标视图或者目标视图所跨越的某一视图指定了WITH CHECK OPTION,而该操作的一个或多个结果行又不符合CHECK OPTION 约束。

语句已终止。

结果分析:

WITH CHECK OPTION表示对视图进行操作时要满足子查询的条件表达式,grade=1997本题的条件grade>1998不符,因此在本题中插入这个元组是不成功的。

删除元组:

DELETE

FROM S1

WHERE grade=1999;

执行结果:

删除成功

(8) 在视图VIEWS中将姓名为“uxjof”的学生的选课成绩都加上5分。

UPDATE VIEWS

SET score=score+5

WHERE sname='uxjof';

(9) 取消以上建立的所有视图。

DROP VIEW VIEWC

DROP VIEW VIEWS

DROP VIEW S1;

实验1.5 数据控制

实验目的

熟悉SQL的数据控制功能,能够使用SQL语句来向用户授予和收回权限。

实验内容

(1) 授予所有用户对表STUDENTS的查询权限。

GRANT SELECT

ON STUDENTS

TO PUBLIC;

(2) 授予所有用户对表COURSES的查询和更新权限。

GRANT SELECT,UPDATE

ON COURSES

TO PUBLIC;

(3) 授予USER1对表TEACHERS的查询,更新工资的权限,且允许USER1可以传播这些权限。

GRANT SELECT,UPDATE(salary)

ON TEACHERS

TO USER1

WITH GRANT OPTION;

(4) 授予USER2对表CHOICES的查询,更新成绩的权限。

GRANT SELECT,UPDATE(score)

ON CHOICES

TO USER2;

(5) 授予USER2对表TEACHERS的除了工资之外的所有信息的查询。

CREATE VIEW TV

AS

SELECT tid,tname,email

FROM TEACHERS;

GRANT SELECT

ON TV

TO UESR2;

(6) 由USER1授予USER2对表TEACHERS的查询权限和传播的此项权限的权利。

GRANT SELECT

ON TEACHERS

TO USER2

WITH GRANT OPTION;

(7) 由USER2授予USER3对表TEACHERS的查询权限,和传播的此项权限的权利。再由USER3授予USER2上述权限,这样的SQL语句能否成功得到执行?

GRANT SELECT

ON TEACHERS

TO USER3

WITH GRANT OPTION;

GRANT SELECT

ON TEACHERS

TO USER2

WITH GRANT OPTION;

(8) 取消USER1对表STUDENTS的查询权限,考虑由USER2的身份对表STUDENTS进行查询,操作能否成功?为什么?

REVOKE SELECT

ON TEACHERS

FROM UESR1 CASCADE;

操作不成功,取消授权操作的时候存在级联效应。

(9) 取消USER1和USER2的关于表COURSES的权限。

REVOKE SELECT,UPDATE

ON COURSES

FROM UESR1,UESR2;

实验1.6 空值和空集的处理

一、实验目的

认识NULL值在数据库中的特殊含义,了解空值和空集对于数据库的数据查询操作,特别是空值在条件表达式中与其他的算术运算符或逻辑运算符的运算中,空集作为嵌套查询的子查询返回结果的时候的特殊性,能够熟练使用SQL语句来进行与空值,空集相关的操作。

二、实验内容

(1) 查询所有课程记录的上课学时(数据库中为每星期学时),以一学期十八个星期计算每个课程的总学时,注意HOUR取NULL值的情况。

SELECT cid,hour*18

FROM COURSES;

(2) 通过查询选修课程C++的学生的人数,其中成绩合格的学生人数,不合格的学生人数,讨论NULL值得特殊含义。

查询选修C++的学生人数:

SELECT COUNT(*)

FROM COURSES,CHOICES

WHERE CHOICES.cid=COURSES.cid

AND cname='C++';

运行结果为:95

成绩合格的学生人数:

SELECT COUNT(*)

FROM COURSES,CHOICES

WHERE CHOICES.cid=COURSES.cid

AND cname='C++' AND score<60;

运行结果为:86

成绩不合格的学生人数:

SELECT COUNT(*)

FROM COURSES,CHOICES

WHERE CHOICES.cid=COURSES.cid

AND cname='C++' AND score>=60;

运行结果为:0

NULL与比较运算符的运算都返回FALSE值,都不会出现在结果的统计之中。

(3) 查询选修课程C++的学生的编号和成绩,使用ORDER BY按成绩进行排序时,取NULL的项是否出现在结果中?如果有,在什么位置?

SELECT sid,score

FROM CHOICES

WHERE cid=(SELECT cid FROM COURSES WHERE cname='C++')

ORDER BY score;

NULL的项出现在结果中,被当作最小值处理。

(4) 在上面的查询的过程中,如果加上保留字DISTINCT会有什么效果呢?

SELECT DISTINCT score

FROM CHOICES

WHERE cid =(SELECT cid

FROM COURSES

WHERE cname='C++')

ORDER BY score;

成绩为NULL的学生被合并

(5) 按年级对所有的学生进行分组,能得到多少个组?与现实的情况有什么不同?

SELECT grade

FROM STUDENTS

GROUP BY grade;

得到9个分组,现实中有8个年级。

(6) 结合分组,使用集合函数求每个课程选修的学生的平均分,总的选课记录数,最高成绩,最低成绩,讨论考察取空值的项对集合函数的作用的影响。

SELECT AVG(score),COUNT(*),MAX(score),MIN(score)

FROM CHOICES

GROUP BY cid;

在集合函数中,除了使用COUNT(*)计算元组时要把取空值的项计算进去,其他的集合函数都忽略了取空值的项。

(7) 采用嵌套查询的方式,利用比较运算符和谓词ALL的结合来查询表STUDENTS中最晚入学的学生年级。当存在GRADE取空值的项时,考虑可能出现的情况,并解释原因。

SELECT grade

FROM STUDENTS

WHERE grade>=ALL(SELECT grade FROM STUDENTS);

(8) 将操作步骤中的表的数据进行更新,使得表S中,NO为2和3的记录的SID列取NULL值,T表的NO为4的记录的TID取NULL值,NO为3的TID取0129871005。然后对这两个表按T.TID=S.SID作等值连接运算,找出编号相同的学生和教师的姓名,并分析原因。

CREATE TABLE S

(NO SMALLINT PRIMARY KEY,

SID VARCHAR(10),

SNAME VARCHAR(10))

CREATE TABLE T

(NO SMALLINT PRIMARY KEY,

TID VARCHAR(10),

TNAME VARCHAR(10))

INSERT INTO S VALUES(1,'0129871001','王小明'),

(2,'0129871002','李兰'),

(3,'0129871003',NULL),

(4,'0129871004','关红')

INSERT INTO T VALUES(1,'100189','王小明'),

(2,'100180','李小'),

(3,'100121',NULL),

(4,'100128',NULL)

UPDATE S SET SID=NULL WHERE NO=2 OR NO=3

UPDATE T SET TID=NULL WHERE NO=4

UPDATE T SET TID='0129871005' WHERE NO=3

SELECT SNAME,TNAME

FROM S,T

WHERE T.TID=S.SID

运行结果:无

等值连接时,值为NULL的项被忽略。

  • 下载文档
  • 收藏
  • 0