实验目的
在数据库中,基本表用于存储数据;视图是虚表,在数据库中只存储视图定义(物化视图除外),通过视图可以查询、更新基本表中的数据;索引主要用于提高存取效率。通过本次实验,可以掌握基本表、视图、索引在数据库中的基本管理方法。
实验要求
熟悉实验室实验环境,阅读本次实验预备知识,熟悉基本表、视图、索引的基本概念,了解基本表、视图、索引的基本管理语法。实验中根据实验步骤要求书写相应的SQL代码并运行,记录和分析运行结果,使用代码验证SQL代码执行后是否满足步骤要求,并独立完成实验报告。
实验环境
Oracle 10g,windows 2003;
实验内容和步骤
(建议先把实验内容和步骤拷贝到SQL Developer工作区,然后按步骤进行实验,后同)
--1.创建学生选课关系数据库中的STUDENT表;
create table student
(
sno char(9) primary key,
sname char(20) unique,
ssex char(3),
sage smallint,
sdept char(20)
);
--2.创建学生选课关系数据库中的COURSE表;
create table course
(
cno char(4) primary key,
cname char(40),
cpno char(4),
ccredit smallint,
FOREIGN key (cpno) REFERENCES course(cno)
);
--3.创建学生选课关系数据库中的SC表;
create table sc
(
sno char(9),
cno char(4),
grade smallint,
primary key(sno,cno),
FOREIGN key(sno) REFERENCES student(sno),
FOREIGN key(cno) REFERENCES course(cno)
);
--4.运行下列语句,为基本表添加数据;
--以下为学生表的初始数据
insert into Student(sname,ssex,sno, sage, sdept) values('李勇','男','200215121',20,'CS');
insert into Student(sname,ssex,sno, sage, sdept) values('刘晨','女','200215122',19,'CS');
insert into Student(sname,ssex,sno, sage, sdept) values('王敏','女','200215123',18,'MA');
insert into Student(sname,ssex,sno, sage, sdept) values('张立','男','200215125',19,'IS');
--以下为课程表的初始数据
insert into course(cno,cname,cpno,ccredit) values('6','数据处理',null,2);
insert into course(cno,cname,cpno,ccredit) values('2','数学',null,2);
insert into course(cno,cname,cpno,ccredit) values('7','PASCAL语言','6',4);
insert into course(cno,cname,cpno,ccredit) values('5','数据结构','7',4);
insert into course(cno,cname,cpno,ccredit) values('1','数据库','5',4);
insert into course(cno,cname,cpno,ccredit) values('3','信息系统','1',4);
insert into course(cno,cname,cpno,ccredit) values('4','操作系统','6',3);
--以下为选修表的初始数据
insert into sc(sno,cno,grade) values('200215121','1',92);
insert into sc(sno,cno,grade) values('200215121','2',85);
insert into sc(sno,cno,grade) values('200215121','3',88);
insert into sc(sno,cno,grade) values('200215122','2',90);
insert into sc(sno,cno,grade) values('200215122','3',80);
commit;
--5.修改Student表结构,为Student表格添加一个“入学时间”属性,属性名为Senrollment,各元组在属性Senrollment的值是多少;
alter table student add Senrollment date;
select * from student;
--6.修改Student表结构,把Ssex列的宽度设置为6个字节;
alter table student modify ssex char(6);
--7.修改Student表结构,删除Senrollment列;
alter table student drop column Senrollment;
--8.创建视图ds,该视图包含所有选修了“数据库原理”的学生信息(如果提示没有权限,请使用管理员授予当前用户Create view权限);
--方法一
create view ds as
select * from student where sno in
(select sno from sc where cno in
(select cno from course where cname='数据库原理'));
--方法二(将所有的表格先连接起来)
create view ds as
select * from student
where student.sno=sc.sno and sc.cno=course.cno and cname='数据库原理';
--9.创建视图maleStudent,该视图包含男学生所有信息,通过视图maleStudent更新基本表数据时必须保证学生性别为男;
create view maleStudent as
select * from student
where ssex='男' with check option;
--10.删除视图maleStudent;
drop view maleStudent;
--11.为Course表的CName列建立唯一索引,索引名称为uniqueCname;
create unique index uniqueCname on course(cname);
--12.试着为Course表的Cpno列建立唯一索引,索引名为indexCpno1,如果发生错误,请说明普通索引和唯一索引有何区别;
create unique index indexCpno1 on course(Cpon);
--错误报告
--ORA-01452: 无法 CREATE UNIQUE INDEX; 找到重复的关键字
--01452. 00000 - "cannot CREATE UNIQUE INDEX; duplicate keys found"
--原因:唯一索引只能对应唯一数据(创建唯一索引的那一列存在重复数据)
--13.为Cource表的Cpno列建立普通索引,索引名称为indexCpno2;
create index indexCpno2 on course(Cpon);
--14.删除索引indexCpno2;
drop index indexCpno2;
--15.删除基本表Student,如果发生错误,请分析原因;
drop table student;
--错误报告
--ORA-02449: 表中的唯一/主键被外键引用
--02449. 00000 - "unique/primary keys in table referenced by foreign keys"
--原因:student表中的主键key被course引用了,他们之间存在联系没有断开
--16.删除基本表SC;
drop table sc;
--17.参考1.3节学生选课关系数据库的表结构,列出各个关系表应有的主码和外码约束(文字回答即可);
student表中:sno为主码,sname约束为唯一;
course表中:cno为主码,cpno为外码,引用自身表的cno;
sc表中:sno为外码,参照student中的sno,cno为外码,参照course表中的cno;
--18.查看已创建的Student、SC、Course表的约束,如果某个表缺少应有的主码或外码约束,为该表添加缺失的主码或外码约束。