数据库实验二 SQL语言

实验二

SQL语言

实验目的

熟悉并掌握创建表,插入记录,查询记录,删除记录,修改记录。

创建索引,删除索引。

创建视图,使用视图,删除视图。

 

实验内容

现有一个单位内部的小型图书借阅系统,假设每本图书的数量无限制,并且可以借给任何单位成员,每个单位成员可以借多本书,单位成员与图书的关系是多对多的关系。假设系统中仅有三个关系模式。

数据表结构

Reader

属性名

类型

长度

是否空

含义

RNO

varchar2

4

 

员工编号(主码)

Rname

varchar2

10

员工姓名

Rsex

varchar2

2

 

性别

Rage

integer

integer

 

年龄

Rboss

varchar2

10

 

直接上司

Raddress

varchar2

30

 

办公地点

Book

属性名

类型

长度

是否空

含义

BNO

varchar2

4

 

书本编号(主码)

Bname

varchar2

50

书名

Bauthor

varchar2

50

 

作者

Bpress

varchar2

50

 

出版社

Bprice

varchar2

numeric(6,2)

 

价格

RB

属性名

类型

长度

是否空

含义

RNO

varchar2

4

 

员工编号

BNO

varchar2

4

 

书本编号

RBdate

date

 

 

借阅日期

 

 

 

 

 

部分提示(黄色底的代码可以直接粘贴运行):

  1. 创建新的用户并授权:

create user cc identified by ccpassword ;

grant resource, connect, DBA  to cc;

  1. 以用户CC的身份建立连接,并在此连接下执行后面的操作;
  2. 拷贝代码运行,删去旧的同名数据表:

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?

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

) ;

  1. 拷贝代码运行,向Reader表格中插入十条数据

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');

  1. 查询记录:在Reader表中查询直接上司是“李四”的员工的名字

select Rname from Reader where Rboss='李四';

  1. 修改记录:在Reader表中把直接上司是“李四”的员工的办公地点统一改为“420

UPDATE reader SET Raddress='420' WHERE rboss='李四';

  1. 删除记录:在Reader表中把直接上司未赋值(NULL)是记录删去

DELETE FROM reader WHERE rboss=NULL;

  1. 删去数据表:把整个Reader表删去

DROP TABLE reader;

  1. 重新执行第一、二步,即建立数据表、插入数据。

 

  1. 创建表格Reader2,比较Reader2Reader中的记录和结构是否相同

create table reader2 as select *  from reader; --创建表格reader2

查看这两个数据表的结构、内容是否相同?分别执行:

desc reader;

desc reader2;

也可以在可视化界面查看这两个表所附带的约束

  1. 分别执行下面的每行语句,查看语句是否执行成功,分析为什么?

update reader set RNO='R001' where Rname='张三';

表reader中的RNO是primary key,更新后的RNO与现存的RNO重复,违反唯一约束条件

 

update reader2 set RNO='R001' where Rname='张三';

insert into reader2(RNO,Rname,Rsex,Rage,Rboss, Raddress) values(null,'lisi',null,null,null,null);

READER2

 

  1. 删除Reader2表格;

DROP TABLE READER2;

  1. 拷贝代码运行,建立表格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)

);

  1. 拷贝代码运行,向Book表格中插入5条数据

insert into book (BNO,Bauthor,Bname, bpress, bprice) values('B001','严蔚敏','数据结构','清华大学出版社',null);

insert into book (BNO,Bauthor,Bname, bpress, bprice) values('B002','唐发根','数据结构','北航出版社',24);

insert into book (BNO,Bauthor,Bname, bpress, bprice) values('B003','王珊','数据库原理','高等教育出版社',40);

insert into book (BNO,Bauthor,Bname, bpress, bprice) values('B004','张飞','数据库原理','清华大学出版社',30);

insert into book (BNO,Bauthor,Bname, bpress, bprice) values('B005','王珊','数据库原理','清华大学出版社',null);

  1. 拷贝代码运行,建立表格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)

);

  1. 拷贝代码运行,向RB表格中插入13条数据;

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');

初始数据

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表中数据

BNO

BNAME

BAUTHOR

BPRESS

BPRICE

B002

数据结构

唐发根

北航出版社

24

B003

数据库原理

王珊

高等教育出版社

40

B004

数据库原理

张飞

清华大学出版社

30

B005

数据库原理

王珊

清华大学出版社

 

B001

数据结构

严蔚敏

清华大学出版社

 

 

RB表中数据

RNO

BNO

RBDATE(实验时间)

R001

B001

