实验一 Oracle Database环境和SQL *Plus基础
一、实验目的
掌握Oracle Database数据库的安装,学会使用SQL *Plus环境的设置及应用。
二、实验环境
本实验采用的RDBMS是Oracle公司的数据库管理系统,以Oracle Database 11g版本为软件平台。
三、实验内容与要求
1. 熟悉Oracle Database软件的获取和安装,简要说明Oracle Database 11g的安装过程。
2. 启动和设置SQL *Plus环境,通过SQL *Plus环境执行SQL语句。
(1)打开SQL *Plus环境,登录Oracle数据库,以系统默认用户身份登录,用户名:system, 口令:Admin123。登录成功后出现:“SQL>”提示符。
(2)以学生姓名拼音建立新的Oracle数据库用户(姓全拼,名字的首字母),并给用户授予连接和管理员权限。
参考代码:
create user wangw identified by wangw; (前一个为用户名,后一个为口令)
grant create session,dba to wangw; (session为连接权限,dba是具有100多个权限的角色)
3. 以当前新定义用户登录后创建学生表,表名:S,表格式如下:
字段名称 | 数据类型 | 是否为主码 | 是否为空 | 中文含义 |
sno | Varchar2(8) | * | Not null | 学号 |
sname | Varchar2(8) |
| null | 学生姓名 |
sex | Varchar2(2) |
| null | 公司名 |
birthday | date |
| null | 地址 |
deptno | Varchar2(24) |
| null | 所在系部编号 |
使用describe命令查看所定义的表结构。
4. 使用insert语句向S表中插入至少10条数据。
参考代码:INSERT INTO EMP(EMPNO,ENAME,HIREDATE)VALUES
(7844,'TURNER',to_date('8-9-1981','dd-mm-yyyy'));
5. 查询:
(1)查询所有学生信息的信息;
(2)格式化查询结果:改变deptno列的显示宽度为A10,将所有列标题设置成相应的中文含义。
6.打开并配置
四、实验预习和准备
参考相关书籍,能够熟练地使用SQL语言。
五、实验过程与结果
1、下载Oracle Database 10g的安装包,开启系统响应服务,进行相关设置。
2、create user hzx identified by hzx;(第一个hzx为用户名,第二个hzx为密码)
Grantcreate session dba to hzx;(授予hzx以数据库管理员的权限)。
3、创建表的脚本:
CREATE TABLE"S"
( "SNO" VARCHAR2(8 CHAR),
"SNAME"VARCHAR2(8 CHAR),
"BIRTHDAY" DATE,
"SEX" VARCHAR2(2 CHAR),
"DEPTNO" VARCHAR2(8 CHAR)
) ;
4、插入数据的脚本:
REM INSERTING into S
Insert into S(SNO,SNAME,BIRTHDAY,SEX,DEPTNO) values ('1','李明',to_timestamp('01-9月 -90 12.00.00.000000000上午','DD-MON-RR HH.MI.SS.FF AM'),'男 ','1');
Insert into S(SNO,SNAME,BIRTHDAY,SEX,DEPTNO) values ('2','张兰',to_timestamp('12-9月 -91 12.00.00.000000000上午','DD-MON-RR HH.MI.SS.FF AM'),'女 ','1');
Insert into S(SNO,SNAME,BIRTHDAY,SEX,DEPTNO) values ('3','王刚',to_timestamp('01-7月 -95 12.00.00.000000000上午','DD-MON-RR HH.MI.SS.FF AM'),'男 ','2');
Insert into S(SNO,SNAME,BIRTHDAY,SEX,DEPTNO) values ('4','李刚',to_timestamp('01-6月 -94 12.00.00.000000000上午','DD-MON-RR HH.MI.SS.FF AM'),'男 ','2');
Insert into S(SNO,SNAME,BIRTHDAY,SEX,DEPTNO) values ('5','王丽',to_timestamp('01-3月 -92 12.00.00.000000000上午','DD-MON-RR HH.MI.SS.FF AM'),'女 ','3');
Insert into S(SNO,SNAME,BIRTHDAY,SEX,DEPTNO) values ('6','张小江',to_timestamp('01-3月 -93 12.00.00.000000000上午','DD-MON-RR HH.MI.SS.FF AM'),'男','3');
5、(1)SELECT *FROM S;
(2)colum deptno heading‘所在系部编号’format A10
colum sno heading ’学号’
colum sname heading ’学生姓名’
colum sex heading ’公司名’
colum birthday heading ’地址’
六、实验小结和体会
通过本次实验,我掌握了Oracle Database 10g数据库的安装,熟悉了Oracle Database 10g软件的获取和安装,学会了使用SQL *Plus环境的设置及应用。
按照实验内容按部就班,就可以轻松的完成实验的内容,结合在《数据库系统概论》中学习的基础知识,与数据库的相似与不同之处进行比较,能更加透彻地理解不同版本数据库间思想的同源性和系统相似性。
实验二 管理数据库表及其完整性
一、实验目的
掌握Oracle中数据库和表以及数据类型的创建,同时能够熟练地进行表及表间数据完整性约束的创建。
二、实验环境
本实验采用的RDBMS是Oracle公司的数据库管理系统,以Oracle Database 11g版本为软件平台。
三、实验内容与要求
1. 在SQL *Plus或SQL Developer环境中建立如下结构表:
(1)C表
字段名称 | 数据类型 | 是否为主码 | 是否为空 | 中文含义 |
cno | Varchar2(8) | * | Not null | 课程号 |
cname | Varchar2(16) |
| null | 课程名 |
credit | NUMBER(3,1) |
| null | 学分 |
(2)SC表
字段名称 | 数据类型 | 是否为主码 | 是否为空 | 中文含义 |
sno | Varchar2(8) | * | Not null | 学号 |
cno | Varchar2(8) | * | Not null | 课程号 |
grade | NUMBER(5,1) |
| null | 成绩 |
(3)Dept表
字段名称 | 数据类型 | 是否为主码 | 是否为空 | 中文含义 |
deptno | Varchar2(8) | * | Not null | 系部编号 |
deptname | Varchar2(16) |
| null | 系部名称 |
示例:创建表
CREATE TABLE EMP
(EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARYKEY,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4) ,
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNOREFERENCES DEPT);
2. 创建约束:同时添加相应的主键约束、外键约束,并给C表中的credit字段添加check约束(0<credit<10),给sc表中的grade添加默认值(default为0),并验证。
若要创建外键约束可参阅如下代码:
ALTER TABLE "SC"ADD CONSTRAINT "SC_C_FK1" FOREIGN KEY ("CNO")
REFERENCES "C" ("CNO") ENABLE;
检查约束可参考如下代码:
ALTER TABLE "S" ADDCONSTRAINT "S_C_FK1"
Check ( sex in(‘男’,’女’) ));
默认值约束可参考如下代码:
ALTER TABLE "S"MODIFY ("SEX" CHAR(2 CHAR) DEFAULT '男');
四、实验预习和准备
完成本次实验首先要熟悉SQL语句如何创建数据库表,同时还要熟悉如何使用Alter语句创建主、外键,创建默认值、规则等。
五、实验过程与结果
1、在SQL *Plus或SQL Developer环境中建立结构表:
创建学生表C
CREATE TABLE C
(
CNO Varchar2(8) CONSTRAINT PK_EMP PRIMARY KEY,
CNAME VARCHAR2(16),
CREDIT NUMBER(3,1),
Check ( CREDIT in(0-10) ));
);
创建学生选课表SC
CREATE TABLE SC
(
SNO Varchar2(8) CONSTRAINT PK_EMP PRIMARY KEY,
CNO Varchar2(8) CONSTRAINT PK_EMP PRIMARY KEY,
GRADE NUMBER(5,1)
FOREIGN KEY ("CNO") REFERENCES"C" ("CNO") ENABLE;
ALTER TABLE "SC" MODIFY("GRADE" CHAR(2 CHAR) DEFAULT '0');
);
创建系部表Dept
CREATE TABLE DEPT
(
DEPTNO Varchar2(8) CONSTRAINTPK_EMP PRIMARY KEY,
DEPTNAME Varchar2(16)
);
2、创建约束:同时添加相应的主键约束、外键约束,并给C表中的credit字段添加check约束(0<credit<10),给sc表中的grade添加默认值(default为0),并验证。
ALTER TABLE “S” MODIFY(“SNO” NOT NULLENABLE);
ALTER TABLE “S” ADD CONSTRAINT “S_PK” PRIMARYKEY(“SNO”) ENABLE;
ALTER TABLE “C” ADD CONSTRAINT “C_PK” PRIMARYKEY(“CNO”) ENABLE;
ALTER TABLE “C” MODIFY(“CNO” NOT NULLENABLE);
ALTER TABLE “DEPT” ADD CONSTRAINT “DEPT_PK”PRIMARY KEY(“DEPTNO”) ENABLE;
ALTER TABLE “DEPT” MODIFY(“DEPTNO” NOT NULL ENABLE);
ALTER TABLE “SC” ADD CONSTRAINT “SC_PK”PRIMARY KEY(“SNO”,”CNO”) ENABLE;
ALTER TABLE “SC” MODIFY(“SNO” NOT NULLENABLE);
ALTER TABLE “SC” MODIFY(“CNO” NOT NULLENABLE);
六、实验小结和体会
通过本次实验,我掌握了Oracle数据库表与数据类型的创建,同时能够熟练地进行表及表间数据完整性约束的创建,熟悉了SQL语句如何创建数据库表,同时熟悉了如何使用Alter语句创建主、外键,创建默认值、规则等。
在实验中,创建表需要按照相关格式来,以及注意表中各数据的属性问题的设置。我通过SQL PLUS终端进行最基本的语言编写来创建,当然也可以再在Oracle Database中通过图形化用户接口创建,那样更直观、方便,但需要大量重复选择性劳动,效率不高。
实验三 SQL查询技术
一、实验目的
掌握常用的查询技术,能够熟练的运用各种查询和汇总方式进行数据的查询和统计。
一、实验环境
本实验采用的RDBMS是Oracle公司的数据库管理系统,以Oracle Database 11g版本为软件平台。
三、实验内容与要求
1) 查询所有学生的学号、姓名、年龄信息,并以年龄升序排列。
2) 查询每一个学生选修课程的门数、最高分、最低分、平均分,以门数降序排列。
3) 查询除“李明”外所有姓“李”和姓“张”的学生信息。
4) 在选课关系中查询每门课程的选修人数、平均成绩,并将平均成绩大于70分的课程的课程号、选修人数和平均成绩显示出来。
5) 查询“计算机系”选修“数据库系统概论”课程且成绩大于60分的学生姓名和成绩。(分别用内连接和子查询实现)
6) 查询所有课程的选修情况(包含没有学生选修的课程),包括课程名称、学分、学生姓名和成绩。
7) 查询至少选修了“3”号学生选修所有课程的学生的学号和姓名。
四、实验预习和准备
参照相关书籍和文档,熟悉Select语句的各种用法。
五、实验过程与结果
1、select sno, sname,to_char(sysdate,'yyyy')-to_char(birthday,'yyyy')as age
from S
order by age;
2、select sno,count(cno),max(grade),min(grade),avg(grade)
from SC
group by sno
order by count(cno) desc;
3、select * from s
where sname like '张%' or sname like '李%'
minus
select * from S
where sname like '李明%';
4、select cno,count(sno),avg(grade)
from SC
group by cno
having avg(grade)>70;
5、select S.Sname,SC.grade
from S,SC,DEPT,C
where S.sno=SC.sno and S.deptno=DEPT.deptnoand dept.deptname like '计算机系%'
and C.cname like '数据库系统概论%' and C.cno=SC.cno and SC.grade>60;
6、select S.sname,SC.grade
from S JOIN SC on S.Sno=SC.sno
where S.sno in (select Sno from s
where S.deptno=(select deptno from dept where deptname like '计算机系%'))
andSC.cno in (select cno from C where cname like '数据库系统概论%')
and SC.grade>60;
7、select C.cname,C.credit,S.Sno,SC.grade
from C LEFT OUTER JOIN sc on C.cno=SC.cnoleft OUTER join S on SC.Sno=S.sno;
8、select DISTINCT sno
from SC SCX
where not EXISTS(
select * from SC SCY
where SCY.sno='3' and not EXISTS (
select * from SC SCZ
where SCZ.Sno=SCX.Sno and SCZ.cno= scy.cno));
六、实验小结和体会
通过本次实验,本我练习了有关于SQL的数据库查询语句,掌握它的基本语言方法。在众多的逻辑结构中,比较重要或难以理解的是嵌套、子查询、差集、模糊查询、别名查询等,如第八题,此题需要逆向思维,从问题的反面思考,就比较原来容易理解地多了。
在数据库的学习中,查询语言是重中之重,需要大量实例和练习,才能透彻理解,我们要反复吸收查询实例中的各种逻辑行为,把各种模型熟记于心,做到应用自如。
实验四 PL/SQL基础
一、实验目的
掌握常用的PL/SQL变量和语句,能够熟练的运用循环结构、条件语句等进行程序设计。
二、实验环境
本实验采用的RDBMS是Oracle公司的数据库管理系统,以Oracle Database 11g版本为软件平台。
三、实验内容与要求
(1)用数组实现C表中课程号和课程名的显示,要求将C表中的课程号赋给数组的索引,将课程名作为数组元素,同时反序输出数组的索引和元素。
(2)用多分支条件case语句实现sc表中成绩的等第转换,优秀(>=90)、良好(80-90)、中等(70-80)、及格(60-70)、不及格(<60)。
(3)用游标实现成绩学分绩点的计算,要求显示学生姓名、课程名、学分、成绩、学分绩点等信息。学分绩点=学分*对应绩点,成绩和对应绩点的关系表如下:
成绩 | 对应绩点 |
>=90 | 5 |
80-89 | 4 |
70-79 | 3 |
60-69 | 2 |
<60 | 0 |
如:某门课该学生的成绩为72分,该课程的学分为4,则该生该门课的学分绩点=4*3=12。
四、实验预习和准备
了解PL/SQL的常变量的定义,熟悉流程控制语句和游标的使用。
五、实验过程与结果
1、set serveroutput on
declare
typemy_text_table is table of varchar2(200) index by binary_integer;
m_t_table my_text_table;
nNUMBER;
BEGIN
forc_rec in(SELECT * from c)loop
m_t_table(c_rec.cno):=c_rec.cname;
end loop;
n:=m_t_table.last;
loop
exit when n is null;
dbms_output.put_line(n||':'||m_t_table(n));
n:=n-1;
end loop;
end;
2、set serverout on
declare
TJnumber;
begin
formy_sc_rec in(select s.sname, c.cname, sc.grade
from s,c,sc wheres.sno=sc.sno and sc.cno=c.cno order by sc.grade)
loop
dbms_output.put_line('姓名:'||my_sc_rec.sname||',课程:'||my_sc_rec.cname);
if(my_sc_rec.grade<60) then
TJ:=0;
elsif (my_sc_rec.grade>=60 and my_sc_rec.grade<70) then
TJ:=1;
elsif (my_sc_rec.grade>=70 and my_sc_rec.grade<80) then
TJ:=2;
elsif (my_sc_rec.grade>=80 and my_sc_rec.grade<90) then
TJ:=3;
else
TJ:=4;
endif;
case TJ
when 0 then dbms_output.put_line('成绩:'||'不及格');
when 1 then dbms_output.put_line('成绩:'||'及格');
when 2 then dbms_output.put_line('成绩:'||'中等');
when 3 then dbms_output.put_line('成绩:'||'良好');
when 4 then dbms_output.put_line('成绩:'||'优秀');
endcase;
endloop;
end;
3、
set serverout on
declare
TJnumber;
begin
formy_sc_rec in(select s.sname, c.cname,credit, sc.grade
from s,c,sc wheres.sno=sc.sno and sc.cno=c.cno order by sc.grade)
loop
dbms_output.put_line('姓名:'||my_sc_rec.sname||',课程:'||my_sc_rec.cname,学分:'||my_sc_rec.credit,成绩:'||my_sc_rec.grade);
if(my_sc_rec.grade<60) then
TJ:=0;
elsif (my_sc_rec.grade>=60 and my_sc_rec.grade<70) then
TJ:=2* my_sc_rec.credit;
elsif (my_sc_rec.grade>=70 and my_sc_rec.grade<80) then
TJ:=3* my_sc_rec.credit;
elsif (my_sc_rec.grade>=80 and my_sc_rec.grade<90) then
TJ:=4* my_sc_rec.credit;
else
TJ:=5* my_sc_rec.credit;
endif;
dbms_output.put_line('学分绩点:'||'TJ ');
endloop;
end;
六、实验小结和体会
通过本次实验的内容,我主要掌握了常用的PL/SQL变量和语句,能够熟练的运用循环结构、条件语句等进行程序设计。我们对这部分内容感到陌生,所以我们得仔细揣摩书本上的基本知识点、范例,但是熟悉了所用的程序算法的思想后,与其他语言的程序也都是大同小异的,只要掌握好它的基本语法规则做起来就可以游刃有余于各种过程的设计
实验五 索引和视图
一、实验目的
掌握oracle中索引和视图的基本原理,能够熟练的创建使用索引和视图。
三、实验环境
本实验采用的RDBMS是Oracle公司的数据库管理系统,以Oracle Database 11g版本为软件平台。
三、实验内容与要求
1. 对s表的sname字段创建唯一索引。
2. 给sc表中的sno和cno两个字段创建连接索引。
3. 给dept表中的deptname字段创建B树索引,同时设定数据块的预留空间为40%。
4. 给c表中的cname字段定义函数索引,要求查询时忽略cname两边的空格。
5. 创建视图view_sc,要求显示学生的姓名、课程名、成绩,以成绩降序排列;同时在此视图的基础上查询,要求统计出不同课程的选课人数,并显示大于2人的课程名和人数。
6. 使用内嵌视图实现如下查询:显示各个系部的名称、学生人数和学生人数所占的比例。
四、实验预习和准备
了解PL/SQL的索引和视图的定义,熟悉创建和使用索引和视图。
五、实验过程与结果
1.create unique index sname_index on s(sname);
2.create index sc_index on sc(sno,cno)
3.create index idx_dept_deptname
on dept(deptname)
pctfree 40
4.create index trim_cname_idx onc(trim(cname))
5.create view view_sc(sname,cname,grade)
as
select sname,cname,grade
from s,c,sc
where s.sno=sc.sno and c.cno=sc.cno;
select cname,count(sname) from view_sc
group by cname having count(sname)>=2
6.Select Deptname,count(*),to_char((count(*)/total_stu.cnt)*100,’99.99’)||’%’pct
From dept,S
(select count(*) cnt from S) total_stu
Where dept.deptno=S.deptno
Group by deptname,total_stu.cnt;
六、实验小结和体会
通过本次实验,我主要掌握了oracle中索引和视图的基本原理,能够熟练的创建使用索引和视图。索引实际上与数据结构中的二叉树有共同之处,两者都是指针形式的,只要理解了它的原理那么运用起来就比较方便了,视图只是为了给我们方便查找,这个在之前的数据库原理中已学过,可以轻松驾驭。
实验六 存储过程和触发器
一、实验目的
掌握Oracle中存储过程和触发器的创建和调用方法。
二、实验环境
本实验采用的RDBMS是Oracle公司的数据库管理系统,以Oracle Database 11g版本为软件平台。
三、实验内容与要求
1) 创建并执行一个存储过程,要求向选课关系中插入一条记录,记录的内容以参数的方式进行传递。
2) 创建并执行一个存储过程,能根据输入的学号查找出学生的姓名。
3) 创建并执行一个函数,能根据输入的学号和课程号查找出学生的成绩。
4) 创建一个触发器,当删除学生表的学生信息时,自动删除该学生所选修的课程信息。
5) 创建一个触发器,在插入学生表的学生信息时,当出生日期小于当前系统日期时,不允许插入数据。
四、实验预习和准备
参照相关书籍和文档,熟悉Create Procedure、create Function、create Trigger等指令的用法。
五、实验过程与结果
1.create or replace
procedure insert_into_sc(s_pram in VARCHAR2,c_pram in VARCHAR2,g_pram in NUMBER)
is
begin
insert into sc values(s_pram,c_pram,g_pram);
end insert_into_sc;
/
2.create or replace
procedure select_sname_s(sno_pram in VARCHAR2,sname_pram out VARCHAR2)
is
begin
select sname into sname_pram from s where sno=sno_pram;
end select_sname_s;
/
3.create or replace
procedure select_grade_sc(sno_pram in VARCHAR2,cno_pram in VARCHAR2,grade_pram out NUMBER)
is
begin
select grade into grade_pram from sc where cno=cno_pram and sno= sno_pram;
end select_grade_sc;
/
4.CREATE OR REPLACE TRIGGER del_s_sno
AFTER DELETE ON s
FOR EACH ROW
BEGIN
DELETE FROM sc where sc.sno=:old.sno;
END;
/
5.create trigger insert_tri BEFORE INSERT on s
for each row
begin
if birthdat>sysdate then
insert into s(id) values(0);
end if;
end;
六、实验小结和体会
通过本次实验,我主要掌握了Oracle中存储过程和触发器的创建和调用方法.。经历整个实验过程,感到实验并不难,但是要掌握好它的基本原理,需要深入的理解,这样在实验中才会得心应手。存储过程对于我来说是个新知识,以前没接触过,但是它的运用的方法都比较的简单。触发器内容,我们要理解它的运用的过程。