数据库学习之实验一+Oracle数据库的基本操作
实验一 数据定义和单表查询
一、实验目的: 1. 熟悉数据库的交互式SQL工具 2. 通过本实验能够熟练应用sql语言进行基本表和索引的定义,能够对表的结构进行修改和删除,并通过数据更新命令输入相应的数据.
|
|||||||||||||||||||||
二、实验环境:
PC机,Windows7,PL/SQL
|
|||||||||||||||||||||
三、实验内容:
(一) 数据定义 一、建立基本表 创建学生表(student)、学生选课表(SC)、课程表(course) 1)·学生表:Student_学号后四位 (Sno, Sname, Ssex, Sdept)其中学号Sno主码,其中sno为number,sname为varchar2(10),ssex为char(2),sdept为varchar2(10)
Createtable Student_4128( Sno numberconstraint pkk_snoprimarykey, Sname varchar(10), Ssex varchar(2), Sdept varchar(10)); --注释 2)·课程表:Course_学号后四位(Cno, Cname, Cpno, Ccredit)其中课程号Cno主码;先行课为外码参照Course表中Cno字段。其中cno为number,cname为varchar2(10),cpno为number,ccredit为number(2)。 方法1: createtable Course_4128( Cno numberconstraint pk_cnoprimarykey, Cname varchar(10), cpno number , ccredit varchar(2), constraint fk_cpnoforeignkey(Cpno)references Course_4128(Cno) );
方法2: createtable Course_4128( Cno numberconstraint pk_cnoprimarykey, Cname varchar(10), cpno number(10)constraint fk_cpnoreferences Course_4128(Cno), ccredit varchar(2) ); 3)·学生选课表:SC_学号后四位(Sno, Cno, Grade)其中(Sno、Cno)为主码;Sno为外码参照Student表中sno字段;Cno为外码参照Course表中cno字段。 createtable SC_4128( Sno number(10) , Cno number(10), Grade number(10,2), constraint pk_keyprimarykey(Sno,Cno), constraint fk_snoforeignkey(Sno)references Student_4128 (Sno), constraint fk_cnoforeignkey(Cno)references Course_4128 (Cno) ); 二.修改基本表 1)在Student表中加入属性Sage(number型)。 altertable Student_4128add Sage number(10); 2)修改某个表的属性的数据类型。 修改Student 表中Sdept的数据类型varchar-àvarchar2 altertable Student_4128modify Sdept varchar2(10); 3)给表student的sex列添加一个自定义约束sex只能取’男’,’女’两个值。 altertable Student_4128addconstraint S_sexcheck(Ssex in('男','女')); 三、索引操作 1.建立索引 1)在Student表上建立关于Sname的唯一索引stusnam+学号后四位 createuniqueindex stusnam_4128on Student_4128 (Sname); 2)在SC表上建立关于Sno升序、Cno降序的唯一索引i_sc+学号后四位 createuniqueindex i_4128on SC_4128(Sno ASC,Cno DESC); 2.删除索引 1)删除Student表上的索引stusnam+学号后四位 dropindex stusnam_4128; 2)删除Course表上的索引i_sc+学号后四位 dropindex i_4128; 四.删除基本表 1) 删除基本表Student drop table student_4128; drop table student_4128 ORA-02449:表中的唯一/主键被外键引用 2)删除基本表SC drop table sc_4128; Table dropped 结果如何,先执行2),在执行1)结果如何。 drop table student_4128; Table dropped
五、单表查询 运行如下sql代码: Create table student as select * from scott.student; Create table course as select * from scott.course; Create table sc as select * from scott.sc; 再执行如下的查询: 1.求数学系学生的学号和姓名。
select Sno,Sname from student where Sdept='MA'; SNO SNAME --------- -------- 20070001 李佳 20070003 王添 20070006 张力
2.求选修了课程的学生学号。
select distinct Sno from SC where cno is not null;
SNO --------- 20070003 20070001 20070002 20070005 3.求选修课程号为‘2’的学生号和成绩,并要求对查询结果按成绩的降序排列,如果成绩相同按学号的升序排列。
select sno,Grade from SC where cno='2' order by Grade DESC,Sno ASC;
SNO GRADE --------- ----- 20070002 90 20070003 90 20070001 85
4.求选修课程号为’2’且成绩在80~90之间的学生学号和成绩,并将成绩乘以0.8输出。
select sno,Grade from SC where cno='2' and Grade>=80 and Grade<=90;
SNO GRADE --------- ----- 20070001 85 20070002 90 20070003 90
select Sno,0.8*Grade from SC where cno='2' and Grade>=80 and Grade<=90;
SNO 0.8*GRADE --------- ---------- 20070001 68 20070002 72 20070003 72
5.求数学系或计算机系姓张的学生的信息。
select * from student where sname like '张%' and Sdept='MA' or sname like '张%' and Sdept='IS';
SNO SNAME SSEX SAGE SDEPT --------- -------- ---- ---- -------------------- 20070004 张力 女 21 IS 20070006 张力 男 19 MA
6.求缺少了成绩的学生的学号和课程号。
select sno,cno from sc where grade is null;
SNO CNO --------- -----
7.查询各个课程号与相应的选课人数。
select cno,count(*) from sc group by cno;
CNO COUNT(*) ----- ---------- 1 3 6 1 2 3 4 3 5 2 3 3 7 1
7 rows selected
select cno,count(*) num from sc group by cno order by cno ASC;
CNO NUM ----- ---------- 1 3 2 3 3 3 4 3 5 2 6 1 7 1
7 rows selected
|
|||||||||||||||||||||
四、实验结果与分析
通过第一次做有关数据库的实验,又重新熟悉了对环境的基本配置,同时也更加明确了我们是在使用的Oracle数据库,对于不同的数据库我们都有相同的标准,但是会有不同的语句来实现不同的功能,在使用时一定要注意书写规范。学会了语法就可以很容易编写出基本的代码了。
思考题: 1)一个列上有外码约束如何实现。 (1)在创建表的时候在表的某一列上添加外码约束可以用如下语句: 表级添加: Constraint 外键约束名 foreign key(列名) references 被参考的表名(主键名); 列级添加: createtable XXX(snonumber(10)constraint fk_XXXnamereferences student(Sno)); (2)创建好表格之后如果需要增加约束条件,则只需要用如下语句: alter table student add constraint PK_student primary key(sno);
2)删除表时,表中某一列是另外一个表的外键,此表如何删除。
要先删除引用了该外键的表,再对此表进行删除操作才可以。 3)对表中某一列的数据类型进行修改时,要修改的列是否必须为空列。
正确,经测试,得以下结果: alter table student modify sname number(10);
alter table student modify sname number(10)
ORA-01439: 要更改数据类型,则要修改的列必须为空
|
|||||||||||||||||||||
五、指导教师意见
签名:
日期:
|