《数据库系统原理》 上 机 实 验 讲 义 数学与计算机科学学院 编写:颜清谭国律冷明伟
《数据库系统原理》 上 机 实 验 讲 义 数学与计算机科学学院 编写:颜清 谭国律 冷明伟
实验一创建数据表 一、实验目的 l、熟悉PowerBuilder运行环境: 2、掌握数据表的创建及SQL语言的应用 二、实验内容 1、有一个教学管理数据库,包含以下基本表:(表略) 用交互式SQL完成: (1)建立学生表,主码为学号,性别为‘男'或‘女'。 Create table学生 (学号#char(8)not null, 姓名char(8)not null,. 性别 char(2) 年 smallint, 年级char(8). 系编号integer, rimary key(学号H) check(性别=‘男’或‘女'), (2)建立教师表,主码为教师编号,外码为系编号。 Create table教师 年龄smallint, 职称char(4), 系编号integer, (3)建立选课表,主码为学号和课程编号,外码为学号,课程编号。 Create table选课 (学号#char(8) 课程编号# char(4), 成绩smallint, primary key(学号#,课程编号#), es课程(课程编号#) (4)将学生张三从编号为001的系转到编号为002的系。 Updata学生
2 实验一 创建数据表 一、实验目的 1、熟悉 PowerBuilder 运行环境; 2、掌握数据表的创建及 SQL 语言的应用。 二、实验内容 1、有一个教学管理数据库,包含以下基本表:(表略) 用交互式 SQL 完成: (1) 建立学生表,主码为学号,性别为‘男’或‘女’。 Create table 学生 (学号# char(8) not null, 姓名 char(8) not null, 性别 char(2), 年龄 smallint, 年级 char(8), 系编号 integer, primary key (学号#), check (性别=‘男’或‘女’), ) (2) 建立教师表,主码为教师编号,外码为系编号。 Create table 教师 (教师编号# char(8) not null, 姓名 char(8) not null, 年龄 smallint, 职称 char(4), 系编号 integer, primary key (教师编号#), foreign key (系编号) references 院系 (系编号#), ) (3) 建立选课表,主码为学号和课程编号,外码为学号,课程编号。 Create table 选课 (学号# char(8), 课程编号# char(4), 成绩 smallint, primary key (学号#, 课程编号#), foreign key (学号#) references 学生(学号#), foreign key (课程编号#) references 课程(课程编号#), check ((成绩 is null ) or (成绩 between 0 and 100 )), ) (4) 将学生张三从编号为 001 的系转到编号为 002 的系。 Updata 学生
Set系编号#=002 Where姓名=“张三”and系编号#=O01 (5)统计学生总人数 Select count(学号#) From学生 (6)显示计算机系的学生的信息。 Select From教师,任课,课程 Wher课程名=”数据库原理”and课程.课程编号#=任课.课程编号#and任课.教师 编号#=教师.教师编号# (7)查找法律系的系办电话, Select 办电话 From院 Where系名=“法律系” (8)别除2000级的学生记录。 Delete Where (9)将计算机系教师张明的职称升为教授。 Updata教师 From院系 here系名=“计算机系”) (10)统计计算机系教师张明的任课门数。 Selec cou t(课程编号) From院系,教师,任课 here院系.系名=“计算机系”and院系.系编号#=教师.系编号# and教师.教师编号#=任课.教师编号# (11)统计每个系的教师的人数 Select 系编号#,count(教师编号#) FrOm教师 Group by系编号# (12)查找教授数据库原理的教师的姓名。 Select 教师.姓名 From教师,任课,课程 here课程名=“数据库原理”and课程.课程编号#=任课.课程编号#and任课.教 师编号#=教师.教师编号#
3 Set 系编号# = 002 Where 姓名=“张三”and 系编号#=001 (5) 统计学生总人数。 Select count (学号#) From 学生 (6) 显示计算机系的学生的信息。 Select * From 教师,任课,课程 Wher 课程名=”数据库原理” and 课程.课程编号# = 任课.课程编号# and 任课.教师 编号# = 教师.教师编号# (7) 查找法律系的系办电话。 Select 系办电话 From 院系 Where 系名= “法律系” (8) 删除 2000 级的学生记录。 Delete from 学生 Where 年级= “2000 级” (9) 将计算机系教师张明的职称升为教授。 Updata 教师 Set 职称= “教授” Where 姓名= ”张明” and 教师编号# = ( select 教师编号# From 院系 Where 系名= “计算机系”) (10)统计计算机系教师张明的任课门数。 Select count (课程编号#) From 院系,教师,任课 Where 院系.系名= “计算机系” and 院系.系编号# = 教师.系编号# and 教师.教师编号# = 任课.教师编号# (11)统计每个系的教师的人数。 Select 系编号#, count (教师编号#) From 教师 Group by 系编号# (12)查找教授数据库原理的教师的姓名。 Select 教师.姓名 From 教师,任课,课程 Where 课程名= “数据库原理” and 课程.课程编号# = 任课.课程编号# and 任课.教 师编号# = 教师.教师编号#
(13)删除1020号教师的任课记录。 Delete from任课 Updata课程 Set学分=4 here课程名=数据库原理 (15)学生王明每选一个学分交费100元,统计它的选课总费用 Select sum(学分)*100 From学生,课程,选课 here学生,学号#=选课.学号#and选课.课程编号=课程.课程编号# (16)统计20岁的学生总人数 Select count (age) From学生 here学牛.年龄=20 (17)选修数据库原理的学生名单 secect 学生.姓名 from学生,课程,选课 where课程.课程名=“数据库原理”and课程.课程编号#=选课课程编号#and选 课.学号#=学生.学号# (18)删除20030号学生的选课记录 delete ro选课 here学号#=“200030 (19)建立一个存储过程,通过输入学号,显示学生的姓名,选课课程名,成绩,并统计出 选课门数。 Create procedure report eid char(⑧) as Select学生.姓名,课程.课程名,选课.成绩,count(课程.课程编号#) From学生,课程,选课 here学生.学号#=eid and选课学号#=学生.学号#and选课.课程编号#=课程. 课程编号# (20)建立一个存储过程,通过输入教师编号,显示教师的姓名,任课课程名,教师院系。 Create procedure report eid char(8)as Select教师.姓名,课程.课程名,院系.系名 下rom院系,课程,教师,任课 教师.教师编号#=id and任课.教师编号#=教师.教师编号#and课程.课程 编号#任课,课程编号ad教师,系编号=院系。系编号 (21)建立一个存储过程,输入系编号显示学生的学号,姓名。 学gf名por id char (as
4 (13)删除 1020 号教师的任课记录。 Delete from 任课 Where 教师编号# = “1020” (14)将课程数据库原理的学分设为 4. Updata 课程 Set 学分 = 4 Where 课程名= 数据库原理 (15)学生王明每选一个学分交费 100 元,统计它的选课总费用。 Select sum (学分)* 100 From 学生,课程,选课 Where 学生.学号# = 选课.学号# and 选课.课程编号 = 课程.课程编号# (16)统计 20 岁的学生总人数。 Select count (age) From 学生 Where 学生.年龄 = 20 (17)选修数据库原理的学生名单 secect 学生.姓名 from 学生,课程,选课 where 课程.课程名 = “ 数据库原理” and 课程.课程编号# = 选课.课程编号# and 选 课.学号# = 学生.学号# (18)删除 20030 号学生的选课记录 delete from 选课 where 学号# = “200030” (19)建立一个存储过程,通过输入学号,显示学生的姓名,选课课程名,成绩,并统计出 选课门数。 Create procedure report @id char(8) as Select 学生.姓名,课程.课程名,选课.成绩,count (课程.课程编号#) From 学生,课程,选课 Where 学生.学号# = @id and 选课.学号# = 学生.学号# and 选课.课程编号# = 课程. 课程编号# (20)建立一个存储过程,通过输入教师编号,显示教师的姓名,任课课程名,教师院系。 Create procedure report @id char(8) as Select 教师.姓名,课程.课程名,院系.系名 From 院系,课程,教师,任课 Where 教师.教师编号# = @id and 任课.教师编号# = 教师.教师编号# and 课程.课程 编号# = 任课.课程编号 and 教师.系编号 = 院系.系编号 (21)建立一个存储过程,输入系编号显示学生的学号,姓名。 Create procedure report @id char (8) as Select 学号#,姓名
From学生 here系编号#=gid 2、有一数据库,包含以下基本表:(表略) (1)建立销售明细表,销售编号为主码,外码为商品编号,会员号。 Create table销售明细 (销售编号#char(④), 商品编号#char(4), 会员号#char(④), integer, 时间time, primary key(销售编号#), foreign key(商品编号#)references商品(商品编号#), foreign key(会员号#)references会员(会员号#), (2)添加一条商品记录(00697,雕牌肥皂,浙江,2.00,日化) insert into商品values(00697,”雕牌肥皂”,”浙江”,2.00,”日化”) (3)产生00695号产品的销售细帐。 Select From销售明细 Where商品编号#=00695 (4)根据商品编号00695查找该商品的销售总量 Select (数量) From销售明细 Where商品编号#=00695 (5)根据会员号104095别除其会员记录。 Delete from 会品 Where会员号#=104095 (6)建立一个黄金会员视图。(消费总金额高于5000的会员为黄金会员) create view黄金会员 as (select from会员 where消费总金额>5000) (7)建立一个触发器,实现当输入一条销售记录时,将消费金额自动累加到会员的消费总金额。 Create tri ger triname On销售明 For insert as Updata会员 Set消费总金额=消费总金额+sum(销售明细.数量*商品.单价) Where销售明细.会员号#=会员.会员号#and商品.商品编号#=销售明细.商品编号# 5
5 From 学生 Where 系编号# = @id 2、有一数据库,包含以下基本表:(表略) (1) 建立销售明细表,销售编号为主码,外码为商品编号,会员号。 Create table 销售明细 (销售编号# char(4), 商品编号# char(4), 会员号# char(4), 数量 integer, 时间 time, primary key (销售编号#), foreign key (商品编号#) references 商品(商品编号#), foreign key (会员号#) references 会员(会员号#), ) (2) 添加一条商品记录(00697,雕牌肥皂,浙江,2.00,日化) insert into 商品 values(00697,”雕牌肥皂”,”浙江”,2.00,”日化”) (3) 产生 00695 号产品的销售细帐。 Select * From 销售明细 Where 商品编号# = 00695 (4) 根据商品编号 00695 查找该商品的销售总量。 Select sum (数量) From 销售明细 Where 商品编号# = 00695 (5) 根据会员号 104095 删除其会员记录。 Delete from 会员 Where 会员号# = 104095 (6)建立一个黄金会员视图。(消费总金额高于 5000 的会员为黄金会员) create view 黄金会员 as (select * from 会员 where 消费总金额 > 5000 ) (7)建立一个触发器,实现当输入一条销售记录时,将消费金额自动累加到会员的消费总金额。 Create trigger triname On 销售明细 For insert as Updata 会员 Set 消费总金额 = 消费总金额 + sum (销售明细.数量*商品.单价) Where 销售明细.会员号# = 会员.会员号# and 商品.商品编号# = 销售明细.商品编号#
实验二PowerBuilder编程基础 一、实验目的 l、熟悉PowerBuilder运行环境: 2、掌握PowerBuilder语法及函数的使用 二、实验内容 1、对w_data的open事件编程,使w_data一打开dw_1中就显示数据 (1)显示数据 Dw 1.settransobjict (splca) Dw 1.retrieve( (2)添加int1 I=dw_1.insertrow(0) Dw 1.scrolltorow (1) Dw_1.setfocus() 除 dw_1.deleterow(0) 保存 int i dw_1.updata() if I=-1 then messagebox("information'”,“数据无法保存) end if 关闭close(parent) (3)对w_data的dlosequery事件编程,使dw中的数据发生改变而又未保存就退出口时给用户一个 消息框提示。 Integer m If dw_1.modifiedcount()+deletedcount(0 then M=messagebox(~信息”“数据已改变,是否保存”,question!YesNoCancel) If m=1 then Else Messagebox("information'”,”已保存数据) End if Elseif m=2 then Return 0 Elseif m=3 then Return I 2、ddb1中为各系名称,当选了一个系后w_1显示该系学生姓名,对ddb_1的selectionchanged 事件编程。 Int I String outname Declare namecur cursor for dist 学生 inct department 6
6 实验二 PowerBuilder 编程基础 一、实验目的 1、熟悉 PowerBuilder 运行环境; 2、掌握 PowerBuilder 语法及函数的使用。 二、实验内容 1、对 w_data 的 open 事件编程,使 w_data 一打开 dw_1 中就显示数据。 (1)显示数据 Dw_1. settransobjict (splca) Dw_1. retrieve( ) (2)添加 int I I= dw_1. insertrow (0) Dw_1. scrolltorow (i) Dw_1. setfocus ( ) 删除 dw_1 . deleterow (0) 保存 int j j= dw_1 . updata ( ) if I= -1 then messagebox (“information” , “数据无法保存”) end if 关闭 close (parent ) (3)对 w_data 的 closequery 事件编程,使 dw_1 中的数据发生改变而又未保存就退出窗口时给用户一个 消息框提示。 Integer m If dw_1.modifiedcount ( ) + deletedcount ( )>0 then M = messagebox (“信息”“数据已改变,是否保存”,question!YesNoCance!) If m=1 then If dw_1.updata ( )= -1 then Messagebox (“information”,”无法保存数据”) Else Messagebox (“information”,”已保存数据”) End if Return 0 Elseif m=2 then Return 0 Elseif m=3 then Return 1 2、ddlb_1 中为各系名称,当选择了一个系后 tv_1 显示该系学生姓名,对 ddlb_1 的 selectionchanged 事件编程。 Int I String outname Declare namecur cursor for Select distinct department From 学生
Where department=:ddlb 1.text Open namecur If sqlea.sqlcode=-1 ther Messagebox(“sql error“,sqlca,sqlerrtext) Else Fetch namecur into :outname: Do where sqlca .sqlcode=0 t :outname I=tv_1.insertitemlast(),outname,2) L0Op while sqlca.sqlcode=0 Tv_1 :deleteitem(i) End if 3dd1为下拉列表框, t1,t2为静态文本框。该窗口打开时,ddb_1从数据库中的院系表中 读出了所有系名,当选择了某系时s1,2分别显示该系系领导和系办电话。 (1)在w_1的open事件下编程. String outname Declare namecur cursor for Select department From Where department=:ddlb_1.text Open namecur; If sqlca.sqlcode=-1 then Messagebox ("sql error",sqlca ,sqlerrtext Fetch namecur into :outname; Do where sqlca .sqlcode=0 Ddlb 1.additem(outname) Fetch namecur into:outname; End if Close namecur; (2)在ddlb_I的selectionchanged事件下编程。 Select系领导,系办电话 From院 Whe 系名=ddb_l.text st1.text=系领导 st2.text=系办电话 4、w_query上有控件ddlb_1和dw_l,在ddlb1中选择系名后dw_1中显示该系的学生。 (1)如果通过带参数的数据窗口对象来完成,请问dw_1中的数据窗口对象的数据源为quick select还 是sql seleet。 (2) 为ddb_I的selectionchanged事件编程 Dw_1.settransobject(sqlca) Dw 1.retricve(ddlb 1.text) 5、当选择了某单选框并输入选择条件,按回车后,w1中显示满足条件的记录。请对以下控件编程。 ( rb_1 >
7 Where department = :ddlb_1.text Open namecur ; If sqlca.sqlcode = -1 then Messagebox ( “sql error “, sqlca ,sqlerrtext ) Else Fetch namecur into :outname ; Do where sqlca .sqlcode = 0 Frtch namecur into :outname ; I=tv_1 .insertitemlast ( ) ,outname,2) L00p while sqlca .sqlcode = 0 Tv_1 :deleteitem (i) End if Close namecur ; 3、 ddlb_1 为下拉列表框,st_1,st_2 为静态文本框。该窗口打开时,ddlb_1 从数据库中的院系表中 读出了所有系名,当选择了某系时 st_1,st_2 分别显示该系系领导和系办电话。 (1) 在 w_1 的 open 事件下编程。 String outname Declare namecur cursor for Select distinct department From 院系 Where department = :ddlb_1.text Open namecur ; If sqlca.sqlcode = -1 then Messagebox ( “sql error “, sqlca ,sqlerrtext ) Else Fetch namecur into :outname ; Do where sqlca .sqlcode = 0 Ddlb_1.additem (outname) Fetch namecur into :outname ; L00p End if Close namecur ; (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 中的数据窗口对象的数据源为 quick select 还 是 sql select。答:sql select。 (2) 为 ddlb_1 的 selectionchanged 事件编程。 Dw_1.settransobject (sqlca) Dw_1.retricve (ddlb_1.text) 5、当选择了某单选框并输入选择条件,按回车后,dw_1 中显示满足条件的记录。请对以下控件编程。 (1) rb_1
sle1.enabled=true (2)sle_1 dw-l.setfilter(姓名=+slel.text+”) dw 1.filter() cb 1.visible =true (3)cb_1 rh I checked false rb_2.checked=fals rb3.checked=fals rb 4.checked false sle_1.text sle 2text=" sle_3.text= sle_4.text sle 1.enable false sle 2.enable false sle 3 enable=false sle 4 enable fals 6、W1为列表视图,报表风格 ,当Wist打开时st中显示数据库中学生表的所有学生的信息 请为w_1的pen事件编程. Integer I,j,outage String outname,outsex,soutage Lv1.addcolumn("姓名",left!,800) Lv1.addcolumn(性别,left!,500) Lv1.addcolumn(年龄”,lefl,200 Declare namecur cursor for Select姓名,性别,年龄 From学生; Open namecur If sqlca.sqlcode=1 then essagebox(sql.eror”,sqlca.sqlerrtext) Else 1=1 Do Fetch namecur into :outname,:outsex,:outage J= Lv 1.setitem(I.2.outname Lv1.setitem(I,2,outsex) Soutage=string(outage) Lv_1.setitem(I,3,soutage) I++ Loop while sqlca.sqlcode=0 Lv_1.deleteitem(j) End if Close namecur
8 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 事件编程。 Integer I, j , outage String outname , outsex , soutage Lv_1.addcolumn (“姓名”,left! , 800) Lv_1.addcolumn (“性别”,left! , 500) Lv_1.addcolumn (“年龄”,left! , 200) Declare namecur cursor for Select 姓名,性别,年龄 From 学生; Open namecur ; If sqlca.sqlcode = 1 then Messagebox (“sql.error” , sqlca.sqlerrtext ) Else I=1 Do Fetch namecur into :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++ Loop while sqlca.sqlcode=0 Lv_1.deleteitem ( j) End if Close namecur ;
实验三计算器设计 一、实验目的 l、熟悉PowerBuilder运行环境: 2、掌握PowerBuilder数据窗口的创建及使用 二、实验内容 1、用PowerBuilder实现如下计算器(图1): 计算器口回☒ 清除 1 2 3* 4 5 6/ 7 8 + 0 (图1) (CTL+C:复制按钮及按钮中的代码:CTL+T:复制按钮但不复制按钮中相应的代码) (1)声明变量 decimal data/保存中间结果 char str /保存按下的运算符 int flag /f1ag=l表示按下的数字是前面数字的一部分,flag=0表示按下 的数字是一个新的数字的开始 (2)十个数字按钮和小数点按钮代码 if flag=0 then sle_1.text= flag=1 end if sle_1.text=sle_1.text+this.text (3)+、一、*、/运算按钮代码 9
9 实验三 计算器设计 一、实验目的 1、熟悉 PowerBuilder 运行环境; 2、掌握 PowerBuilder 数据窗口的创建及使用。 二、实验内容 1、 用 PowerBuilder 实现如下计算器(图 1): (图 1) (CTRL+C:复制按钮及按钮中的代码;CTRL+T:复制按钮但不复制按钮中相应的代码) (1)声明变量 decimal data //保存中间结果 char str //保存按下的运算符 int flag //flag=1 表示按下的数字是前面数字的一部分,flag=0 表示按下 的数字是一个新的数字的开始 (2)十个数字按钮和小数点按钮代码 if flag=0 then sle_1.text="" flag=1 end if sle_1.text=sle_1.text+this.text (3)+、-、*、/运算按钮代码
choose case str case'' text=string(dec (sle_1.text)*da 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)) end choose data=dec(sle_1.text) str=this.text flag=0 (4)“清除”按钮代码 sle_1.text=" data=0 str=', flag=0 (5)“=”按钮代码 sle_1.text=string(dec(sle_1.text)*data) case ' sle_1.text=string(data/dec(sle_1.text)) case'+ .ttrin(d(s_.text)+data) case sle_1.text=string(data -dec(sle_1.text)) end choose flag=0 str=' (6)“应用程序”open事件代码 open(w calculator)
10 choose case str 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)) end choose data=dec(sle_1.text) str=this.text flag=0 (4)“清除”按钮代码 sle_1.text="" data=0 str='' flag=0 (5)“=”按钮代码 choose case str 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)) end choose flag=0 str='' (6)“应用程序”open 事件代码 open(w_calculator)