实验日期: 2019 年 09 月 24 日
实验报告日期: 2019 年 09 月 28 日
一、 实验目的
熟悉oracle环境;
熟练掌握和使用PL-SQL建立数据库基本表。
使用PL/SQL developer操作数据库。
熟练掌握SQL 建立关系,及增删改数据。
二、 实验环境
Windows10专业版
Oracle database 11g
PL/SQL Developer 13
三、 实验内容
了解SQL PLUS的使用
使用PL/SQL developer的图形界面,建立图书管理数据库orcl中的各个关系
在建立的关系中输入有效数据
删除以上各关系
在PL/SQL developer用SQL代码建立orcl数据库中各关系
用SQL 代码完成数据增、删、改
四、 实验步骤
- 以SYSTEM登录数据库
打开PL/SQL developer,以用户:SYSTEM,密码:orcl,登录orcl数据库,如图1所示:
图1 登录数据库
- 注册用户
打开Users文件夹,新建用户。用户名:S512017****,密码定为orcl,并赋予connect和dba权限。
图2、3 注册新用户并赋予权限
- 重新以新用户登录数据库
图4 以新用户登录数据库
- 建立数据库表
打开tables文件夹。建立以下各关系:
图书分类(图书分类号,类名)
书目(ISBN, 书名,作者,出版单位,单价,图书分类号)
图书(图书编号,ISBN,是否借出,备注)
读者 (借书证号,姓名,单位,性别,地址,联系电话,身份证编号)
借阅 (借阅流水号,借书证号,图书编号,借书日期,归还日期,罚款分类号,备注)
罚款分类(罚款分类号,罚款名称,罚金)
预约 (预约流水号,借书证号,ISBN,预约时间)
(1) 图形界面下建立:
图5 设定表名
图6 设定表的属性列
图7 设置表的主键
图书分类表建立完成,其余各表的建立同理可建,如下(第一张为表名的设置(Name),接着是模式的设置(Columns),键的设置(Keys),约定条件的设置(Check),如果没有则是不需要定义相关项):
书目:
图书:
读者:
借阅:
罚款分类:
预约:
(2) 由SQL语句建立:
图书分类:
create table 图书分类(
图书分类号 varchar2(3) primary key,
类名 varchar2(10) not null
);
书目:
create table 书目(
ISBN varchar2(20) primary key,
书名 varchar2(20) not null,
作者 varchar2(20) not null,
出版单位 varchar2(30),
单价 number(10,2),
图书分类号 varchar2(3),
foreign key(图书分类号) references 图书分类(图书分类号)
);
图书:
create table 图书(
图书编号 varchar2(7) primary key,
ISBN varchar2(20),
是否借出 varchar2(2),
备注 varchar2(60),
foreign key(ISBN) references 书目(ISBN),
check (是否借出 = '是' or 是否借出 = '否')
);
读者:
create table 读者(
借书证号 varchar2(8) primary key,
姓名 varchar2(10) not null,
单位 varchar2(30),
性别 varchar2(2),
地址 varchar2(30),
联系电话 char(11),
身份证编号 varchar2(18),
check (性别 in ('男','女')),
check (regexp_like(联系电话,'[0-9]{11}')),
check (regexp_like(身份证编号,'[0-9]{15}')
or regexp_like(身份证编号,'[0-9]{17}[0-9,X]'))
);
借阅:
create table 借阅(
借阅流水号 number primary key,
借书证号 varchar2(8) not null,
图书编号 varchar2(8) not null,
借书日期 date not null,
归还日期 date,
罚款分类号 number,
备注 varchar2(60),
foreign key(借书证号) references 读者(借书证号),
foreign key(图书编号) references 图书(图书编号)
);
罚款分类:
create table 罚款分类(
罚款分类号 number primary key,
罚款名称 varchar2(8) not null,
罚金 number not null
);
预约:
create table 预约(
预约流水号 number primary key,
借书证号 varchar2(8),
ISBN varchar2(20),
预约时间 date not null,
foreign key(借书证号) references 读者(借书证号),
foreign key(ISBN) references 书目(ISBN)
);
- 各关系输入数据如下:
图书分类(图书分类号,类名)
图书分类号 |
类名 |
100 |
文学 |
200 |
科技 |
300 |
哲学 |
书目(ISBN, 书名,作者,出版单位,单价,图书分类号)
ISBN |
书名 |
作者 |
出版单位 |
单价 |
图书分类号 |
7040195836 |
数据库系统概论 |
王珊 |
高等教育出版社 |
39.00 |
200 |
9787508040110 |
红楼梦 |
曹雪芹 |
人民出版社 |
20.00 |
100 |
9787506336239 |
红楼梦 |
曹雪芹 |
作家出版社 |
34.30 |
100 |
9787010073750 |
心学之路 |
张立文 |
人民出版社 |
33.80 |
300 |
图书(图书编号,ISBN,是否借出,备注)
图书编号 |
ISBN |
是否借出 |
备注 |
2001231 |
7040195836 |
否 |
|
2001232 |
7040195836 |
是 |
|
1005050 |
9787506336239 |
否 |
|
1005063 |
9787508040110 |
是 |
|
3007071 |
9787010073750 |
是 |
|
读者 (借书证号,姓名,单位,性别,地址,联系电话,身份证编号)
借书证号 |
姓名 |
单位 |
性别 |
地址 |
联系电话 |
身份证编号 |
20051001 |
王菲 |
四川绵阳西科大计算机学院 |
女 |
… |
… |
.. |
20062001 |
张江 |
四川绵阳中心医院 |
男 |
… |
… |
.. |
20061234 |
郭敬明 |
四川江油305 |
男 |
.. |
.. |
.. |
20071235 |
李晓明 |
四川成都工商银行 |
男 |
.. |
.. |
.. |
20081237 |
赵鑫 |
四川广元广元中学 |
女 |
.. |
.. |
.. |
借阅 (借阅流水号,借书证号,图书编号,借书日期,归还日期,罚款分类号,备注)
借阅流水号 |
借书证号 |
图书编号 |
借书日期 |
归还日期 |
罚款分类号 |
备注 |
1 |
20081237 |
3007071 |
2010/09/19 |
2010/09/20 |
|
|
2 |
20071235 |
1005063 |
2010/10/20 |
2011/02/20 |
1 |
|
3 |
20071235 |
2001232 |
2011/09/01 |
|
|
|
4 |
20061234 |
1005063 |
2011/9/20 |
|
|
|
5 |
20051001 |
3007071 |
2011/9/10 |
|
|
|
6 |
20071235 |
1005050 |
2011/10/20 |
2012/02/20 |
1 |
|
罚款分类(罚款分类号,罚款名称,罚金)
罚款分类号 |
罚款名称 |
罚金 |
1 |
延期 |
10 |
2 |
损坏 |
20 |
3 |
丢失 |
50 |
预约 (预约流水号,借书证号,ISBN,预约时间)
预约流水号 |
借书证号 |
ISBN |
预约时间 |
1 |
20081237 |
9787508040110 |
2011/09/11 |
(1) 对于各表内容的图形化插入:
如“图书分类”表的编辑:首先右键点击表格选择“Edit data”,如下图:
在所给窗口中编辑数据,如下:
接着点选绿勾、绿锁并点击commit按钮,则提交成功
其余各表的数据插入如下:
书目:
图书:
读者:
借阅:
罚款分类:
预约:
(2) SQL语句插入:
/*图书分类*/
insert into 图书分类 values('100','文学');
insert into 图书分类 values('200','科技');
insert into 图书分类 values('300','哲学');
/*书目*/
insert into 书目(ISBN,书名,作者,出版单位,单价,图书分类号) values ('7040195836','数据库系统概论','王珊','高等教育出版社',39.00,'200');
insert into 书目(ISBN,书名,作者,出版单位,单价,图书分类号) values ('9787508040110','红楼梦','曹雪芹','人民出版社',20.00,'100');
insert into 书目(ISBN,书名,作者,出版单位,单价,图书分类号) values ('9787506336239','红楼梦','曹雪芹','作家出版社',34.30,'100');
insert into 书目(ISBN,书名,作者,出版单位,单价,图书分类号) values ('9787010073750','心学之路','张立文','人民出版社',33.80,'300');
/*图书*/
insert into 图书(图书编号,ISBN,是否借出) values('2001231','7040195836','否');
insert into 图书(图书编号,ISBN,是否借出) values('2001232','7040195836','是');
insert into 图书(图书编号,ISBN,是否借出) values('1005050','9787506336239','否');
insert into 图书(图书编号,ISBN,是否借出) values('1005063','9787508040110','是');
insert into 图书(图书编号,ISBN,是否借出) values('3007071','9787010073750','是');
/*读者*/
insert into 读者 values('20051001','王菲','四川绵阳西科大计算机学院','女','','','');
insert into 读者 values('20062001','张江','四川绵阳中心医院','男','','','');
insert into 读者 values('20061234','郭敬明','四川江油305','男','','','');
insert into 读者 values('20071235','李晓明','四川成都工商银行','男','','','');
insert into 读者 values('20081237','赵鑫','四川广元广元中学','女','','','');
/*罚款分类*/
insert into 罚款分类(罚款分类号,罚款名称,罚金) values(1,'延期',10);
insert into 罚款分类(罚款分类号,罚款名称,罚金) values(2,'损坏',20);
insert into 罚款分类(罚款分类号,罚款名称,罚金) values(3,'丢失',50);
/*借阅*/
insert into 借阅(借阅流水号,借书证号,图书编号,借书日期,归还日期) values(1,'20081237','3007071',to_date('2010/09/19','yyyy/mm/dd'),to_date('2019/09/20','yyyy/mm/dd'));
insert into 借阅(借阅流水号,借书证号,图书编号,借书日期,归还日期,罚款分类号,备注) values(2,'20071235','1005063',to_date('2010/10/20','yyyy/mm/dd'),to_date('2011/02/20','yyyy/mm/dd'),1,'');
insert into 借阅(借阅流水号,借书证号,图书编号,借书日期) values(3,'20071235','2001232',to_date('2011/09/01','yyyy/mm/dd'));
insert into 借阅(借阅流水号,借书证号,图书编号,借书日期) values(4,'20061234','1005063',to_date('2011/9/20','yyyy/mm/dd'));
insert into 借阅(借阅流水号,借书证号,图书编号,借书日期) values(5,'20051001','3007071',to_date('2011/9/10','yyyy/mm/dd'));
insert into 借阅(借阅流水号,借书证号,图书编号,借书日期,归还日期,罚款分类号,备注) values(6,'20071235','1005050',to_date('2011/10/20','yyyy/mm/dd'),to_date('2012/02/20','yyyy/mm/dd'),1,'');
/*预约*/
insert into 预约(预约流水号,借书证号,ISBN,预约时间) values(1,'20081237','9787508040110',to_date('2011/09/11','yyyy/mm/dd'));
另外,对于plsqldev时间格式的设定如下:
图8 设置日期型格式
- 使用SQL语句练习表的创建、删除、修改操作。
新建一个“实验”表,进行表的创建、删除、修改的操作:
创建表:
create table 实验(
实验编号 varchar2(5) primary key,
实验名称 varchar2(30) not null
);
select * from 实验;
修改:
alter table 实验
modify 实验名称 varchar2(40);
select * from 实验;
(此处“实验名称”变量类型变为varchar2(40))
alter table 实验
add 实验难度 varchar2(2);
select * from 实验;
删除:
alter table 实验
drop column 实验名称;
select * from 实验;
drop table 实验;
(此处将表进行了删除)
- 使用SQL语句练习表中数据的增加、删除、修改操作。
以上题所建实验(实验编号(primary key),实验名称(not null),实验难度)表进行操作。
create table 实验(
实验编号 varchar2(5) primary key,
实验名称 varchar2(30) not null,
实验难度 varchar2(2)
);
数据插入:
insert into 实验 values('19001','建立数据库','中');
insert into 实验(实验名称,实验编号) values('删库跑路','19002');
结果查看:
数据修改:
update 实验 set 实验编号 = '19003'
where 实验名称 = '删库跑路';
数据删除:
delete from 实验
where 实验名称 = '建立数据库';
另外,在本实验中之过程中也有许多对于数据表模式、数据表数据内容的新增、更改、查询和删除操作,进行了大量的练习。
- 试根据下面的完整性约束要求,用SQL对上面已经建立好的数据库表进行完整性约束定义。
读者关系中属性 联系电话 取值为11位数字
身份证编号 取值为18位,并且满足身份证编号规则
图书关系中属性 是否借出 取值为:‘是’或‘否’
借阅关系中属性 借书日期 取值不为空
完整性约束如下:
读者关系中:
电话号码约束:使第一位为1其余10位为数字。
check (regexp_like(联系电话,'^1[0-9]{10}$'))
身份证约束:(第一个约束条件使身份证第1位不为0,第7到10位使身份证信息中的出生年份为1900到2099,第11到12位组合为月份01到12月份,且分别分出了31和30天的月份,再使2月份的天数为29天,最后一位约定可以为x和X;第二个约束条件使出生年份不超过2019年)
check (regexp_like(idc,'^[1-9]\d{5}(19|20)\d{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2]\d|30|31)|(04|06|09|11)(0[1-9]|[1-2]\d|30)|02(0[1-9]|[1-2]\d))\d{3}(\d|x|X)$')
and regexp_like(idc,'^\d{6}((19\d{10})|(20(0|1)\d{9}))$'))
图书关系中:
check (是否借出 = '是' or 是否借出 = '否')
借阅关系中:
借书日期 date not null
实验心得与体会
本次实验是第一次实验课,在实验之前我们需要准备好软件平台,Oracle database的安装需要顾及到相应支持的软件,如.Net Framework 3.5,以及相应注册表的修改(使数据库兼容在Windows10上),再按照自己的需求进行软件的安装。在软件使用的过程中,我们至少需要简单了解相关服务项控制的是什么,才能更加方便的使用,为了创建数据库以及使用SQL语句的便捷性,和与实验室环境搭配,我们也使用的pl/sql development软件,用图形界面的方法方便我们对数据库的相关操作。
实验中图形化界面的使用弄懂了之后,编辑起来是很快,但是总会有一些报错,由于宏观操作数据,并不能很直观的知道到底是哪里出了问题,在之后的SQL语句创建数据库创建表的过程中,相当于重复着之前的行为,这时候再微观的构建数据库中便能更加直观的发现自己之前的错误,加深了自己的印象,自己也发现有没有理解透彻的知识点,回头翻书再仔细咀嚼一番,掌握的也更扎实了。
在数据库构建的时候,主键和外键的设置在我看来显得尤为重要,再加上完整性约束,三者在数据库健壮性中显得格外突出。我在实验中便经过了很多相关的坎,从未设置约束和外键,到完善约束条件,其中感悟心得挺多的:当你数据插入报错时,有可能是违反唯一性原则,反复插入了相同主键的数据;有可能是插入的数据外键指向的主键指定的表中找不到,不存在或者之前插入的值并没有commit。
这次构建数据库发生了许多低级的错误,给我的警示是,做事要仔细小心,不要冒失冒进,一味的求快可能效率会更低,踏踏实实走好每一步才行。