中南大学数据库实验.docx
《中南大学数据库实验.docx》由会员分享,可在线阅读,更多相关《中南大学数据库实验.docx(22页珍藏版)》请在冰豆网上搜索。
中南大学数据库实验
中南大学
电子技术课程设计
题目:
数据库实验报告
学院:
信息科学与工程学院
专业班级:
电子信息1002班
学号:
学生姓名:
指导老师:
张祖平
实验一、熟悉ORALCE环境并练习SQL的定义
一、目的与要求
本实验主要是熟悉ORACLE的运行环境,在CLIENT端进行联接设置与服务器联通,进入ORACLE的SQL*PLUS的操作环境,进一步建立表格,并考虑主键,外部键,值约束。
二、操作环境
硬件:
主频2GHz以上服务器(内存2GB以上、硬件空闲2.2GB以上),主频1GHz以上微机,内存1GB以上。
软件:
WINDOWSXP/2000/2003SERVER可安装ORACLE/9i/10g/11g/13iFORNT/WINDOWS(注意在32位与64位的区别,可选企业版)如果windows非server如XP等,安装时请选择个人版(PERSONAL)
三、实验内容
1.上机步骤
单机版:
(1)先启动PERSONALORACLE(STARTDATABASE)
(2)用sql*plus登录(开始--程序-ORACLEFORWIN-SQLP*PLUS(与网络版相同)进入SQL*PLUS
用户名:
SYSTEM/manager(其中manager为缺省口令,安装需要设定,根据设定的密码进行相应变化;不要数据库联接串,其中SYSTEM为DBA用户)
还有一般用户scott/tiger
(3)进入SQL>状态,可以执行SQL中的任何命令(建表,插入、删除、修改、查询等),还可建立用户、数据库等操作。
(4)退出,在SQL>状态,EXIT回车
网络版:
在实验室上机时,一般安装时管理员已设置好.先找到windows中的oracle服务(一般为oracleserviceORCL),启动此服务,再找到sql*plus所在的位置(一般桌面上有),运行即可进行登录界面.
实验室现有环境操作步骤:
(1)打开控制面板,――>管理工具――>服务――>启动OracleServiceORCL
或者如图通过界面或资源管理器右键找到管理:
再找服务:
启动的服务如下或有OracleService****的服务:
(2)从桌面执行SQL*PLUS或在程序中
(3)输入:
system/manager
(4)在SQL>状态输入建立用户命令:
createuserusernameidentifiedbypassword;
其中username与password不要数字开头,用户名username中按规则加班级学号后缀
如:
U_31521表示3班学号尾数为1521号的用户。
(5)给用户授权:
grantresource,connecttousername;
(6)连接用户:
connectusername/password
在SQL>就可以建表等操作了
四、思考题
1.改变表的名称及数据类型再进行相应的操作。
2.先删除主表T_DEPT_?
?
?
?
?
,结果怎么样?
3.修改表中的字段类型与长度,考虑表中有数据或者没数据情况。
4.插入相同的学号与相同的系号会出现什么结果
5.插入空的学号或空的系号会出现的结果
6.改变数据库的别名再进行联接(如有网络版ORACLE)。
五、实验代码
createuserU_21001identifiedbyxiaobai;
grantresource,connecttoU_21001;
connectU_21001/xiaobai
createtablet_dept_21001(dnochar(3)primarykey,dnvarchar2(32),deanchar(8),telchar(8)check(substr(1,4)='8887'));
CREATETABLET_STUD_21001(SNOCHAR(10)PRIMARYKEY,SNAMEvarCHAR2(8),BIRTHDAYDATE,ADDRESSvarCHAR2(10),
DNOCHAR(3)REFERENCEST_DEPT_21001(DNO)
);
INSERTINTOT_DEPT_21001VALUES('D01','计算机系','王大明','88879626');
INSERTINTOT_DEPT_21001VALUES('D02','物理系','张大奔','88879726');
INSERTINTOT_DEPT_21001VALUES('D03','化学系','李水明','88879826');
INSERTINTOT_DEPT_21001VALUES('D04','管理系','欧阳卫红','88879926');
INSERTINTOT_DEPT_21001VALUES('D05','电子信息','张祖平','88875926');
INSERTINTOT_DEPT_21001VALUES('D06','外语系','宽左右','88879526');
INSERTINTOT_STUD_21001VALUES('0909100524','胡明天',SYSDATE-365*21,'湖南长沙','D01');
INSERTINTOT_STUD_21001VALUES('0909100134','唐明海',SYSDATE-365*21,'湖南长沙','D01');
INSERTINTOT_STUD_21001VALUES('0909100224','张丽梅',SYSDATE-365*20,'湖南长沙','D01');
INSERTINTOT_STUD_21001VALUES('0909100324','李有能',SYSDATE-365*22,'湖南长沙','D02');
INSERTINTOT_STUD_21001VALUES('0909100424','王汉中',SYSDATE-365*22,'湖南长沙','D02');
INSERTINTOT_STUD_21001VALUES('0909100464','高强',SYSDATE-365*21,'湖南长沙','D02');
INSERTINTOT_STUD_21001VALUES('0909100474','JONE',SYSDATE-365*23,'湖南长沙','D03');
INSERTINTOT_STUD_21001VALUES('0909100484','SMITH',SYSDATE-365*21,'湖南长沙','D03');
INSERTINTOT_STUD_21001VALUES('0909100594','TOMHONE',SYSDATE-365*22,'湖南长沙','D03');
INSERTINTOT_STUD_21001VALUES('0909100264','张三',SYSDATE-365*22,'湖南长沙','D04');
INSERTINTOT_STUD_21001VALUES('0909100274','李四',SYSDATE-365*21,'湖南长沙','D04');
INSERTINTOT_STUD_21001VALUES('0909101001','白志恒',SYSDATE-365*20,'新疆额敏','D02');
INSERTINTOT_STUD_21001VALUES('0909081116','李友敏',SYSDATE-365*20,'新疆额敏','D03');
INSERTINTOT_STUD_21001VALUES('0909071116','王尼玛',SYSDATE-365*20,'新疆额敏','D01');
INSERTINTOT_STUD_21001VALUES('0909081516','杨坑跌',SYSDATE-365*20,'新疆额敏','D03');
INSERTINTOT_STUD_21001VALUES('0909081016','称飞机',SYSDATE-365*20,'新疆额敏','D03');
INSERTINTOT_STUD_21001VALUES('0909081216','程管子',SYSDATE-365*20,'新疆额敏','D04');
INSERTINTOT_STUD_21001VALUES('0909071314','华超',SYSDATE-365*20,'新疆额敏','D04');
INSERTINTOT_STUD_21001VALUES('0909071612','旷昀',SYSDATE-365*20,'新疆额敏','D02');
实验二、记录查询
一、目的与要求
本实验主要是熟悉在SQL*PLUS环境下进行数据记录查询,其中查询考虑简单查询,复杂查询,嵌套查询。
二、操作环境
同实验一。
三、实验内容
1.查询所有学生记录
2.查询所有系的记录,并按系号升序排列
3.查询有自己姓名的记录
4.查询’李四’的SNO,SNAME,BIRTHDAY
5.查询计算系所有的学生记录
6.查询各计算系学生在各年龄值的人数,如19的为200,20的有500等
7.查询’李四’的SNO,BIRTHDAY,DNO,DN,DEAN
四、思考题
1.查询学生的记录数。
2.在DEPT_?
?
?
?
?
中输入不是’8887’开头的电话记录。
3.查询平均年龄小于22岁的系号及学生SNO,SNAME,AGE
4.找出平均年龄大于20的系名及平均年龄数
5.的多个查询例子.
五、实验代码
select*fromt_dept_21001;
select*fromt_stud_21001;
selectdn,dnofromt_dept_21001orderbydno;
select*fromt_stud_21001wheresnamelike('白志恒');
selectsno,sname,birthdayfromt_stud_21001wheresnamelike('李%四');
selectsno,sname,birthdayfromt_stud_21001wheresname='李四';
selectsno,sname,address,birthday,t_stud_21001.dnofromt_stud_21001,t_dept_21001
wheret_stud_21001.dno=t_dept_21001.dnoandt_dept_21001.dn='计算机系';
selectceil((sysdate-birthday)/365-1)asage,count(*)fromt_stud_21001wherednoin
(selectdnofromt_dept_21001wheredn='计算机系')
groupby(sysdate-birthday)/365-1;
selectsno,birthday,t_stud_21001.dno,dn,deanfromt_stud_21001,t_dept_21001
wheret_stud_21001.dno=t_dept_21001.dnoandsname='李四';
实验三、SQL的数据操纵
一、目的与要求
本实验主要是熟悉在SQL*PLUS环境下进行数据记录的修改、删除及表结构的修改
二、操作环境
同实验一。
三、实验内容
1.在T_STUD中增加AGENUMBER
(2)/*年龄*/字段,并求出每个学生入校时的年龄。
2.将T_STUD_?
?
?
?
?
表中的08级学生的年龄都加3
3.将T_DEPT_?
?
?
?
?
表中的’计算机系’改为’信息科学与工程学院’
4.删除07级以前的所有的学生记录
四、思考题
1.误删了T_STUD_?
?
?
?
?
中的记录,怎么办?
2.怎么样才能做到在一个语句中将学生的年龄加上相应的学习年数(如08级加3,09级加2,10级加1,07级加4等)。
3.建立与T_STUD_?
?
?
?
?
对应的表T_ST_?
?
?
?
?
(SNO,SNAME,AGE/*年龄*/),在T_ST_?
?
?
?
?
输入若干学号(在T_STUD_?
?
?
中有的有几个),然后将T_STUD_?
?
?
?
?
中的SNAME,BIRTHDAY转入到T_ST_?
?
?
?
?
相应的SNO,AGE(多表间的更新)。
4.行教材上的更新(包括更新)的例子。
五、实验代码
altertablet_stud_21001addagenumber
(2);
updatet_stud_21001setage=ceil((sysdate-birthday)/365-1);
select*fromt_stud_21001;
updatet_stud_21001setage=age+3wheresubstr(sno,5,2)='08';
select*fromt_stud_21001;
updatet_dept_21001setdn='信息科学与工程学院'wheredn='计算机系';
select*fromt_dept_21001;
deletefromt_stud_21001whereto_number(substr(sno,5,2))<7;
select*fromt_stud_21001;
实验四、视图及权限控制
一、目的与要求
本实验主要是熟悉在SQL*PLUS环境下进行数据视图及权限控制的操作。
二、操作环境
同实验一。
三、实验内容
1.视图的建立
/*视图建立*/CREATEVIEWV_S_D_?
?
?
?
?
ASSELECTSNO,SNAME,T_STUD_?
?
?
?
?
.DNO,DN,TELFROMT_STUD_?
?
?
?
?
T_DEPT_?
?
?
?
?
WHERET_STUD_?
?
?
?
?
.DNO=T_DEPT_?
?
?
?
?
.DNOANDTO_CHAR(BIRTHDAY,'YYYY')>='1991';
2.对视图进行查询
3.分别将对象的各种权限授予相应的用户假若已有用户SCOTT(视系统实际情况),在SCOTT中看操作权限的变化。
GRANTSELECTONT_STUD_?
?
?
?
?
TOSCOTT;/*GRANTINSERTONT_STUD_?
?
?
?
?
TOSCOTT;*//*GRANTUPDATE(BIRTHDAY)ONT_STUD_?
?
?
?
?
TOSCOTT;*//*GRANTDELETEONT_STUD_?
?
?
?
?
TOSCOTT;*//*GRANTSELECTONV_S_D_?
?
?
?
?
TOSCOTT;*/
四、思考题
1.在视图V_S_D_?
?
?
?
?
中只考虑信息09级,视图将怎样建立?
2.如果用户为DBA,还需要给授权吗?
3.考虑基于一个表、简单条件的视图的更新操作。
4.考虑基于多表视图的更新操作。
5.设计与实现
针对用户的不同,建立视图,只出现用户本身的记录
提示:
有用户创建、表创建、视图建立、权限控制、用户联接、查询等操作
五、实验代码
connectsystem/Cheng101;
grantcreateviewtoU_21001;
connectU_21001/xiaobai
createviewv_s_d_21001asselectsno,sname,t_stud_21001.dno,dn,telfromt_stud_21001,
t_dept_21001wheret_stud_21001.dno=t_dept_21001.dno
andto_char(birthday,'yyyy')>='1991';
select*fromv_s_d_21001;
grantselectont_stud_21001toscott;
grantinsertont_stud_21001toscott;
grantupdateont_stud_21001toscott;
grantdeleteont_stud_21001toscott;
grantselectonv_s_d_21001toscott;
select*fromt_dept_21001;
CREATEVIEW1V_S_D_21001ASSELECTSNO,SNAME,T_STUD_21001.DNO,DN,TELFROMT_STUD_21001,T_DEPT_21001WHERET_STUD_21001.DNO=T_DEPT_21001.DNOANDTO_CHAR(BIRTHDAY,'YYYY')>='1991';
实验五、数据库触发器与过程
一、目的与要求
本实验主要是熟悉在SQL*PLUS环境下数据库触发器的建立及作用,了解大型数据库编程。
二、操作环境
同实验一。
三、实验内容
1.先建立表T_ST_?
?
?
?
?
(SNO,SNAME,AGE)
2.建立触发器CREATEORREPLACETRIGGERtg_STUD_TRG_?
?
?
?
?
BEFOREINSERTORUPDATEORDELETEONT_STUD_?
?
?
?
?
FOREACHROWBEGIN/*插入*/IFINSERTINGTHENINSERTINTOT_ST_?
?
?
?
?
VALUES(:
NEW.SNO,:
NEW.SNAME,(SYSDATE-:
NEW.BIRTHDAY)/365);
ENDIF;
/*修改*
IFUPDATINGTHEN
DELETEFROMT_ST_?
?
?
?
?
WHERESNO=:
OLD.SNO;
INSERTINTOT_ST_?
?
?
?
?
VALUES(:
NEW.SNO,:
NEW.SNAME,(SYSDATE-:
NEW.BIRTHDAY)/365);
ENDIF;
/*删除*/
IFDELETINGTHEN
DELETEFROMT_ST_?
?
?
?
?
WHERESNO=:
OLD.SNO;
ENDIF;
END.
3.验证触发器的作用
在T_STUD_?
?
?
?
?
中输入、修改、删除数据时,查看T_ST_?
?
?
?
?
表中的变化。
4.设计并调试过程
(1)分系dno统计T_STUD_?
?
?
?
?
表中各年龄的人数
四、思考题
1.如果在T_STUD_?
?
?
?
?
中不允许修改SNO,触发器将怎样改进?
2.调试过程
(1)中,如只要某系号dno的T_STUD_?
?
?
?
?
表中各年龄的统计人数,过程
(1)怎么样改进?
3.在过程
(2)中,如果要考虑客户或代理或产品的分月统计情况,过程将怎么样设计并实现
五、实验代码
1、已建createtablet_ST_21001(SNOCHAR(10),SNAMECHAR(8),AGENUMBER
(2),PRIMARYKEY(SNO));
2、CREATEORREPLACETRIGGERtg_STUD_TRG_21001
BEFOREINSERTORUPDATEORDELETEONT_STUD_21001
FOREACHROW
BEGIN
/*插入*/
IFINSERTINGTHEN
INSERTINTOT_ST_21001
VALUES(:
NEW.SNO,:
NEW.SNAME,(SYSDATE-:
NEW.BIRTHDAY)/365);
ENDIF;
/*修改*/
IFUPDATINGTHEN
DELETEFROMT_ST_21001WHERESNO=:
OLD.SNO;
INSERTINTOT_ST_21001
VALUES(:
NEW.SNO,:
NEW.SNAME,(SYSDATE-:
NEW.BIRTHDAY)/365);
ENDIF;
/*删除*/
IFDELETINGTHEN
DELETEFROMT_ST_21001WHERESNO=:
OLD.SNO;
ENDIF;
END;
3、在T_STUD_21001中输入、修改、删除数据时,查看T_ST_21001表中的变化。
:
ALTERTABLET_STUD_21001DROPCOLUMNAGEcascadeconstraints;
INSERTINTOT_STUD_21001VALUES('0909080101','陈奕迅',date'1980-05-02','中国香港','D01');
INSERTINTOT_STUD_21001VALUES('0909080120','范逸臣',date'1978-02-15','中国台北','D01');
INSERTINTOT_STUD_21001VALUES('0909070306','黄伟佳',date'1991-01-01','北京','D06');
INSERTINTOT_STUD_21001VALUES('0909070510','王硕',date'1991-03-24','上海','D07');
INSERTINTOT_STUD_21001VALUES('0909090808','刘春光',date'1990-04-24','天津','D02');
SELECT*FROMT_ST_21001;
UPDATET_STUD_21001SETBIRTHDAY=DATE'1978-06-02'WHERESNAME='范逸臣';
SELECT*FROMT_ST_21001;DELETEFROMSTD_31720WHERESNAME='范逸臣';
SELECT*FROMT_ST_21001;
4、
(1)分系dno统计T_STUD_21001表中各年龄的人数
(2)根据Bank数据库,分街道(street)统计客户的存款余额(balance),其中街道名为变量
运行结果
计算机系D01
物理系D02
化学系D03
管理系D04
电子信息D05
外语系D06
已选择6行。
SQL>select*fromt_stud_21001wheresnamelike('白志恒');
SNOSNAMEBIRTHDAYADDRESSDNO
---------------------------------------------
0909101001白志恒08-5月-93新疆额敏D02
SQL>selectsno,sname,birthdayfromt_stud_21001wheresnamelike('李%四');
SNOSNAMEBIRTHDAY
-----