数据库实验二 SQL语言
實(shí)驗(yàn)二
SQL語(yǔ)言
實(shí)驗(yàn)?zāi)康?/strong>
熟悉并掌握創(chuàng)建表,插入記錄,查詢記錄,刪除記錄,修改記錄。
創(chuàng)建索引,刪除索引。
創(chuàng)建視圖,使用視圖,刪除視圖。
?
實(shí)驗(yàn)內(nèi)容
現(xiàn)有一個(gè)單位內(nèi)部的小型圖書借閱系統(tǒng),假設(shè)每本圖書的數(shù)量無限制,并且可以借給任何單位成員,每個(gè)單位成員可以借多本書,單位成員與圖書的關(guān)系是多對(duì)多的關(guān)系。假設(shè)系統(tǒng)中僅有三個(gè)關(guān)系模式。
數(shù)據(jù)表結(jié)構(gòu)
Reader表
| 屬性名 | 類型 | 長(zhǎng)度 | 是否空 | 含義 |
| RNO | varchar2 | 4 | ? | 員工編號(hào)(主碼) |
| Rname | varchar2 | 10 | 否 | 員工姓名 |
| Rsex | varchar2 | 2 | ? | 性別 |
| Rage | integer | integer | ? | 年齡 |
| Rboss | varchar2 | 10 | ? | 直接上司 |
| Raddress | varchar2 | 30 | ? | 辦公地點(diǎn) |
Book表
| 屬性名 | 類型 | 長(zhǎng)度 | 是否空 | 含義 |
| BNO | varchar2 | 4 | ? | 書本編號(hào)(主碼) |
| Bname | varchar2 | 50 | 否 | 書名 |
| Bauthor | varchar2 | 50 | ? | 作者 |
| Bpress | varchar2 | 50 | ? | 出版社 |
| Bprice | varchar2 | numeric(6,2) | ? | 價(jià)格 |
RB表
| 屬性名 | 類型 | 長(zhǎng)度 | 是否空 | 含義 |
| RNO | varchar2 | 4 | ? | 員工編號(hào) |
| BNO | varchar2 | 4 | ? | 書本編號(hào) |
| RBdate | date | ? | ? | 借閱日期 |
| ? | ? | ? | ? | ? |
部分提示(黃色底的代碼可以直接粘貼運(yùn)行):
create user cc identified by ccpassword ;
grant resource, connect, DBA? to cc;
Declare
tmp integer default 0;
Begin
select count(*) into tmp from user_tables where table_name='RB';
if(tmp>0) then
execute immediate 'drop table RB';
end if;
select count(*) into tmp from user_tables where table_name='READER';
if(tmp>0) then
execute immediate 'drop table READER';
end if;
select count(*) into tmp from user_tables where table_name='BOOK';
if(tmp>0) then
execute immediate 'drop table BOOK';
end if;
end;
?
問:為何要先刪去RB?能不能先刪去READER?
create table Reader
(
??? RNO????? varchar2(4) primary key,
??? Rname??? varchar2(10) not null,
??? Rsex?????? varchar2(2),
??? Rage?????? integer,
??? Rboss???? varchar2(10),
??? Raddress varchar2(30)
) ;
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R001','張三',20,'男','李四','416');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R002','張三',35,'女',null,'417');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R003','李四',30,'男',null,'416');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R004','王五',20,'男',null,'417');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R005','馬六',40,'男',null,'416');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R006','劉三',20,'男',null,'417');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R007','王四',40,'男','李四','416');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R008','李小龍',20,'男','李四','417');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R009','王小倩',40,'男','李四','416');
insert into Reader (RNO,Rname,Rage,Rsex,Rboss, Raddress) values('R010','王一小',20,'男','李四','417');
select Rname from Reader where Rboss='李四';
UPDATE reader SET Raddress='420' WHERE rboss='李四';
DELETE FROM reader WHERE rboss=NULL;
DROP TABLE reader;
?
create table reader2 as select *? from reader; --創(chuàng)建表格reader2
查看這兩個(gè)數(shù)據(jù)表的結(jié)構(gòu)、內(nèi)容是否相同?分別執(zhí)行:
desc reader;
desc reader2;
也可以在可視化界面查看這兩個(gè)表所附帶的約束
update reader set RNO='R001' where Rname='張三';
表reader中的RNO是primary key,更新后的RNO與現(xiàn)存的RNO重復(fù),違反唯一約束條件
?
update reader2 set RNO='R001' where Rname='張三';
insert into reader2(RNO,Rname,Rsex,Rage,Rboss, Raddress) values(null,'lisi',null,null,null,null);
READER2
?
DROP TABLE READER2;
create table Book
(
??? BNO????? varchar2(4),
??? Bname??? varchar2(50) not null,
??? Bauthor? varchar2(50),
??? Bpress??? varchar2(50),
??? Bprice??? numeric(6,2),
??? primary key(BNO)
);
insert into book (BNO,Bauthor,Bname, bpress, bprice) values('B001','嚴(yán)蔚敏','數(shù)據(jù)結(jié)構(gòu)','清華大學(xué)出版社',null);
insert into book (BNO,Bauthor,Bname, bpress, bprice) values('B002','唐發(fā)根','數(shù)據(jù)結(jié)構(gòu)','北航出版社',24);
insert into book (BNO,Bauthor,Bname, bpress, bprice) values('B003','王珊','數(shù)據(jù)庫(kù)原理','高等教育出版社',40);
insert into book (BNO,Bauthor,Bname, bpress, bprice) values('B004','張飛','數(shù)據(jù)庫(kù)原理','清華大學(xué)出版社',30);
insert into book (BNO,Bauthor,Bname, bpress, bprice) values('B005','王珊','數(shù)據(jù)庫(kù)原理','清華大學(xué)出版社',null);
create table RB
(
??? RNO varchar2(4),
??? BNO varchar2(4),
??? RBdate date default sysdate,
? ??primary key(RNO,BNO),
??? foreign key (RNO) references Reader(RNO),
??? foreign key (BNO) references Book(BNO)
);
insert into RB (RNO,BNO) values ('R001','B001');
insert into RB (RNO,BNO) values ('R001','B002');
insert into RB (RNO,BNO) values ('R001','B004');
insert into RB (RNO,BNO) values ('R002','B001');
insert into RB (RNO,BNO) values ('R003','B001');
insert into RB (RNO,BNO) values ('R004','B001');
insert into RB (RNO,BNO) values ('R004','B002');
insert into RB (RNO,BNO) values ('R005','B001');
insert into RB (RNO,BNO) values ('R006','B001');
insert into RB (RNO,BNO) values ('R006','B003');
insert into RB (RNO,BNO) values ('R006','B005');
insert into RB (RNO,BNO) values ('R006','B002');
insert into RB (RNO,BNO) values ('R006','B004');
初始數(shù)據(jù)
reader表
| RNO | RNAME | RSEX | RAGE | RBOSS | RADDRESS |
| R001 | 張三 | 男 | 20 | 李四 | 416 |
| R002 | 張三 | 女 | 35 | ? | 417 |
| R003 | 李四 | 男 | 30 | ? | 416 |
| R004 | 王五 | 男 | 20 | ? | 417 |
| R005 | 馬六 | 男 | 40 | ? | 416 |
| R006 | 劉三 | 男 | 20 | ? | 417 |
| R007 | 王四 | 男 | 40 | 李四 | 416 |
| R008 | 李小龍 | 男 | 20 | 李四 | 417 |
| R009 | 王小倩 | 男 | 40 | 李四 | 416 |
| R010 | 王一小 | 男 | 20 | 李四 | 417 |
?
book表中數(shù)據(jù)
| BNO | BNAME | BAUTHOR | BPRESS | BPRICE |
| B002 | 數(shù)據(jù)結(jié)構(gòu) | 唐發(fā)根 | 北航出版社 | 24 |
| B003 | 數(shù)據(jù)庫(kù)原理 | 王珊 | 高等教育出版社 | 40 |
| B004 | 數(shù)據(jù)庫(kù)原理 | 張飛 | 清華大學(xué)出版社 | 30 |
| B005 | 數(shù)據(jù)庫(kù)原理 | 王珊 | 清華大學(xué)出版社 | ? |
| B001 | 數(shù)據(jù)結(jié)構(gòu) | 嚴(yán)蔚敏 | 清華大學(xué)出版社 | ? |
?
RB表中數(shù)據(jù)
| RNO | BNO | RBDATE(實(shí)驗(yàn)時(shí)間) |
| R001 | B001 | 插入數(shù)據(jù)時(shí)的系統(tǒng)時(shí)間 |
| R001 | B002 | ? |
| R001 | B004 | ? |
| R002 | B001 | ? |
| R003 | B001 | ? |
| R004 | B001 | ? |
| R004 | B002 | ? |
| R005 | B001 | ? |
| R006 | B001 | ? |
| R006 | B003 | ? |
| R006 | B005 | ? |
| R006 | B002 | ? |
| R006 | B004 | ? |
?
以下為查詢READER表中創(chuàng)建的約束類型,其中constraint_type為約束類型,該屬性值的取值Type Code如下表所示。(可以根據(jù)上課所講的實(shí)體完整性、參照完整性、用戶自定義完整性理解以下約束類型;直接在SQL DEVELOPER中雙擊表格也可以查看在表上所建立的約束)
select table_name,constraint_name,constraint_type from user_constraints where table_name ='READER';
?
| Type Code | Type Description | Acts On Level |
| C | Check on a table | Column |
| O | Read Only on a view | Object |
| P | Primary Key | Object |
| R | Referential AKA Foreign Key | Column |
| U | Unique Key | Column |
| V | Check Option on a view | Object |
?
方法一:先把RB中所有’R010’的借書記錄都刪掉
方法二:修改數(shù)據(jù)表READER的結(jié)構(gòu),允許級(jí)聯(lián)刪除(注:ORACLE不支持級(jí)聯(lián)更新)。
alter table rb add constraint MYFK foreign key(rno) references reader(rno) on delete cascade;
系統(tǒng)提示:SQL 錯(cuò)誤: ORA-02275: 此表中已經(jīng)存在這樣的引用約束條件
?
可見,首先要先刪去原來的約束,因建表時(shí)沒給該約束命名,故應(yīng)查這個(gè)約束的名字,才能刪去。注意,這個(gè)名字由系統(tǒng)自動(dòng)賦值,不同的環(huán)境下約束名可能不同):
alter table rb drop constraint SYS_C0011303;
alter table rb add constraint MYFK foreign key(rno) references reader(rno) on delete cascade;
?
再執(zhí)行:delete from reader where rno='R010';
順利刪去一行,打開RB表,發(fā)現(xiàn)前面插入的('R010','B005')也不在了。
alter table reader ADD Rbirthday integer ;
?
alter table reader DROP column Rbirthday;
alter table reader modify Raddress varchar2(50);
alter table book add constraint bp check (Bprice BETWEEN 10 and 100);
alter table Reader add constraint rr check (Rage BETWEEN 16 and 60);
drop table reader CASCADE;
drop table reader CASCADE CONSTRAINTS;
drop table rb CASCADE CONSTRAINTS;
drop table book CASCADE CONSTRAINTS;
索引的建立與刪除
create unique index myindex on reader(rname);
報(bào)告出錯(cuò):"cannot CREATE UNIQUE INDEX; duplicate keys found"
如何修改表格數(shù)據(jù),再建索引
?解決方法很簡(jiǎn)單,要么把數(shù)據(jù)庫(kù)的數(shù)據(jù)清理掉;要么把你要?jiǎng)?chuàng)建唯一索引的那一列重復(fù)的數(shù)據(jù)刪掉。我選擇的是創(chuàng)建唯一索引的那一列重復(fù)的數(shù)據(jù)刪掉一個(gè)。
drop index myindex;
視圖
grant resource, connect, DBA? to cc;
否則系統(tǒng)顯示沒有創(chuàng)建視圖的權(quán)限。執(zhí)行完之后再回到CC的連接:
在ORACLE SQL Developer 的左上方:
CREATE VIEW V416 as select rno,rname,rage from reader where raddress='416'
確認(rèn)該視圖的存在:
select * from v416
SELECT rno,rname from v416 WHERE rage>30;
insert into v416( rno,rname,rage) values('R999','new reader',99);
select * from reader
select * from v416
插入成功了嗎?為什么通過視圖插入的紀(jì)錄在視圖中看不見?
剛插入數(shù)據(jù)條件不滿足此視圖的條件了
CREATE VIEW V417 as select rno,rname,rsex,rage,raddress from reader where raddress='417' with check option;
select * from v417
insert into v417( rno,rname,rage) values('R777','417 reader',66);
執(zhí)行不成功。
drop view v417;
CREATE VIEW V417 as select rno,rname,rsex,rage,raddress from reader where raddress='417' with check option;
insert into v417( rno,rname,rage,raddress) values('R777','417 reader',66,'417');
執(zhí)行成功。
select * from v416;
delete from v416 where rname='王小倩';
select * from v416;
CREATE VIEW FV417 as select * from V417 where RSEX='女';
select * from FV417;
SELECT * FROM V417;
Delete from v417 where v417.rno not in (SELECT rno from rb);
SELECT * FROM V417;
SELECT BNO,COUNT(*) FROM RB GROUP BY BNO;
?CREATE VIEW GV(BNO,COUNTS) ?AS? SELECT BNO,COUNT(*) FROM RB GROUP BY BNO;
?SELECT * FROM GV;
思考是否可以向GV中插入數(shù)據(jù),為什么?
不可以向GV插入數(shù)據(jù),因?yàn)镚V的內(nèi)容并非數(shù)據(jù),而是數(shù)據(jù)和相關(guān)數(shù)據(jù)統(tǒng)計(jì)結(jié)果。
drop view v417
?
觸發(fā)器(可不做,時(shí)間多再做)
參考PLSQL幫助文檔,試試建立一個(gè)觸發(fā)器。在用戶執(zhí)行刪除某個(gè)員工的時(shí)候觸發(fā),該觸發(fā)器的功能是先刪除RB中該員工的借書記錄,然后刪除Reader中該員工記錄。
實(shí)驗(yàn)報(bào)告要求
寫出實(shí)驗(yàn)步驟及相關(guān)的SQL語(yǔ)句即可。
總結(jié)
以上是生活随笔為你收集整理的数据库实验二 SQL语言的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL中count(*)用法
- 下一篇: linux cmake编译源码,linu