上机报告
一.课程名称:数据库技术及应用
二.上机项目名称:学生信息管理系统开发
三.上机目的:通过上机对大家熟悉的学生信息管理系统的开发,掌握利用Delphi 7开发完整的管理信息系统的步骤、过程和方法。
四.上机环境
硬件:清华同方计算机
软件: Windows XP,Delphi 7
五、上机内容与上机步骤
(一)、内容:
使用Delphi7进行学生信息管理系统开发
(二)、步骤:
1、系统设计
1)系统功能分析:学生信息管理系统的所要完成的主要功能有:
u 学生基本信息的录入,包括:学号、姓名、性别、班级、出生日期、籍贯等。
u 学生基本信息的修改维护。
u 学生学籍变动情况的记录,包括:休学、复学、转系、结业、毕业等。
u 学生奖惩情况的记录和修改,包括:奖励和处罚。
u 学生信息的查询。
2)系统功能模块设计
3)操作流程图
2、数据库设计
1)数据库需求分析
u 院系设置:院系编号、院系名称、院系领导、领导电话。
u 班级设置:班级编号、班级名称、班级创建时间、班主任、班主任电话。
u 学生基本情况:学号、姓名、性别、出生日期、籍贯。
u 学籍变更记录:记录号、学号、变更类别、记录时间。
u 奖励记录:记录号、学号、奖励类别、记录时间。
u 处罚记录:记录号、学号、处罚类别、记录时间。
2)数据库概念结构设计
局部E-R图
全局E-R图
3)数据库逻辑结构设计
逻辑设计阶段的目标是产生合理的数据库模式,可分为三个阶段:分别是收集和分析用户需求、概念模式设计和逻辑模式设计。
数据库逻辑结构设计的任务就是把E-R图转换为关系模式。并对转换后的关系进行优化。把上面的E-R图转换为关系并把进行优化之后,得到6个关系模式(即数据库表)。这些表的结构如下。
院系设置信息表(Department)
班级设置信息表(Class)
学生基本信息表( Student )
学籍变更记录表(Change)
奖励记录表(Reward)
处罚记录表(Punish)
4)数据库结构的实现
根据逻辑设计和物理设计的结果,利用特定的DBMS在计算机系统上建立实际数据库结构、装入数据、测试和试运行的过程称为数据库系统的实现阶段。该阶段主要完成以下三项工作:建立实际数据库结构。 装入试验数据对应用程序进行调试。装入实际数据,进入试运行状态
用Delphi7自带的DataBase Desktop应用程序在D盘上建立数据库“D:\jwgl”,并建立6个数据库表:Department.DB、Class.DB、Student.DB、Change.DB、Reward.DB、Punish.DB。
5)初始数据录入
在上述6个表建立后,需要输入一些模拟的初始数据。以后设计程序后运行程序可以得到结果来验证程序的正确性。
3、 创建工程文件
1)新建应用程序:
“file”à“new”à“application”
2)改变表单Name属性为:
FormLogin(登陆表单)
改变表单的Capton属性为:学生管理信息系统
3)保存工程文件:
“file”à“Save Project As”?选择保存路径D:\JWGL?保存第一个表单为:Form1.pas(默认)?保存工程文件名为:”StudentMIS.DPR”。
4、系统主窗体的创建:表单为:FormLogin
1)添加1个Label控件,设置其Caption属性为:请输入密码:
2)添加1个Edit控件,设置其Text属性为空。
3)添加1个Button控件,设置其Caption属性为: 登录
4)在标准控件中选择MainMenu并将菜单添加到表单中。
5)添加第一个菜单项:双击MainMenu控件,进入FormLogin.MainMenu1窗口。设置caption属性(添加第一个菜单项)为“系统维护”?回车?输入各个子菜单名称(caption属性)。
6)在菜单条右侧单击右键选择Insert添加其他菜单条(delete删除其他菜单条)
7)重复2-3直到所有菜单及菜单条添加完毕。
8)关闭FormLogin.MainMenu1窗口。回到FormLogin设计窗口
9)新建其他7个表单并设置其属性:
10)为登录按钮添加Click事件及其代码
11)为表单添加FormCreate事件及其代码
12)为各个菜单条添加事件及其代码:展开菜单项,然后单击菜单条,进入该菜单条的Click事件代码编辑窗口,可以在该窗口中输入处理代码。分别为各个菜单条添加事件及其代码。
5、院系设置模块
6、班级管理模块
7、学生管理模块
8、学生信息查询模块
学生信息查询模块有主从表建立Class数据表和Student数据表的联系,提取某个学生的班级信息,采用TPage Control组件分也显示多项数据。学生信息查询模块实现对学生信息的查询功能,下面分别从窗体的创建、模块用户界面的设计、模块功能的实现作具体说明。
窗体的创建:窗体是模块运行的界面,显示或输入数据库表的内容,模块在窗体中运行可以实现更加复杂的功能。在Delphi中执行[File] →[New]→[Form]命令,在工程中新建一个名为FormQuery的窗体并设计其主要属性。
模块用户界面的设计:学生信息查询表单名称:FormStuQuery。
1)、添加BDE组件Table1并设置属性如下:
u DataBaseName: D:\jwgl或者别名jwgl。
u TableName:Student.DB。
u Active属性为:True。
2)、添加DataAccess组件DataSource1并设置属性如下:
u DataSet属性: Table1。
3)、添加BDE组件Table2并设置属性如下:
u DataBaseName: D:\jwgl或者别名jwgl。
u TableName:Class.DB。
u MasterSource属性为:DateSource1(父表)。
u MasterFields属性为:ClassIDàClassID。
u Active属性为:True。
4)、添加DataAccess组件DataSource2并设置属性如下:
u DataSet属性: Table2。
5)、添加BDE组件Table3并设置属性如下:
u DataBaseName: D:\jwgl或者别名jwgl。
u TableName:Change.DB。
u MasterSource属性为:DateSource1(父表)。
u MasterFields属性为:StudentIDàStudentID。
u Active属性为:True。
6)、添加DataAccess组件DataSource3并设置属性如下:
u DataSet属性: Table3。
7)、添加BDE组件Table4并设置属性如下:
u DataBaseName: D:\jwgl或者别名jwgl 。
u TableName:Rward.DB。
u MasterSource属性为:DateSource1(父表)。
u MasterFields属性为:StudentIDàStudentID。
u Active属性为:True。
8)、添加DataAccess组件DataSource4并设置属性如下:
u DataSet属性: Table4。
9)、添加BDE组件Table5并设置属性如下:
u DataBaseName:D:\jwgl或者别名jwgl 。
u TableName:Punish.DB。
u MasterSource属性为:DateSource1(父表)。
u MasterFields属性为:StudentIDàStudentID。
u Active属性为:True。
10)、添加DataAccess组件DataSource5并设置属性如下:
u DataSet属性: Table5。
11)、在表单左上角添加标签并设置其Caption属性为:学号
12)、在标签的下侧添加一个组件Edit1 ,并设置其Text属性为空。MaxLenth属性为8(输入学号位数是8位)。
13)、在Edit1下侧添加一个组件Button1,设置其Caption属性为:退出。
14)、在Edit1右侧添加一个组件GroupBox1,设置其Caption属性为:学生基本信息。
15)、在GroupBox1中添加3个标签,设置其Caption属性分别为:姓名、性别和出生日期。
16)、分别在3个标签的右侧添加3个DBEdit,并设置属性如下:
u DataSource: DataSource1。
u DataField分别为:Name、Sex、Birthday。
17)、在GroupBox1中添加2个标签,设置其Caption属性分别为:所属班级、班主任。
18)、分别在4个标签的右侧添加2个DBEdit,并设置属性如下:
u DataSource: DataSource2。
u DataField分别为:ClassName和Master。
19)、在下面添加一个WIN32组件PageControl1,右键单击该组件选择New Page命令,然后改变新添选项卡的Caption属性为:学籍变更。
20)、在PageControl1中添加一个DBGrid1并设置其属性如下:
u DataSource: DataSource3。
u Columns.iterm
? FieldName为StudentID的Title.Caption:学号。
? FieldName为Change的Title.Caption:变更类型。
? FieldName为RecDate的Title.Caption:变更日期。
21)、在PageControl1组件右键单击该组件选择New Page命令,然后改变新添选项卡的Caption属性为:奖励情况。
22)、在PageControl1中添加一个DBGrid2并设置其属性如下:
u DataSource: DataSource4。
u Columns.iterm
? FieldName为StudentID的Title.Caption:学号。
? FieldName为Reward的Title.Caption:奖励类型。
? FieldName为RecDate的Title.Caption:奖励日期。
23)、在PageControl1组件右键单击该组件选择New Page命令,然后改变新添选项卡的Caption属性为:处罚情况。
24)、在PageControl1中添加一个DBGrid2并设置其属性如下:
u DataSource: DataSource5。
u Columns.iterm。
u FieldName为StudentID的Title.Caption:学号。
u FieldName为Punish的Title.Caption:处罚类型。
u FieldName为RecDate的Title.Caption:处罚日期。
25)、为Edit1控件填写Change事件及其代码。
26)、为退出按钮Button1添加Click事件及其代码。
模块功能的实现:窗体显示事件和卸载事件中关闭.在编辑框的内容变化事件中根据用户输入的学号查询相应的信息。
9、学籍变更管理模块
10、奖励管理模块
11、处罚管理模块
12、系统的编译、测试和运行
1)系统的编译
所有模块设计完成以后, 单击【Project】→【Build StudentMIS】菜单项,进行编译链接,Delphi生成一个可执行文件StudentMIS.exe,这个文件可以独立于Delphi运行。
2)系统的运行测试
将文件夹jwgl(包含StudentMIS.exe)复制到任意一个文件夹或者另外的任何一台机器上,双击StudentMIS.exe,进行独立运行测试。
在测试系统功能时必须将所有的功能测试到,并测试所有可能出现的操作。开发者一般会按照自己的思维定势测试系统,某些漏洞不容易发现,因此在条件许可的情况下可以请不熟悉本系统开发过程的人帮助测试,尽可能发现程序中的漏洞,以便排除漏洞,完善系统功能。最后还需请最终用户试用系统,并根据用户的要求调整完善系统功能。
六.上机过程与分析
学习书本上的理论知识并不足够,还要亲自动手实践才会有更好的效果,上机是一个有很多收获的过程,但在其中也发现了不少问题。首先是看书不细致,上机时忽略一些细小的地方,致使程序运行不对或运行不出来。其次是一些输入的地方找不准造成了一些困扰。通过向老师同学请教我进步了不少。
七.上机结果总结
(一)小结
学生信息管理系统可以协助学校和老师掌握学生情况。功能完整、性能稳定的学生信息管理系统开发完成后,应该掌握数据库系统开发的一般步骤,掌握Delphi下使用数据表组件开发数据库系统的方法。结合数据库理论,掌握在数据库系统开发中如何维护数据库的完整性。
一般基于ODBC数据源开发的数据库管理系统都需要用户手工配置ODBC数据源,给用户造成一定的不便,本章介绍了一种自动动态配置ODBC数据源的方法。
在系统开发中,要考虑得因素很多,除了系统功能的实现外,还要特别注重系统的稳定,考虑各种可能导致系统运行异常的因素,并加以排除。此外友好的用户界面也是需要考虑的问题。
数据库编程是一个实践性的课程。通过学生信息管理系统可以加强对数据库系统的认识与研究。
(二) 创意与提高
学生信息管理系统基本上很完整,但也存在可以改进和完善的地方。
系统安全性问题:在系统开发中必须要考虑数据库系统的安全性。一方面,可以给数据库本身增加安全认证和权限控制,具体的实现和DBMS有关;另一方面,在系统开发中可以增加用户登录功能,防止无关人员非法使用本系统,并且可以给每个使用者设置不同的权限,防止越权操作系统的某些功能。
功能完善:为了维护数据库的完整性,部分数据采取了“拒绝修改/删除”的方法。但其不便于用户操作,因此要找出有效方法解决“级联更新/删除”的功能。还要减少代码的重复量,提高系统开发维护效率
界面改进:本系统的主窗体比较简单,可以给主窗体添加工具栏、状态栏,以方面用户的操作,提供更好的人机界面。在实际的系统开发中还应该给系统设计有代表意义图标,用图片对用户界面进行适当的装饰,美化系统的界面。
帮助系统:实际使用的系统中一般都具有比较完备的帮助系统,指导操作者的使用。另外还有“关于”菜单,便于使用者方便了解本系统的版本、开发时间、获取技术支持的途径
安装程序:系统开发完成后要给系统制作安装程序,简化系统的安装过程,降低用户手工安装难度。安装程序可利用Delphi安装盘中的Installshield软件操作,也可以利用专门的安装制作软件,还可以自己编成制作安装程序。另外一些压缩软件也具备简单的安装程序制作功能。
第二篇:数据库上机报告(2)
华 北 科 技 学 院
上 机 报 告
系(部) 基础部 专业、班级 计算B091 姓名 陈伟 学号 200909014110 课程名称 上机题目 连接查询与嵌套查询 任课教师 丁智斌 指导教师 丁智斌 成绩(优、良、中、及格、不及格)
华 北 科 技 学 院 基 础 部
实验2-1 连接查询
一、实验目的
(1) 理解连接操作及其相关概念;
(2) 掌握表连接中谓词WHERE、JOIN的作用和使用方法;
(3) 熟练掌握数据库的连接查询。
二、实验原理
1. 连接的概念
连接可以实现从两个或更多的表中查询数据。通过连接可以使用一个表中的数据来查询其他表中的数据,结果通常是含有参加连接运算的两个表(或多个表)的指定列的集合,从而大大提高了操作的灵活性。
2. 连接的分类:
(1) 笛卡尔积连接
是指两个表的连接不使用谓词,返回两个表的元组的交叉乘积,结果包含两个表中所有行的全部组合。
(2) 内连接
是指两个表在连接时,使用比较运算符对表中指定的列进行比较,返回符合连接条件的数据行,从而返回一个由两个表生成的新的记录集。内连接有三种类型:
? 等值连接:在连接条件中使用“=”运算符比较连接的列值,返回两表的所有列,也包括重复列;
? 非等值连接:在连接条件中使用除“=”以外的其他比较运算符(>、<、>=、<=、!=、<>、!>、!<)进行比较连接列值;
? 自然连接:在等值连接中,返回指定的列中没有重复列的连接。
(3) 自身连接:一个表与其自身进行的比较连接。
(4) 外连接
是指两个表在连接时,返回的结果集除了包括复合条件的数据行外,还会返回FROM子句中的至少一个表或视图的所有行。外连接也有三种类型:
? 左连接:在结果表中包含第一个表中的满足条件的所有记录;如果是在连接条件上匹配的元组,则第二个表返回相应的值,否则第二表返回空值。
? 右连接:在结果表中包含第二个表中的满足条件的所有记录;如果是在连接条件上匹配的元组,则第一个表返回相应的值,否则第一个表返回空值。
? 全连接:在结果表中包含两个表中满足条件的所有记录;如果是在连接条件上匹配的元组,则另一个表返回相应的值,否则另一个表返回空值。
3.连接形式
连接可以用WHERE子句或FROM子句的JOIN谓词实现。
(1) 使用WHERE子句连接
在SELECT语句的WHERE子句中使用比较运算符给出连接条件。其语法格式为: SELECT <列名>[,<列名>]?
FROM <表名1>[,<表名2>]
WHERE [ <表名1>.<列名1> <比较运算符> <表名2>.<列名2>]
其中:<比较运算符>不仅可以是=、>、<、>=、<=、!=、<>、!>、!<,也可以是谓词BETWEEN ?AND?等。
(2) 使用JOIN谓词的连接
在Transact-SQL中扩展了专门的连接语句,使表的连接运算能力有所增强。其语法格式为:
SELECT <列名>[,<列名>]?
FROM <表名1> [连接类型] JOIN <表名2> [ JOIN <表名3> ?]
[ [ON ? ]
[ ON <连接条件2> ] ]
ON <连接条件1>
WHERE <查询条件>
其中:连接类型的指定方式分别为:
? 内连接:[INNER]
? 外连接:LEFT|RIGHT|FULL|[OUTER]
? 笛卡尔积连接:CROSS
提示:① JOIN的顺序和ON连接条件的顺序相反。
② 外连接只能对两个表进行。
③ 笛卡尔积不需要条件,因此不能带WHERE子句。1.查找XSBOOK数据库中每个
三、实验内容
1.学生的个人情况以及他们的借书信息;
select *
from XS3,JY3
where XS3.借书证号=JY3.借书证号
2. 查找借阅了图书ISBN为“7-03-008767-4”的学生的借书证号、姓名、专业名和借书时
间和实还时间;
select XS3.借书证号,XS3.姓名,XS3.单位,JY3.借阅日期,JY3.实还日期
from XS3,JY3
where XS3.借书证号=JY3.借书证号 and JY3.ISBN='7-03-008767-4'
3. 查找借阅了“财务管理”一书的学生的借书证号、姓名、专业名和借书时间和实还时间;
select XS3.借书证号,XS3.姓名,XS3.单位,JY3.借阅日期,JY3.实还日期
from XS3,JY3,BOOK3
where XS3.借书证号=JY3.借书证号 and JY3.ISBN=BOOK3.ISBN and
BOOK3.书名='财务管理'
4. 查询所有学生的借阅信息,并按借书证号排序,输出借书证号、姓名、专业名、ISBN、
书名、借书时间;
select XS3.借书证号,XS3.姓名,XS3.单位,JY3.ISBN,JY3.书名,JY3.借阅日期
from XS3,JY3
where XS3.借书证号=JY3.借书证号
order by XS3.借书证号
5. 查询借阅了图书ISBN为“7-04-011228-0”的学生姓名及专业名(用JOIN谓词实现);
select XS3.姓名,XS3.单位
from XS3 join JY3
on XS3.借书证号=JY3.借书证号
where JY3.ISBN='7-04-011228-0'
6. 查找借阅了“财务管理”的学生的借书证号、姓名、专业名和借书时间(用JOIN谓词实
现);
select XS3.借书证号,XS3.姓名,XS3.单位,JY3.借阅日期
from XS3 join JY3 join BOOK3
on JY3.ISBN=BOOK3.ISBN
on XS3.借书证号=JY3.借书证号
where BOOK3.书名='财务管理'
7. 找出有未还图书的学生信息;
select XS3.借书证号,XS3.姓名,XS3.单位,XS3.性别,XS3.借阅数量
from XS3 join JY3
on XS3.借书证号=JY3.借书证号
where JY3.实还日期 is NULL
8. 查找所有学生基本信息,以及借阅图书的条码号;
select XS3.借书证号,XS3.姓名,XS3.单位,XS3.性别,XS3.借阅数量,JY3.条码号 from XS3 join JY3
on XS3.借书证号=JY3.借书证号
实验2-2 嵌套查询
一、实验目的
(1) 深入理解SELECT语句中嵌套查询的概念;
(2) 掌握IN、比较符、ANY、ALL和EXISTS谓词在嵌套查询中的具体应用;
(3) 熟练掌握SQL SELECT语句,能够运用该语句完成各种查询。
二、实验原理
1.嵌套查询
在SQL Server 2000中,一条SELECT?FROM ?WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语条件中的查询称为嵌套查询。 在嵌套查询中,处于最上层的查询块称为外层查询或父查询,下层的查询块称为内层查询或子查询。SQL语句允许多层嵌套查询,即每一个子查询还可以嵌套其他子查询。但在子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序。
2.子查询的分类
子查询根据对外层依赖性分为两种:
(1) 不相关子查询
不相关子查询是指内层子查询的查询条件完全独立于外层父查询的SELECT语句,是一种简单子查询。
不相关子查询的执行过程是由内向外逐层处理。即每个内层查询的结果是用于建立其外层查询的查询条件,逐层将子查询求解出来,最后求解父查询。它是用多个简单的查询构成复杂的查询,增强了SQL的查询能力,也体现了SQL语句层次分明的结构化特点。
(2) 相关子查询
相关子查询是指内层查询的条件依赖于外层查询的某个属性值。由于内层查询与外层查询有关,因此需要反复查询。
相关子查询的执行过程是首先取外层查询表中的第一个元组,根据它与内层查询相关的属性值处理内查询,若内层查询WHERE子句的返回值为真,则将该元组放入结果表中;然后取外层查询表中的下一个元组,再根据它与内层查询相关的属性值处理内查询;反复执行这一过程,直到外层表中的元组全部检查完为止。
3.连接子查询的谓词
(1) [NOT] IN谓词
用于判断一个给定值是否在子查询结果集中,其一般格式为:
<表达式> [NOT] IN (子查询|)
或:
<表达式> [NOT] IN (值1, {值2, ?})
提示:IN和NOT IN子查询只能返回一列数据。
(2) 比较运算符
当用户确切知道内层查询返回值是单值时,可以用比较运算符直接连接子查询。其一般格式为:
<表达式> θ(子查询)
其中:θ代表比较运算符,可以是 =、>、<、>=、<=、!=或<>。
提示:若内层查询返回值不是单值时,会引起编译上的错误。
(3) SOME、ANY或ALL
当内层查询的返回值不是单值时,比较运算符可以与SOME、ANY或ALL谓词引出的子查询联用。其中SOME/ANY代表集合中的任意一个值,ALL代表集合中的所有值。其一般格式为:
<表达式> θ{SOME|ANY|ALL} (子查询)
比较运算符与ANY或ALL搭配使用的取值情况见表5.1所示。
表5.1 比较运算符与ANY/ALL搭配的取值
比较运算符 修饰符 取值
>、>=、!<
ANY
<、<=、!>
= ANY ANY ALL 最大值 最小值 ALL 最小值 最大值 所有值,相当于IN
<> ANY 取所有值
实际上,用聚合函数也可以实现子查询,其一般格式为:
<表达式> θ {IN|MAX|MIN} (子查询)
ANY和ALL谓词与聚合函数的对应关系见表5.2所示。
表5.2 ANY和ALL谓词与聚合函数的对应关系
谓词 SOME、ANY ALL
= IN
<>、!= NOT IN
<[=] <[=]MAX <[=]MIN
>[=] >[=]MIN >[=]MAX
(4) [NOT] EXISTS谓词
由EXISTS和NOT EXISTS谓词引出子查询的作用是只判断子查询的结果集是否为空,
若子查询结果集为非空,则向上层查询返回TRUE;反之,则返回FALSE,并不产生其他具体值。其一般格式为:
[NOT] EXISTS (子查询)
提示:在内层查询中只返回逻辑值,这种子查询的选择列表一般指定为SELECT *,外部查询的WHERE子句中一般不需要指定列名。
* 由于SQL语言中没有全称量词",EXISTS是存在量词$,如果需要描述带有全称量词的查询条件时,可以将全称量词转换成与之等价带有存在量词的谓词。转换形式为: ("x)P ≡ ? ($ x(? P))
* 具体步骤:
① 为要检索的对象命名,并考虑如何表述要检索的候选对象的一个反例。这个反例刚好是不符合前面提到的“所有”对象规定的条件;
② 建立SELECT语句的搜索条件以选出步骤①所创建的所有反例;
③ 建立包含步骤②所创建的语句的搜索条件,说明不存在步骤①定义的那种反例,一般用到NOT EXISTS谓词。
4.集合运算
在SQL语句中可以使用UNION(并操作)、INTERSECT(交操作)和MINUS(差操作)来对查询结果进行集合操作。一般格式为:
(子查询){UNION [ALL]| INTERSECT [ALL]| MINUS [ALL]}(子查询)
若省略ALL,表示系统自动把将集合运算结果中的重复值去掉;当需要出现重复值时,一定要写上ALL。
注意:在标准的SQL中没有直接提供集合交和集合差的操作,但可以用其他方法实现。如使用EXISTS和NOT EXISTS实现一个差运算。
三、实验内容
1.找出图书借阅数量比孙帅多的学生信息。
select XS3.*
from XS3
where 借阅数量>(select XS3.借阅数量
from XS3
where 姓名='孙帅')
2. 找出比文学类图书数量多图书类别名称。
select 类别
from BOOK3
group by 类别
having count(*)>(select count(类别)
from BOOK3
where 类别='文学类')
3. 查询与李波同一专业学习的学生的学号和姓名(用连接查询实现)。
select 姓名,单位
from XS3
where 单位=(select 单位
from XS3
where 姓名='李波')
4. 查询比计算机系的任一名学生借书数量多的学生信息(用聚合函数)。
select *
from XS3
where 借阅数量>any( select 借阅数量
from XS3
where 单位='计算机系')
5. 查询比计算机系中任何学生借书数量都多的学生信息(用聚合函数)。
select *
from XS3
where 借阅数量>all( select 借阅数量
from XS3
where 单位='计算机系')
6. 找出借阅了计算机类图书的借阅信息。
select JY3.*
from JY3 join BOOk3
on JY3.ISBN=BOOK3.ISBN
where 类别='计算机类'