插入数据时的系统时间

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表中创建的约束类型,其中constraint_type为约束类型,该属性值的取值Type Code如下表所示。(可以根据上课所讲的实体完整性、参照完整性、用户自定义完整性理解以下约束类型;直接在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

 

  1. 执行insert into RB(RNO,BNO) values('R010','B005');
  2. 写出删除Reader表格中编号为’R010’的员工,如果执行错误,分析错误原因。
  3. 想办法删除Reader中的’R010’员工;

方法一:先把RB中所有’R010’的借书记录都删掉

方法二:修改数据表READER的结构,允许级联删除(注:ORACLE不支持级联更新)。

alter table rb add constraint MYFK foreign key(rno) references reader(rno) on delete cascade;

系统提示:SQL 错误: ORA-02275: 此表中已经存在这样的引用约束条件

 

可见,首先要先删去原来的约束,因建表时没给该约束命名,故应查这个约束的名字,才能删去。注意,这个名字由系统自动赋值,不同的环境下约束名可能不同):

alter table rb drop constraint SYS_C0011303;

alter table rb add constraint MYFK foreign key(rno) references reader(rno) on delete cascade;

 

再执行:delete from reader where rno='R010';

顺利删去一行,打开RB表,发现前面插入的('R010','B005')也不在了。

  1. Reader表添加一个属性列“出生年份”,名为Rbirthday,整数;

alter table reader ADD Rbirthday integer ;

  1. 对于Reader表格,员工编号可以确定年龄,年龄又可以确定出生年份,因此存在传递函数依赖关系,删除Rbirthday列,使关系模式符合第三范式要求;

 

alter table reader DROP column Rbirthday;

  1. 修改Reader表格的Raddress属性,使其长度为50,数据类型不变;

alter table reader modify Raddress varchar2(50);

  1. 修改book表的Bprice属性,使其值得范围在10100之间;

alter table book add constraint bp check (Bprice BETWEEN 10 and 100);

  1. 修改Reader表的Rage属性,使其值得范围为1660之间。

alter table Reader add constraint rr check (Rage BETWEEN 16 and 60);

  1. 试试是否可以删除Reader表,使用CASCADE是否可以删除?

drop table reader CASCADE;

drop table reader CASCADE CONSTRAINTS;

  1. 删除ReaderBookRB表。

drop table rb CASCADE CONSTRAINTS;

drop table book CASCADE CONSTRAINTS;

索引的建立与删除

  1. 重新执行前面的代码创建三个数据表并插入数据;
  2. Reader表格的Rname建立UNIQUE索引

create unique index myindex on reader(rname);

报告出错:"cannot CREATE UNIQUE INDEX; duplicate keys found"

如何修改表格数据,再建索引

 解决方法很简单,要么把数据库的数据清理掉;要么把你要创建唯一索引的那一列重复的数据删掉。我选择的是创建唯一索引的那一列重复的数据删掉一个。

  1. 删除索引。

drop index myindex;

视图

  1. 如果上面的运行是在CC的连接中,则需要回到在sysdba 的连接中,执行:

grant resource, connect, DBA  to cc;

否则系统显示没有创建视图的权限。执行完之后再回到CC的连接:

ORACLE SQL Developer 的左上方:

  1. 建立在416办公室工作的视图V416,视图包括员工的编号、姓名、年龄等信息

CREATE VIEW V416 as select rno,rname,rage from reader where raddress='416'

确认该视图的存在:

select * from v416

  1. V416中查询年龄大于30的员工信息

SELECT rno,rname from v416 WHERE rage>30;

  1. 向视图V416中插入一条新的员工记录,然后从V416中查找该条记录,测试是否可以找到;

insert into v416( rno,rname,rage) values('R999','new reader',99);

select * from reader

select * from v416

插入成功了吗?为什么通过视图插入的纪录在视图中看不见?

刚插入数据条件不满足此视图的条件了

  1. 建立在417办公室工作的视图V417,视图包括员工的编号、姓名、性别、年龄等信息,视图定义带with check option选项;

CREATE VIEW V417 as select rno,rname,rsex,rage,raddress from reader where raddress='417' with check option;

select * from v417

  1. 向视图V417中插入一条新的员工记录,然后从V417中查找该条记录,测试是否可以找到;

insert into v417( rno,rname,rage) values('R777','417 reader',66);

执行不成功。

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');

执行成功。

  1. 通过视图删除刚插入的员工记录,在基本表Reader中查看是否已经删除成功?

select * from v416;

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

select * from v416;

  1. 在视图V417上建立所有女员工信息的视图FV417,查询视图结果

CREATE VIEW FV417 as select * from V417 where RSEX='女';

select * from FV417;

  1. 删除视图V417中没有借阅图书的员工信息

SELECT * FROM V417;

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

SELECT * FROM V417;

  1. 建立视图GV,数据包括每本图书的编号及其借阅数量。思考是否可以向GV中插入数据,为什么?

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中插入数据,为什么?

不可以向GV插入数据,因为GV的内容并非数据,而是数据和相关数据统计结果。

  1. 删除视图V417

drop view v417

 

触发器(可不做,时间多再做)

参考PLSQL帮助文档,试试建立一个触发器。在用户执行删除某个员工的时候触发,该触发器的功能是先删除RB中该员工的借书记录,然后删除Reader中该员工记录。

