實驗日期: 2019 年 09 月 24 日 實驗報告日期: 2019 年 09 月 28 日 一、 實驗目的 熟悉oracle環境; 熟練掌握和使用PL-SQL建立資料庫基本表。 使用PL/SQL developer操作資料庫。 熟練掌握SQL 建立關係,及增刪改數據。 二、 實驗環境 Windo ...
實驗日期: 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。
這次構建資料庫發生了許多低級的錯誤,給我的警示是,做事要仔細小心,不要冒失冒進,一味的求快可能效率會更低,踏踏實實走好每一步才行。