日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

数据库实验二 SQL语言

發(fā)布時(shí)間:2023/12/10 数据库 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库实验二 SQL语言 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

實(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)行):

  • 創(chuàng)建新的用戶并授權(quán):
  • create user cc identified by ccpassword ;

    grant resource, connect, DBA? to cc;

  • 以用戶CC的身份建立連接,并在此連接下執(zhí)行后面的操作;
  • 拷貝代碼運(yùn)行,刪去舊的同名數(shù)據(jù)表:
  • 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?

  • 建立表格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)

    ) ;

  • 拷貝代碼運(yùn)行,向Reader表格中插入十條數(shù)據(jù)
  • 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');

  • 查詢記錄:在Reader表中查詢直接上司是“李四”的員工的名字
  • select Rname from Reader where Rboss='李四';

  • 修改記錄:在Reader表中把直接上司是“李四”的員工的辦公地點(diǎn)統(tǒng)一改為“420
  • UPDATE reader SET Raddress='420' WHERE rboss='李四';

  • 刪除記錄:在Reader表中把直接上司未賦值(NULL)是記錄刪去
  • DELETE FROM reader WHERE rboss=NULL;

  • 刪去數(shù)據(jù)表:把整個(gè)Reader表刪去
  • DROP TABLE reader;

  • 重新執(zhí)行第一、二步,即建立數(shù)據(jù)表、插入數(shù)據(jù)。
  • ?

  • 創(chuàng)建表格Reader2,比較Reader2Reader中的記錄和結(jié)構(gòu)是否相同
  • create table reader2 as select *? from reader; --創(chuàng)建表格reader2

    查看這兩個(gè)數(shù)據(jù)表的結(jié)構(gòu)、內(nèi)容是否相同?分別執(zhí)行:

    desc reader;

    desc reader2;

    也可以在可視化界面查看這兩個(gè)表所附帶的約束

  • 分別執(zhí)行下面的每行語(yǔ)句,查看語(yǔ)句是否執(zhí)行成功,分析為什么?
  • 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

    ?

  • 刪除Reader2表格;
  • DROP TABLE READER2;

  • 拷貝代碼運(yùn)行,建立表格Book
  • create table Book

    (

    ??? BNO????? varchar2(4),

    ??? Bname??? varchar2(50) not null,

    ??? Bauthor? varchar2(50),

    ??? Bpress??? varchar2(50),

    ??? Bprice??? numeric(6,2),

    ??? primary key(BNO)

    );

  • 拷貝代碼運(yùn)行,向Book表格中插入5條數(shù)據(jù)
  • 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);

  • 拷貝代碼運(yùn)行,建立表格RB
  • 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)

    );

  • 拷貝代碼運(yùn)行,向RB表格中插入13條數(shù)據(jù);
  • 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

    ?

  • 執(zhí)行insert into RB(RNO,BNO) values('R010','B005');
  • 寫出刪除Reader表格中編號(hào)為’R010’的員工,如果執(zhí)行錯(cuò)誤,分析錯(cuò)誤原因。
  • 想辦法刪除Reader中的’R010’員工;
  • 方法一:先把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')也不在了。

  • Reader表添加一個(gè)屬性列“出生年份”,名為Rbirthday,整數(shù);
  • alter table reader ADD Rbirthday integer ;

  • 對(duì)于Reader表格,員工編號(hào)可以確定年齡,年齡又可以確定出生年份,因此存在傳遞函數(shù)依賴關(guān)系,刪除Rbirthday列,使關(guān)系模式符合第三范式要求;
  • ?

    alter table reader DROP column Rbirthday;

  • 修改Reader表格的Raddress屬性,使其長(zhǎng)度為50,數(shù)據(jù)類型不變;
  • alter table reader modify Raddress varchar2(50);

  • 修改book表的Bprice屬性,使其值得范圍在10100之間;
  • alter table book add constraint bp check (Bprice BETWEEN 10 and 100);

  • 修改Reader表的Rage屬性,使其值得范圍為1660之間。
  • alter table Reader add constraint rr check (Rage BETWEEN 16 and 60);

  • 試試是否可以刪除Reader表,使用CASCADE是否可以刪除?
  • drop table reader CASCADE;

    drop table reader CASCADE CONSTRAINTS;

  • 刪除ReaderBookRB表。
  • drop table rb CASCADE CONSTRAINTS;

    drop table book CASCADE CONSTRAINTS;

    索引的建立與刪除

  • 重新執(zhí)行前面的代碼創(chuàng)建三個(gè)數(shù)據(jù)表并插入數(shù)據(jù);
  • Reader表格的Rname建立UNIQUE索引
  • 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;

    視圖

  • 如果上面的運(yùn)行是在CC的連接中,則需要回到在sysdba 的連接中,執(zhí)行:
  • grant resource, connect, DBA? to cc;

    否則系統(tǒng)顯示沒有創(chuàng)建視圖的權(quán)限。執(zhí)行完之后再回到CC的連接:

    ORACLE SQL Developer 的左上方:

  • 建立在416辦公室工作的視圖V416,視圖包括員工的編號(hào)、姓名、年齡等信息
  • CREATE VIEW V416 as select rno,rname,rage from reader where raddress='416'

    確認(rèn)該視圖的存在:

    select * from v416

  • V416中查詢年齡大于30的員工信息
  • SELECT rno,rname from v416 WHERE rage>30;

  • 向視圖V416中插入一條新的員工記錄,然后從V416中查找該條記錄,測(cè)試是否可以找到;
  • insert into v416( rno,rname,rage) values('R999','new reader',99);

    select * from reader

    select * from v416

    插入成功了嗎?為什么通過視圖插入的紀(jì)錄在視圖中看不見?

    剛插入數(shù)據(jù)條件不滿足此視圖的條件了

  • 建立在417辦公室工作的視圖V417,視圖包括員工的編號(hào)、姓名、性別、年齡等信息,視圖定義帶with check option選項(xiàng);
  • CREATE VIEW V417 as select rno,rname,rsex,rage,raddress from reader where raddress='417' with check option;

    select * from v417

  • 向視圖V417中插入一條新的員工記錄,然后從V417中查找該條記錄,測(cè)試是否可以找到;
  • 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í)行成功。

  • 通過視圖刪除剛插入的員工記錄,在基本表Reader中查看是否已經(jīng)刪除成功?
  • select * from v416;

    delete from v416 where rname='王小倩';

    select * from v416;

  • 在視圖V417上建立所有女員工信息的視圖FV417,查詢視圖結(jié)果
  • CREATE VIEW FV417 as select * from V417 where RSEX='女';

    select * from FV417;

  • 刪除視圖V417中沒有借閱圖書的員工信息
  • SELECT * FROM V417;

    Delete from v417 where v417.rno not in (SELECT rno from rb);

    SELECT * FROM V417;

  • 建立視圖GV,數(shù)據(jù)包括每本圖書的編號(hào)及其借閱數(shù)量。思考是否可以向GV中插入數(shù)據(jù),為什么?
  • 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é)果。

  • 刪除視圖V417
  • 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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。