数据库系统原理实验讲义.docx
《数据库系统原理实验讲义.docx》由会员分享,可在线阅读,更多相关《数据库系统原理实验讲义.docx(49页珍藏版)》请在冰豆网上搜索。
![数据库系统原理实验讲义.docx](https://file1.bdocx.com/fileroot1/2023-1/6/d441f213-ecf8-41ba-b394-ecbe144b6c98/d441f213-ecf8-41ba-b394-ecbe144b6c981.gif)
数据库系统原理实验讲义
《数据库系统原理》
上
机
实
验
讲
义
数学与计算机科学学院
编写:
颜清
实验一创建数据表
一、实验目的
1、熟悉PowerBuilder运行环境;
2、掌握数据表的创建及SQL语言的应用。
二、实验内容
1、有一个教学管理数据库,包含以下基本表:
(表略)
用交互式SQL完成:
(1)建立学生表,主码为学号,性别为‘男’或‘女’。
Createtable学生
(学号#char(8)notnull,
姓名char(8)notnull,
性别char
(2),
年龄smallint,
年级char(8),
系编号integer,
primarykey(学号#),
check(性别=‘男’或‘女’),
)
(2)建立教师表,主码为教师编号,外码为系编号。
Createtable教师
(教师编号#char(8)notnull,
姓名char(8)notnull,
年龄smallint,
职称char(4),
系编号integer,
primarykey(教师编号#),
foreignkey(系编号)references院系(系编号#),
)
(3)建立选课表,主码为学号和课程编号,外码为学号,课程编号。
Createtable选课
(学号#char(8),
课程编号#char(4),
成绩smallint,
primarykey(学号#,课程编号#),
foreignkey(学号#)references学生(学号#),
foreignkey(课程编号#)references课程(课程编号#),
check((成绩isnull)or(成绩between0and100)),
)
(4)将学生张三从编号为001的系转到编号为002的系。
Updata学生
Set系编号#=002
Where姓名=“张三”and系编号#=001
(5)统计学生总人数。
Selectcount(学号#)
From学生
(6)显示计算机系的学生的信息。
Select*
From教师,任课,课程
Wher课程名=”数据库原理”and课程.课程编号#=任课.课程编号#and任课.教师编号#=教师.教师编号#
(7)查找法律系的系办电话。
Select系办电话
From院系
Where系名=“法律系”
(8)删除2000级的学生记录。
Deletefrom学生
Where年级=“2000级”
(9)将计算机系教师张明的职称升为教授。
Updata教师
Set职称=“教授”
Where姓名=”张明”and教师编号#=(select教师编号#
From院系
Where系名=“计算机系”)
(10)统计计算机系教师张明的任课门数。
Selectcount(课程编号#)
From院系,教师,任课
Where院系.系名=“计算机系”and院系.系编号#=教师.系编号#
and教师.教师编号#=任课.教师编号#
(11)统计每个系的教师的人数。
Select系编号#,count(教师编号#)
From教师
Groupby系编号#
(12)查找教授数据库原理的教师的姓名。
Select教师.姓名
From教师,任课,课程
Where课程名=“数据库原理”and课程.课程编号#=任课.课程编号#and任课.教师编号#=教师.教师编号#
(13)删除1020号教师的任课记录。
Deletefrom任课
Where教师编号#=“1020”
(14)将课程数据库原理的学分设为4.
Updata课程
Set学分=4
Where课程名=数据库原理
(15)学生王明每选一个学分交费100元,统计它的选课总费用。
Selectsum(学分)*100
From学生,课程,选课
Where学生.学号#=选课.学号#and选课.课程编号=课程.课程编号#
(16)统计20岁的学生总人数。
Selectcount(age)
From学生
Where学生.年龄=20
(17)选修数据库原理的学生名单
secect学生.姓名
from学生,课程,选课
where课程.课程名=“数据库原理”and课程.课程编号#=选课.课程编号#and选课.学号#=学生.学号#
(18)删除20030号学生的选课记录
deletefrom选课
where学号#=“200030”
(19)建立一个存储过程,通过输入学号,显示学生的姓名,选课课程名,成绩,并统计出选课门数。
Createprocedurereport@idchar(8)as
Select学生.姓名,课程.课程名,选课.成绩,count(课程.课程编号#)
From学生,课程,选课
Where学生.学号#=@idand选课.学号#=学生.学号#and选课.课程编号#=课程.课程编号#
(20)建立一个存储过程,通过输入教师编号,显示教师的姓名,任课课程名,教师院系。
Createprocedurereport@idchar(8)as
Select教师.姓名,课程.课程名,院系.系名
From院系,课程,教师,任课
Where教师.教师编号#=@idand任课.教师编号#=教师.教师编号#and课程.课程编号#=任课.课程编号and教师.系编号=院系.系编号
(21)建立一个存储过程,输入系编号显示学生的学号,姓名。
Createprocedurereport@idchar(8)as
Select学号#,姓名
From学生
Where系编号#=@id
2、有一数据库,包含以下基本表:
(表略)
(1)建立销售明细表,销售编号为主码,外码为商品编号,会员号。
Createtable销售明细
(销售编号#char(4),
商品编号#char(4),
会员号#char(4),
数量integer,
时间time,
primarykey(销售编号#),
foreignkey(商品编号#)references商品(商品编号#),
foreignkey(会员号#)references会员(会员号#),
)
(2)添加一条商品记录(00697,雕牌肥皂,浙江,2.00,日化)
insertinto商品values(00697,”雕牌肥皂”,”浙江”,2.00,”日化”)
(3)产生00695号产品的销售细帐。
Select*
From销售明细
Where商品编号#=00695
(4)根据商品编号00695查找该商品的销售总量。
Selectsum(数量)
From销售明细
Where商品编号#=00695
(5)根据会员号104095删除其会员记录。
Deletefrom会员
Where会员号#=104095
(6)建立一个黄金会员视图。
(消费总金额高于5000的会员为黄金会员)
createview黄金会员
as(select*
from会员
where消费总金额>5000)
(7)建立一个触发器,实现当输入一条销售记录时,将消费金额自动累加到会员的消费总金额。
Createtriggertriname
On销售明细
Forinsertas
Updata会员
Set消费总金额=消费总金额+sum(销售明细.数量*商品.单价)
Where销售明细.会员号#=会员.会员号#and商品.商品编号#=销售明细.商品编号#
实验二PowerBuilder编程基础
一、实验目的
1、熟悉PowerBuilder运行环境;
2、掌握PowerBuilder语法及函数的使用。
二、实验内容
1、对w_data的open事件编程,使w_data一打开dw_1中就显示数据。
(1)显示数据
Dw_1.settransobjict(splca)
Dw_1.retrieve()
(2)添加intI
I=dw_1.insertrow(0)
Dw_1.scrolltorow(i)
Dw_1.setfocus()
删除dw_1.deleterow(0)
保存intj
j=dw_1.updata()
ifI=-1then
messagebox(“information”,“数据无法保存”)
endif
关闭close(parent)
(3)对w_data的closequery事件编程,使dw_1中的数据发生改变而又未保存就退出窗口时给用户一个消息框提示。
Integerm
Ifdw_1.modifiedcount()+deletedcount()>0then
M=messagebox(“信息”“数据已改变,是否保存”,question!
YesNoCance!
)
Ifm=1then
Ifdw_1.updata()=-1then
Messagebox(“information”,”无法保存数据”)
Else
Messagebox(“information”,”已保存数据”)
Endif
Return0
Elseifm=2then
Return0
Elseifm=3then
Return1
2、ddlb_1中为各系名称,当选择了一个系后tv_1显示该系学生姓名,对ddlb_1的selectionchanged事件编程。
IntI
Stringoutname
Declarenamecurcursorfor
Selectdistinctdepartment
From学生
Wheredepartment=:
ddlb_1.text
Opennamecur;
Ifsqlca.sqlcode=-1then
Messagebox(“sqlerror“,sqlca,sqlerrtext)
Else
Fetchnamecurinto:
outname;
Dowheresqlca.sqlcode=0
Frtchnamecurinto:
outname;
I=tv_1.insertitemlast(),outname,2)
L00pwhilesqlca.sqlcode=0
Tv_1:
deleteitem(i)
Endif
Closenamecur;
3、ddlb_1为下拉列表框,st_1,st_2为静态文本框。
该窗口打开时,ddlb_1从数据库中的院系表中读出了所有系名,当选择了某系时st_1,st_2分别显示该系系领导和系办电话。
(1)在w_1的open事件下编程。
Stringoutname
Declarenamecurcursorfor
Selectdistinctdepartment
From院系
Wheredepartment=:
ddlb_1.text
Opennamecur;
Ifsqlca.sqlcode=-1then
Messagebox(“sqlerror“,sqlca,sqlerrtext)
Else
Fetchnamecurinto:
outname;
Dowheresqlca.sqlcode=0
Ddlb_1.additem(outname)
Fetchnamecurinto:
outname;
L00p
Endif
Closenamecur;
(2)在ddlb_1的selectionchanged事件下编程。
Select系领导,系办电话
From院系
Where系名=:
ddlb_1.text
:
st_1.text=系领导
:
st_2.text=系办电话
4、w_query上有控件ddlb_1和dw_1,在ddlb_1中选择系名后dw_1中显示该系的学生。
(1)如果通过带参数的数据窗口对象来完成,请问dw_1中的数据窗口对象的数据源为quickselect还是sqlselect。
答:
sqlselect。
(2)为ddlb_1的selectionchanged事件编程。
Dw_1.settransobject(sqlca)
Dw_1.retricve(ddlb_1.text)
5、当选择了某单选框并输入选择条件,按回车后,dw_1中显示满足条件的记录。
请对以下控件编程。
(1)rb_1
sle_1.enabled=true
(2)sle_1
dw-1.setfilter(“姓名=‘”+sle_1.text+”‘”)
dw_1.filter()
cb_1.visible=true
(3)cb_1
rb_1.checked=false
rb_2.checked=false
rb_3.checked=false
rb_4.checked=false
sle_1.text=“”
sle_2.text=“”
sle_3.text=“”
sle_4.text=“”
sle_1.enable=false
sle_2.enable=false
sle_3.enable=false
sle_4.enable=false
6、lv_1为列表视图,报表风格,当w_list打开时lv_list中显示数据库中学生表的所有学生的信息。
请为w_1的open事件编程。
IntegerI,j,outage
Stringoutname,outsex,soutage
Lv_1.addcolumn(“姓名”,left!
800)
Lv_1.addcolumn(“性别”,left!
500)
Lv_1.addcolumn(“年龄”,left!
200)
Declarenamecurcursorfor
Select姓名,性别,年龄
From学生;
Opennamecur;
Ifsqlca.sqlcode=1then
Messagebox(“sql.error”,sqlca.sqlerrtext)
Else
I=1
Do
Fetchnamecurinto:
outname,:
outsex,:
outage;
J=I
Lv_1.setitem(I,2,outname)
Lv_1.setitem(I,2,outsex)
Soutage=string(outage)
Lv_1.setitem(I,3,soutage)
I++
Loopwhilesqlca.sqlcode=0
Lv_1.deleteitem(j)
Endif
Closenamecur;
实验三计算器设计
一、实验目的
1、熟悉PowerBuilder运行环境;
2、掌握PowerBuilder数据窗口的创建及使用。
二、实验内容
1、用PowerBuilder实现如下计算器(图1):
(图1)
(CTRL+C:
复制按钮及按钮中的代码;CTRL+T:
复制按钮但不复制按钮中相应的代码)
(1)声明变量
decimaldata//保存中间结果
charstr//保存按下的运算符
intflag//flag=1表示按下的数字是前面数字的一部分,flag=0表示按下的数字是一个新的数字的开始
(2)十个数字按钮和小数点按钮代码
ifflag=0then
sle_1.text=""
flag=1
endif
sle_1.text=sle_1.text+this.text
(3)+、-、*、/运算按钮代码
choosecasestr
case'*'
sle_1.text=string(dec(sle_1.text)*data)
case'/'
sle_1.text=string(data/dec(sle_1.text))
case'+'
sle_1.text=string(dec(sle_1.text)+data)
case'-'
sle_1.text=string(data-dec(sle_1.text))
endchoose
data=dec(sle_1.text)
str=this.text
flag=0
(4)“清除”按钮代码
sle_1.text=""
data=0
str=''
flag=0
(5)“=”按钮代码
choosecasestr
case'*'
sle_1.text=string(dec(sle_1.text)*data)
case'/'
sle_1.text=string(data/dec(sle_1.text))
case'+'
sle_1.text=string(dec(sle_1.text)+data)
case'-'
sle_1.text=string(data-dec(sle_1.text))
endchoose
flag=0
str=''
(6)“应用程序”open事件代码
open(w_calculator)
2、求一元二次方程的实根:
ax2+bx+c=0(如图2)
建六个静态文本框(st_1、st_2、st_3、st_4、st_5),五个单行编辑框(sle_1、sle_2、sle_3、sle_4、sle_5),三个命令按钮(cb_1、cb_2、cb_3)
(图2)
(1)“求解”按钮代码
deca,b,c,d,x1,x2
a=dec(sle_1.text)
b=dec(sle_2.text)
c=dec(sle_3.text)
d=b*b-4*a*c
ifd>=0then
x1=(-b+sqrt(d))/(2*a)
x2=(-b-sqrt(d))/(2*a)
sle_4.text=string(round(x1,6))
sle_5.text=string(round(x2,6))
else
messagebox("提示","方程无实根")
endif
(2)“清除”按钮代码
sle_1.text=""
sle_2.text=""
sle_3.text=""
sle_4.text=""
sle_5.text=""
(3)“退出”按钮代码
close(w_aa)
(4)应用程序open事件代码
open(w_aa)
实验四数据窗口设计
一、实验目的
1、熟悉PowerBuilder运行环境;
2、掌握PowerBuilder数据窗口的创建及使用。
二、实验内容
1、建立数据库有数据表
(1)建立学生信息表s:
表1
sno
sname
sex
age
sedept
9801
李铭
男
19
计算机软件
9802
刘晓鸣
男
20
计算机应用
9806
刘成刚
男
21
计算机软件
9807
王铭
男
22
计算机应用
9808
宣明尼
女
18
计算机应用
9809
柳红利
女
19
计算机软件
9803
李明
男
22
计算机应用
9804
张鹰
女
21
计算机软件
9805
刘竟静
女
22
计算机软件
创建S表的SQL命令如下:
createtableS(snochar(4),snamechar(8),sexchar
(2),agechar
(2),sdeptchar(10));
insertintoSvalues('9801','李铭','男','19','计算机软件');
insertintoSvalues('9802','刘晓鸣','男','20','计算机应用');
insertintoSvalues('9806','刘成刚','男','21','计算机软件');
insertintoSvalues('9807','王铭','男','22','计算机应用');
insertintoSvalues('9808','宣明尼','女','18','计算机应用');
insertintoSvalues('9809','柳红利','女','19','计算机软件');
insertintoSvalues('9803','李明','男','22','计算机应用');
insertintoSvalues('9804','张鹰','女','21','计算机软件');
insertintoSvalues('9805','刘竟静','女','22','计算机软件');
select*fromS;
(2)建立学生课程信息表c:
表2
cno
cname
cdept
tname
C1
PASCAL
计算机应用
王晓名
C2
数据结构
计算机应用
刘红
C6
WINDOW技术
计算机软件
吴志刚
C3
离散数学
计算机应用
李严劲
C4
计算机原理
计算机软件
王晓名
C5
数据库原理
计算机应用
吴志刚
C9
系统结构
计算机软件
刘红
C8
编译原理
计算机应用
蒋莹岳
创建C表的SQL命令如下:
createtablec(cnochar(4),cnamechar(10),cdeptchar(10),tnamechar(8));
insertintocvalues('c1','PASCAL','计算机应用','王晓名');
insertintocvalues('c2','数据结构','计算机应用','刘红');
insertintocvalues('c6','WINDOW技术','计算机软件','吴志刚');
insertintocvalues('c3','离散数学','计算机应用','李严劲');
insertintocvalues('c4','计算机原理','计算机软件','王晓名');
insertintocvalues('c5','数据库原理','计算机应用','吴志刚');
insertintocvalues('c9','系统结构','计算