实验报告要求

写出实验步骤及相关的SQL语句即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/418907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XMPP之openfire无法启动

之前半个月自学ios的时候自己也配置过xmpp框架,也从github上下载了demo试了下,也是很完美运行的,最近想着再回头把XMPP框架系统的学习一下 ,毕竟当时学的时候还是在虚拟机中,卡死了。我这安装java的JDK后,下载安装openfire时无法启动openfire…

前端学习(1798):前端调试之css伪元素练习

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

数据库实验三 SQL查询数据

实验三 SQL查询数据 实验目的 熟练掌握使用SQL查询语言。完成各类查询操作&#xff08;单表查询&#xff0c;连接查询&#xff0c;嵌套查询&#xff0c;集合查询&#xff09;。 实验内容 现有一个单位内部的小型图书借阅系统&#xff0c;假设每本图书的数量无限制&#xff…

CAF(C++ actor framework)(序列化之结构体,任意嵌套STL)(一)

User-Defined Data Types in Messages&#xff08;用户自定义类型&#xff09;All user-defined types must be explicitly “announced” so that CAF can (de)serialize them correctly. 之前干活&#xff0c;一开始不知道CAF自带序列化&#xff0c;都用boost库来做序列化&am…

数据结构实验二 树和二叉树的实现

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼418A&#xff09; 2019年5月13日 学院 计算机科学与教育软件学院 年级、专业、班 计算机科学与技术172班 姓名 学号 17061 实验课程名称 数据结构实验 成绩 实验项目名…

前端学习(1800):前端调试之清除浮动练习1

<!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title><link r…

ArcGIS生成根据点图层生成等值面并减小栅格锯齿的操作步骤

ArcGIS生成根据点图层生成等值面并减小栅格锯齿的操作步骤 原文:ArcGIS生成根据点图层生成等值面并减小栅格锯齿的操作步骤一、打开ArcMAP并加载上相应的点图层和边界面图层 二、ArcToolbox--Spatial Analyst工具--差值分析--克里金法(根据不同的情况选择不同的算法&#xff0c…

数据结构实验三 树的遍历生成树

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼418A&#xff09; 2019年4月19日 学院 计算机科学与教育软件学院 年级、专业、班 计算机科学与技术 姓名 学号 实验课程名称 数据结构实验 成绩 实验项目名称 实验三…

前端学习(1800):前端调试之清除浮动练习2

<!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title><!-- 不…

java參数传递机制浅析

欢迎转载&#xff0c;转载请声明出处&#xff01;-----------------------------------------前言&#xff1a;java语言中&#xff0c;參数的传递仅仅有一种机制。那就是值传递。 举例&#xff1a;以下将通过几个样例来说明java中的參数传递机制&#xff0c;这些样例基本涵盖了…

数据库实验四 用户权限管理

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼418B&#xff09; 2019年5月22日 学院 计算机科学与网络工程学院 年级、专业、班 计科172 姓名 学号 实验课程名称 数据库原理实验 成绩 实验项目名称 用户权限管理…

前端学习(1801):前端调试之清除浮动练习3

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

Java编程思想学习(一) 一切都是对象

前言 Java是基于C的&#xff0c;但Java是一种更加纯粹的面向对象程序设计语言。 C和Java都是混合&#xff0f;杂合型语言。杂合型语言允许多种编程风格。 用引用操纵对象 每种编程语言都有自己操纵内存中元素的方式。 直接操纵元素用某种基于特殊语法的间接表示&#xff08;C和…

C++学习笔记之对文件的操作1

转载自** https://www.cnblogs.com/uniqueliu/archive/2011/08/03/2126545.html ** 前言 我们在编写程序的时候&#xff0c;最密不可分的就是对文件进行相应的操作&#xff0c;我们可以从文件中读取数据&#xff0c;可以将数据保存到文件&#xff0c;可以…… 总而言之&…

C++学习笔记之对文件的操作2

转载自** https://www.cnblogs.com/uniqueliu/archive/2011/08/03/2126680.html ** 什么都不说了&#xff0c;继续《C学习笔记之对文件的操作<1>》的内容… 功能展示 打开文件的方式 当我们想要打开的文件不存在的时候&#xff0c;一般地&#xff0c;ofstream类的对象…

前端学习(1802):前端调试之事件伪类练习

index.html <!DOCTYPE html> <html lang"en"><head> <!--系统内置 start--> <script type"text/javascript"></script> <!--系统内置 end--><meta charset"UTF-8"><title>练习</titl…

前端学习(1809):前端调试之微博头部开发

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>微博实战--head&l…

数据结构实验四 排序算法的实现

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼416&#xff09; 2019年6月4日 学院 计算机科学与教育软件学院 年级、专业、班 姓名 学号 实验课程名称 数据结构实验 成绩 实验项目名称 实验四 排序算法 指导老…