数据库实验9答案

合集下载

数据库实验内容-答案

数据库实验内容-答案

实验内容:实验一:数据库的操作使用Management Studio和sql语句分别完成以下操作:1.创建一个名为“SM”的数据库,数据文件初始大小为3MB,最大为50MB,数据库自动增长,增长方式按10%;日志文件初始大小为2MB,数据大小不受限制,按1MB增长。

create database smon(name='smdata',filename='e:\smdata.mdf',size=3,maxsize=50,filegrowth=10%)log on(name='smlog',filename='e:\smlog.ldf',size=2,maxsize=unlimited,filegrowth=1)2.修改数据库“SM”,将数据文件名改成“sm_data”,初始大小改成5MBalter database smmodify file( name='smdata',newname='sm_data',size=5)3.分别查看数据库“SM”,该数据库中的文件和文件组。

exec sp_helpfile smexec sp_helpfilegroup sm4.删除数据库“SM”。

drop database sm实验二:创建表1. 在数据库SM中创建学生表student,课程表course,选课表scstudent(sid,sno,clno,sname,ssex,sage,sbir)说明:sid int identity(1,1) 序号sno 为主关系键,为字符类型学号clno 字符类型,班级号sname 字符类型,并不为空ssex 字符类型,check的值的范围为男女sbir 日期类型出生日期sage int;use smcreate table student( sid int identity(1,1),sno char(10) constraint pk_st primary key,clno char(10),sname varchar(20) not null,ssex char(2) constraint ck_ssex check(ssex in('男','女')),sbir datetime,sage int)course(cno,cname,ccredits,ctno,cpno,ctime)说明:cno 字符类型,主关系键cname 字符类型,唯一键ccredits 学分,精确数值型,精确长度为2,小数位为1ctno ,cpno 字符类型ctime 整型create table course(cno char(4) constraint pk_c primary key,cname varchar(20) constaint uk_cname unique,ccredit decimal(2,1),ctno char(2),cpno char(4),ctime tinyint)sc(sno,cno,score)说明:sno+cno为主键,并且sno是student的外部键,cno是course的外部键。

数据库实验答案

数据库实验答案
--3.查询选修了1号课程且不及格的学生的学号、姓名。(要求分别用连接查询和嵌套查询完成)
select sc.sno,sname,grade from sc,student where sc.sno=student.sno and cno='1' and grade<60
select sno,sname from student where sno in(select sno from sc where cno='1' and grade<60)
8.查询课程名为“C_”开头的课程名和学分。
9.某些学生入学后还没有确定所在的系,查询还没有确定系的学生的姓名。
10.查询成绩大于60分的学生的学号、课程号和成绩,并将查询结果按课程编号升序排列,同一课程的成绩按分数降序排列。
11.查询学校所开设的总的课程数。
12.计算2号课的学生成绩总和以及平均成绩,对应的列名分别为“总成绩”和“平均成绩”。
要求分别用集合查询和多重条件查询完成实验12createdatabasestdb1gousestdb1gocreatetabledepartmentdeptnochar10primarykeydnamevarchar50gocreateuniqueindexdeptnamedepartmentdnamegocreatetablestudentsnochar9primarykeysnamevarchar20nullssexchar2sageintdeptnochar10foreignkeydeptnoreferencesdepartmentdeptnocreatetablecoursecnochar4primarykeycnamevarchar40uniquecpnochar4ccreditsmallintgocreatetablescsnochar9cnochar4gradeintprimarykeysnocnoforeignkeysnoreferencesstudentsnoforeignkeycnoreferencescoursecno3insertdepartmentvalues?d001??cs?insertdepartmentvalues?d002??is?insertdepartmentvalues?d003??ma?insertstudentvalues?200215121??李勇??男?20?d001?insertstudentvalues?200215122??刘晨??女?20?d001?insertstudentvalues?200215123??王敏??女?20?d002?insertstudentvalues?200215125??张立??男?20?d003?insertstudentvalues?200215126??陈天华??男?20?d003?insertstudentvalues?200215128??宋阳??女?20?d002?insertcoursevalues?1??数据库??5?4insertcoursevalues?2??数学?null2insertcoursevalues?3??信息系统??1?4insertcoursevalues?4??操作系统??6?3insertcoursevalues?5??数据结构??7?4insertcoursevalues?6??数据处理

mysql数据库实验答案

mysql数据库实验答案

实验一创建、修改数据库和表结构1、用create建立教学数据库的五个基本表:(1)学生表(学号,姓名,性别,年龄),student((Sno,sname,ssex,sage) ;(2)课程表(课程号,课程名,学分),Course (Cno, Cname, credit) ;(3)选课表(学号,课程号,成绩),SC (Sno,, Cno, grade ) ;(4) 教师表(教师号,姓名,性别,出生年月,系部,职称,地址),T(Tno,Tname,ssex,birthday,dept,title,address) ;(5) 工资表(教师号,基本工资,职务工资,合计),Salary(Tno,jbgz,zwgz,hj);Create Database Student default character set utf8 default COLLATE utf8_bin;Use Student;Create Table Student(SNo char(20) primary key,SName char(20) ,页脚内容1SSex char(4) default '男',SAge int) ENGINE=InnoDB;Create Table Course(CNo char(20) primary key,CName char(20) NOT NULL,CRedit float) ENGINE=InnoDB;Create Table SC(SNo char(20) NOT NULL,CNo char(20) NOT NULL,Grade float,Primary Key(SNo, CNo),页脚内容2Foreign Key(SNo) References Student(SNo) On Delete Cascade,Foreign Key(CNo) References Course(CNo))ENGINE=InnoD B;Create Table T(TNo char(20) Primary Key,TName char(20) NOT NULL,TSex c har(4) default '男',birthday DateTime,dept c har(20),title char(20),address char(20))ENGINE=InnoDB;Create Table Salary(页脚内容3TNo char(20) NOT NULL,jbgz float,zwgz float,hj float,Foreign Key(TNo) References T(TNo) On Delete Cascade)ENGINE=InnoDB;2、用alter修改基本表(1)在已存在的学生表student中增加一个sdept(系)的新的属性列;alter table Student add Dept char(20);(2)将学生表student中sname属性列的数据类型修改为变长字符串varchar(10)。

第9套数据库习题及答案

第9套数据库习题及答案

一、单项选择题(每小题1分,共10分)1.()是被长期存放在计算机内的、有组织的、统一管理的相关数据的集合。

A.DATA B.INFORMATION C.DBD.DBS2.需求分析的主要方法是()。

A.自顶向下 B.自底向上 C.从左到右D.混合策略3.在关系运算中,选取符合条件的元组是()运算。

A.除法 B.投影C.连接D.选择4.关系数据库的规范化理论指出,关系数据库中的关系应满足一定的要求,最起码的要求是达到1NF,既满足()。

A.主关键字唯一标识表中的每一行B.关系中的行不允许重复C.每个非关键字列都完全依赖于主关键字D.每个属性都是不可再分的基本数据项5.SQL Server 2000中表查询的命令是()。

A. USE B.SELECT C.UPDATE D.DROP6.SQL Server 2000中表更新数据的命令是()。

A.USE B.SELECT C.UPDATED.DROP7.在SQL Server 2000中,下列变量名正确的是()。

A.@sum B.j C.sum D.4kk8.建立索引的目的是()。

A.降低SQL Server数据检索的速度B.与SQL Server数据检索的速度无关C.加快数据库的打开速度D.提高SQL Server数据检索的速度9.用于求系统日期的函数是()。

A.YEAR() B.GETDATE() C.COUNT() D.SUM()10.向用户授予操作权限的SQL语句是()。

A.CTEATE B.REVOKE C.SELECT D.GRANT二、判断题(每空1分,共10分)1.数据的完整性主要防范的对象是非法用户。

2.概念结构设计的工具是E—R模型。

3.写程序不属于数据库的模式设计阶段。

4.设计好的数据库管理系统在投入使用后出现问题由使用方负责。

5.规则必须使用一次就必须定义一次。

6.缺省情况下,所创建的索引是非聚集索引?7.自定义函数在对任何表的查询中都可以使用。

SQL数据库原理实验指导书及答案

SQL数据库原理实验指导书及答案

数据库原理SQLServer实验指导书数据库系统原理实验一、基本操作实验实验1:数据库的定义实验本实验的实验目的是要求学生熟练掌握和使用SQL、T-SQL、SQL Server Enterpriser Manager Server 创建数据库、表、索引和修改表结构,并学会使用SQL Server Query Analyzer,接收T-SQL语句和进行结果分析。

本实验的内容包括:l)创建数据库和查看数据库属性。

2)创建表、确定表的主码和约束条件,为主码建索引。

3)查看和修改表结构。

4)熟悉SQL Server Enterpriser Manager和 Query Analyzer工具的使用方法具体实验任务如下。

1.基本提作实验1)使用Enterpriser Manager建立图书读者数据库2)在Enterpriser Manager中查看图书读者数据库的属性,并进行修改,使之符合要求。

3)通过Enterpriser Manager,在建好了图书借阅数据库中建立图书、读者和借阅3个表,其结构为:图书(书号,类别,出版社,作者,书名,定价,版次);读者(编号,姓名,单位,性别,电话):借阅(书号,读者编号,借阅日期人)要求为属性选择合适的数据类型,定义每个表的主键,Allow Null(是否允许空值)和Default Value(缺省值)等列级数据约柬。

4)在Enterpriser Manager建立图书、读者和借阅3个表的表级约束:每个表的PrimaryKey (主键)约束;借阅表与图书表间、借阅表与读者表之间的FOREIGNKEY(外码)约柬,要求按语义先确定外码约束表达式,再通过操作予以实现;实现借阅表的书号和读者编号的UNIQUE(惟一性)约束;实现读者性别只能是“男”或“女”的check(检查)约束。

2.提高操作实验建立学生_课程库操作,在查询分析器中用SQL命令实现。

库中表结构为:Student(sno,sname,sage,ssex,sdept):course(cno,cname,cpno,ccredit);sc(sno,cno,grade)。

数据库应用技术形考任务9答案

数据库应用技术形考任务9答案

数据库应用技术形考任务9参考答案一、单项选择题(每题2分,共10分)题目1在VB中,可以利用Connection对象的Execute方法实现对数据库的更改操作。

关于删除SC 表中学号为S01的选课记录的语句,正确的是()。

ADOcn.Execute “DELETE FROM SC WHERE 学号= 'S01'”a. ADOcn.Execute “UPATE FROM SC WHERE 学号= 'S01'”b. ADOcn.Execute “DELETE FROM SC WHERE 学号= 'S01'”c. ADOcn.Execute “SELECT FROM SC WHERE 学号= 'S01'”d. ADOcn.Execute “DROP FROM SC WHERE 学号= 'S01'”题目2设ADOcn是一个Connection对象,与数据库的连接字符串存放在cnStr字符串中。

关于使用ADOcn建立与数据源连接的语句,正确的是()。

ADOcn.Open cnStra. ADOcn.Create cnStrb. ADOcn.Open cnStrc. ADOcn.connetion cnStrd. ADOcn.conn cnStr题目3不属于VB中ADO对象模型中的对象的是()。

Updatea. Connectionb. Commandc. Recordsetd. Update题目4声明并创建Connection对象的语句,正确的是()。

Dim ADOcn As New Connectiona. Dim ADOcn As New Connectionb. Dim ADOcn As Connectionc. Declare ADOcn As New Connectiond. Declare ADOcn As Connection题目5利用Recordset对象可以得到查询结果集。

数据库原理及应用最全上机实验及实验答案

数据库原理及应用最全上机实验及实验答案

实验一 SQL Server 2005 的安装和环境介绍一.实验目的与要求:1.掌握SQL Server 2005 服务器的安装方法2.了解SQL Server 2005 的环境3.了解数据库及其对象二.实验准备1.了解SQL Server 2005的版本2.了解SQL Server 2005各版本对硬件和软件的需求三.实验要求1.写出SQL SERVER 2005的功能与特点, 使用方法, 应用状况的报告2.完成SQL SERVER 2005的安装、启动、登录。

四.实验内容1.安装SQL Server 2005实验一 SQL Server 2005 的安装和环境介绍●实验指导——安装SQL Server 20051.根据安装机器软硬件的要求,选择一个合适的版本,以下以开发版为例2.将 SQL Server 2005 DVD 插入 DVD 驱动器。

如果DVD驱动器的自动运行功能无法启动安装程序无法启动安装程序,请导航到 DVD 的根目录然后启动splash.hta。

3.在自动运行的对话框中,单击“运行 SQL Server 安装向导”。

4.在“最终用户许可协议”页上,阅读许可协议,再选中相应的复选框以接受许可条款和条件。

接受许可协议后即可激活“下一步”按钮。

若要继续,请单击“下一步”若要结束安装程序,请单击“取消”。

如下图:5.在“SQL Server 组件更新”页上,安装程序将安装 SQL Server 2005 的必需软件。

有关组件要求的详细信息,请单击该页底部的“帮助”按钮。

若要开始执行组件更新,请单击“安装”。

更新完成之后若要继续,请单击“完成”。

6.在 SQL Server 安装向导的“欢迎”页上,单击“下一步”以继续安装。

7.在“系统配置检查 (SCC)”页上,将扫描安装计算机,以检查是否存在可能妨碍安装程序的条件。

8.在“注册信息”页上的“姓名”和“公司”文本框中,输入相应的信息。

《数据库原理及应用》实验报告带答案

《数据库原理及应用》实验报告带答案

实验课程:数据库原理及应用学号:学生姓名:班级:年月日实验1 创建和维护数据库一、实验目的(1)掌握在Windows 平台下安装与配置MySQL 5.5 的方法。

(2)掌握启动服务并登录MySQL 5.5 数据库的方法和步骤。

(3)了解手工配置MySQL 5.5 的方法。

(4)掌握MySQL 数据库的相关概念。

(5)掌握使用Navicat 工具和SQL 语句创建数据库的方法。

(6)掌握使用Navicat 工具和SQL 语句删除数据库的方法。

二、实验要求(1)学生提前准备好实验报告,预习并熟悉实验步骤;(2)遵守实验室纪律,在规定的时间内完成要求的内容;(3)1~2人为1小组,实验过程中独立操作、相互学习。

三、实验内容及步骤(1)在Windows 平台下安装与配置MySQL 5.5.36 版。

(2)在服务对话框中,手动启动或者关闭MySQL 服务。

(3)使用Net 命令启动或关闭MySQL 服务。

开始--运行--cmd--输入“net start mysql”回车,启动成功;输入“net--stop--mysql”回车,停止。

(4)分别用Navicat 工具和命令行方式登录MySQL。

①打开Navicat for MySQL,文件--新建连接--确定。

②开始--运行--cmd,输入mysql -h hostname(如果服务器在本机,可以输入localhost或127.0.0.1)user -p 回车后,系统会提示“Enter password”,输入配置的密码就可以登录上了。

(5)创建数据库。

①使用Navicat 创建学生信息管理数据库gradem。

②使用SQL 语句创建数据库MyDB。

①打开Navicat for MySQL,文件--新建连接--常规(设置连接名MySQL,主机名localhost)。

②使用Windows命令行方式登录MySQL,然后输入CREATE DATABASE mydb;回车,显示Query OK, 1 row affected (0.00 sec)创建成功。

数据库第九章参考答案

数据库第九章参考答案

第九章T-SQL基础P1641.从功能上划分,SQL分为哪4类?[难度↓]【解】SQL语句通常分成以下4类:数据查询语言数据操作语言数据定义语言数据控制语言2.NULL代表什么含义?将其与其他值进行比较会产生什么结果?如果数值型列中存在NULL,会产生什么结果?[难度↓]【解】在数据库中,NULL是一个特殊值,表示数值未知。

NULL不同于空字符或数字0,也不同于零长度字符串。

比较两个空值或将空值与任何其他数值相比均返回未知,这是因为每个空值均为未知。

空值通常表示未知、不可用或以后添加数据。

如果某个列上的空值属性为NULL,表示接受空值;空值属性为NOT NULL,表示拒绝空值。

如果数值型列中存在NULL,则在进行数据统计时就会产生不正确的结果。

3.使用T-SQL语句向表中插入数据应注意什么?[难度↓]【解】在使用T-SQL语句向表中插入数据时要注意以下几点:当向表中所有列都插入新数据时,可以省略列表名,但是必须保证VALUES 后的各数据项位置同表定义时的顺序一致。

要保证表定义时的非空列必须有值,即使这个非空列没有出现在插入语句中,也必须如此。

插入字符型和日期型值时,要加入单引号。

没有列出的数据类型应该具有以下属性之一:identity属性、timestamp 数据类型、具有NULL属性或者有一个默认值。

对于具有identity属性的列,其值由系统给出,用户不必往表中插入数据。

4.在SELECT语句中DISTINCT、ORDER BY、GROUP BY和HA VING子句的功能各是什么?[难度↓]【解】各子句的功能如下。

DISTINCT:查询唯一结果。

ORDER BY:使查询结果有序显示。

GROUP BY:对查询结果进行分组。

HA VING:筛选分组结果。

5.在一个SELECT语句中,当WHERE子句、GROUP BY子句和HA VING子句同时出现在一个查询中时,SQL的执行顺序如何?[难度↓↓]【解】其执行顺序如下:(1)执行WHERE子句,从表中选取行。

mysql09实训指导书(带答案)

mysql09实训指导书(带答案)

MySQL 数据库原理与应用实训九操作指导书1、实训目标:1)使用order by 子句进行查询结果排序2)使用group by 子句进行查询结果分组计算2、实训任务:1)掌握order by 子句进行查询结果排序2)掌握group by 子句进行查询结果分组计算3、实训指导请大家上机写出相应SQL语句,复制粘贴到相应题目下。

以学号+姓名命名方式提交。

1)在数据库D_sample中查询course表中开课学期按照升序排列的课程信息。

use d_sample; select * from course order by 开课学期;2)在数据库D_sample中查询sc表中选修了“ 07003”课程的学生成绩,成绩按降序进行排序。

use d_sample;select * from scwhere 课程号='07003'order by 成绩desc;3)在数据库D_sample中统计student表中学生的男女人数。

use d_sample;select性别,cou nt(性别)as人数from studentgroup by 性别;4)在数据库D_sample中统计student表中每个民族的男女人数、总人数, 以及学生总人数。

Use d_sample;select民族,性别,count(*) as人数from studentgroup by 民族,性别with rollup;5)在数据库D_sample中查询sc表中平均成绩在85分以上的课程号select课程号,avg成绩)as平均成绩from scgroup by 课程号hav ing avg成绩)>=85;6) 在数据库D_sample中查询course表中课程学分为4的课程门数used_sample;select count(*) from course where 学分=4;7)在数据库D_sample中查询sc表,查询每位学生的学号、总成绩。

数据库原理及应用教程(MySQL版)-实验素材及答案

数据库原理及应用教程(MySQL版)-实验素材及答案

数据库原理及应用教程(MySQL版)- 实验素材及答案第一章数据库的基本概念实验素材•数据库系统是由数据库和数据库管理系统(DBMS)组成的,数据库是用于存储和管理数据的集合,而DBMS是用于管理数据库的软件。

•数据是描述事物的符号记录,可以是数字、文字、图像等形式。

•数据库的特点包括永久存储、面向用户的数据抽象、数据的共享与并发控制等。

•数据库的应用领域非常广泛,包括企业管理、电子商务、金融服务等。

实验答案1.数据库系统是由数据库和数据库管理系统组成的。

数据库是用于存储和管理数据的集合,而数据库管理系统是用于管理数据库的软件。

2.数据是描述事物的符号记录,可以是数字、文字、图像等形式。

3.数据库的特点包括永久存储、面向用户的数据抽象、数据的共享与并发控制等。

4.数据库的应用领域非常广泛,包括企业管理、电子商务、金融服务等。

第二章数据库的逻辑结构实验素材•数据库的逻辑结构包括三层模式,分别是外模式、概念模式和内模式。

•外模式是用户对数据库的视图,它描述了用户所需要的数据的逻辑结构。

•概念模式是全局的逻辑结构描述,它描述了整个数据库的逻辑结构,是数据库设计的产物。

•内模式是数据库在存储介质上的存储结构,它是数据库管理系统的内部表示,对用户不可见。

实验答案5.数据库的逻辑结构包括三层模式,分别是外模式、概念模式和内模式。

6.外模式是用户对数据库的视图,它描述了用户所需要的数据的逻辑结构。

7.概念模式是全局的逻辑结构描述,它描述了整个数据库的逻辑结构,是数据库设计的产物。

8.内模式是数据库在存储介质上的存储结构,它是数据库管理系统的内部表示,对用户不可见。

第三章数据库的物理结构实验素材•数据库的物理结构指的是数据在存储介质上的存储方式,包括存储单位、磁盘存储和索引结构等。

•存储单位是数据库管理系统分配存储空间的最小单元,通常是一个数据块。

•数据库的物理结构设计是为了提高数据库的访问效率,如磁盘存储可以减少磁盘I/O操作,索引结构可以加快数据的查找速度。

数据库系统原理教程课后习题及答案(第九章)

数据库系统原理教程课后习题及答案(第九章)

第9章数据库恢复技术1.试述事务的概念及事务的4 个特性。

答:事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。

事务具有4 个特性:原子性(Atomicity )、一致性(consistency )、隔离性( Isolation )和持续性(Durability )。

这4 个特性也简称为ACID 特性。

原子性:事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做。

一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。

隔离性:一个事务的执行不能被其他事务干扰。

即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

持续性:持续性也称永久性(Perfnanence ) ,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

接下来的其他操作或故障不应该对其执行结果有任何影响。

2 .为什么事务非正常结束时会影响数据库数据的正确性,请列举一例说明之。

答:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。

如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。

例如某工厂的库存管理系统中,要把数量为Q 的某种零件从仓库1 移到仓库2 存放。

则可以定义一个事务T , T 包括两个操作;Ql = Ql 一Q , Q2= Q2 + Q。

如果T 非正常终止时只做了第一个操作,则数据库就处于不一致性状态,库存量无缘无故少了Q 。

3 .数据库中为什么要有恢复子系统?它的功能是什么?答:因为计算机系统中硬件的故障、软件的错误、操作员的失误以及恶意的破坏是不可避免的,这些故障轻则造成运行事务非正常中断,影响数据库中数据的正确性,重则破坏数据库,使数据库中全部或部分数据丢失,因此必须要有恢复子系统。

数据库实操考试题及答案

数据库实操考试题及答案

数据库实操考试题及答案**数据库实操考试题及答案**一、单项选择题(每题2分,共20分)1. 在关系数据库中,关系至少具有以下哪种特性?A. 可变性B. 传递性C. 原子性D. 唯一性答案:D2. SQL语言中,用于查询数据的命令是:A. INSERTB. UPDATEC. DELETED. SELECT答案:D3. 在数据库设计中,将一个表中的列复制到另一个表中,这种操作称为:A. 复制B. 继承C. 派生D. 分区答案:C4. 数据库管理系统(DBMS)的主要功能不包括:A. 数据定义B. 数据操纵C. 数据存储D. 数据加密答案:D5. 在关系数据库中,以下哪个不是关系的基本操作?A. 选择B. 投影C. 连接D. 排序答案:D6. 数据库中的视图是:A. 一个虚拟表B. 一个物理存储的表C. 一个索引D. 一个数据库文件答案:A7. 数据库中的事务具有以下哪个特性?A. 一致性B. 并发性C. 持久性D. 原子性答案:D8. 在SQL中,用于定义数据库、表、视图等对象的语句是:A. DDLB. DMLC. DCLD. TCL答案:A9. 数据库中的完整性约束不包括:A. 实体完整性B. 参照完整性C. 用户定义的完整性D. 并发控制答案:D10. 数据库中的范式理论主要用于:A. 提高查询效率B. 减少数据冗余C. 提高数据安全性D. 优化数据库性能答案:B二、多项选择题(每题3分,共15分)1. 以下哪些是数据库设计过程中需要考虑的因素?A. 数据模型B. 数据存储C. 性能优化D. 用户界面设计答案:ABC2. 在数据库中,以下哪些操作可以被回滚?A. SELECTB. INSERTC. UPDATED. DELETE答案:BCD3. SQL语言中,以下哪些是数据定义语言(DDL)的命令?A. CREATEB. ALTERC. DROPD. GRANT答案:ABCD4. 数据库中的索引可以用于:A. 提高查询速度B. 保证数据的唯一性C. 减少数据冗余D. 优化数据存储答案:AD5. 数据库中的触发器可以用于:A. 数据验证B. 数据更新C. 数据备份D. 维护数据完整性答案:ABD三、简答题(每题10分,共30分)1. 简述数据库事务的ACID特性。

数据库第9章习题参考答案

数据库第9章习题参考答案

第9章习题解答1.选择题(1)以下是合法的变量名。

A.4p B.姓名C."年龄" D.IfNot(2)InputBox函数的返回值类型是。

A.变体型 B. 整型C.实型D.字符型(3)在VB中,下面正确的逻辑表达式是。

A.x>y AND y>z B.x>y>z C.x>y AND >z D.x>y &y>z (4)在窗体上画一个名称为Commandl的命令按钮,然后编写如下程序:Private Sub Command1_Click()Static X As IntegerStatic Y As IntegerClsY=1Y=Y+5X=5+XPrint X,YEnd Sub程序运行时,3次单击命令按钮Commandl后,窗体上显示的结果为。

A.15 16 B.15 6 C.15 15 D.5 6(5)表达式3^2*2+3 MOD 10\4的值是。

A.18 B.1 C.19 D.0(6)在窗体上画一个水平滚动条,名称为HScroll1;再画一个文本框,名称为Text1。

要想使用滚动条滑块的变化量来调用文本框中文字的大小,则可满足的语句是。

A.Text1.FontName= HScroll1.Max B.Text1.FontSize= HScroll1.MinC.Text1.FontSize= HScroll1.value D.Text1.FontBold= HScroll1.value (7)以下不是图片框PictureBox的方法。

A.cls B.print C.pset D.ScaleMod(8)数据访问接口ADO是Microsoft处理数据库信息的新技术,以下关于ADO技术的叙述不正确的是。

A.ADO是一种ActiveX对象B.ADO采用了OLE DB的数据访问模式C.ADO是数据访问对象DAO、远程数据对象RDO和开放数据库互连ODBC三种方式的扩展D.ADO Data控件不能创建与数据库的连接(9)在Visual Basic中,ADO数据控件不能直接显示记录集中的数据,必须通过数据绑定控件来实现,下列控件不能与ADO数据控件实现绑定。

数据库实验9答案

数据库实验9答案

(1) 设置一个触发器,该触发器仅允许“dbo”用户可以删除Employee表内数据,否则出错。

create trigger EmploteeDelete on employeefor deleteasif exists (select * from deleted)beginif user!='dbo'rollbackend(2) 在OrderMaster表中创建触发器,插入数据时要先检查Employee表中是否存在同样值的业务员编号,如果不存在则不允许插入。

create trigger insOrderMasteron OrderMasterfor insertasbeginif exists(select*from insertedwhere salerNo not in(select employeeNofrom Employee))rollback;end(3) 级联更新:当更新Customer表中customerNo列的值时,同时更新OrderMaster 表中的customerNo列的值,并且一次只能更新一行。

create trigger uptCustomeron Customerfor updateasdeclare @oldCustomerNo char(9),@newCustomerNo char(9)if(select count(*)from inserted)>1rollbackelsebeginif update(customerNo)beginselect @oldCustomerNo=customerNo from deletedselect @newCustomerNo=customerNo from insertedupdate OrderMaster set customerNo=@newCustomerNowhere customerNo=@oldCustomerNoendend(4) 对Product表写一个UPDATE触发器。

数据库基础及其应用第九章课后作业

数据库基础及其应用第九章课后作业

第九章 SQL Server数据库简单应用一、单选题1.使用“CREATE DATABASE AAA”命令所建立数据库文件的初始大小是(A)字节。

A. 1MB. 2MC. 3MD. 4M2.下面关于索引的描述不正确的是(B)。

A. 索引是一个指向表中数据的指针B. 索引是在列上建立的一种数据库对象C. 索引的建立和撤消对表的数据毫无影响D. 表的建立和撤消对索引毫无影响3.下面关于聚集索引和非聚集索引说法正确的是(B)。

A. 每个表只能建立一个非聚集索引B. 非聚集索引需要较多的硬盘空间和内存C. 一张表上不能同时建立聚集和非聚集索引D. 一个复合索引只能是聚集索引4.“Create Unique Index AAA On 学生表(学号)”将在学生表上创建名为AAA的(A)。

A. 惟一索引B. 聚集索引C. 复合索引D. 唯一聚集索引5.下列标识符可以作为局部变量使用(C)。

A. [@Myvar]B. My varC. @MyvarD. @My var6.Transact SQL支持的程序结构语句主要有(A)。

A. Begin…EndB. If…Then…ELSEC. Do CaseD. Do While7.属于事务控制的语句是(A)。

A. Begin Tran、Commit、RollBackB. Begin、Continue、EndC. Create Tran、Commit、RollBackD. Begin Tran、Continue、End8.SQL Server触发器主要针对下列语句创建(B)。

A. SELECT、INSERT、DELETEB. INSERT、UPDATE、DELETEC. SELECT、UPDATE、INSERTD. INSERT、UPDATE、CREATE9.下面关于索引的描述不正确的是(B)。

A. 索引是一个指向表中数据的指针B. 索引是在元组上建立的一种数据库对象C. 索引的建立和撤消对表中的数据毫无影响D. 表被撤消时将同时撤消在其上建立的索引10.以下哪种情况应尽量创建索引(A)。

数据库实验三-实验九含参考答案

数据库实验三-实验九含参考答案
例 3-15:(匹配查询) 求选修课程 1 或 3,成绩在 80 至 90 之间,学号为 200215xxx 的学生的学号、 课程号和成绩。 select Sno,Cno,Grade from SC where Cno in('1','3')and Grade Between 80 and 90 and Sno like'200215%'
select max(grade),min(grade),avg(grade) from sc where cno='001' 例 3-7:(分组查询) 求各门课程的平均成绩与总成绩。
select cno,avg(grade),sum(grade) from sc group by cno 例 3-8:(分组查询) 输入以下查询语句并执行,观察出现的其结果并分析其原因。 SELECT SNAME,SDEPT,COUNT(*)FROM STUDENT WHERE SDEPT=’CS’ GROUP BY SDEPT;
选择列表中的列'STUDENT.Sname' 无效,因为该列没有包含在聚合函数或GROUP BY 子句中。
例 3-9:(分组查询) 分析以下语句为什么会出现错误。并给出正确的查询语句。 SELECT SAGE FROM STUDENT GROUP BY SNO;
选择列表中的列'STUDENT.Sage' 无效,因为该列没有包含在聚合函数或GROUP BY 子句中。
实验五:数据查询语言
[ 实验目的 ]
体会 SQL 语言数据查询功能的丰富和复杂。
[ 实验内容 ]
3. SQL 数据查询语句: 例 3-1:(涉及空值查询) 求缺少学习成绩的学生的学号和课程号。 select sno,cno from sc where grade is null 例 3-2:(控制行的显示顺序) 求选修 003 课程或 004 课程的学生的学号、课程号和分数。 select sno,cno,grade from sc where cno in('003','004') order by grade 例 3-3:(组函数) 求学生总人数。

数据库实验和参考答案

数据库实验和参考答案

数据库实验和参考答案上机实验三1.在“学生管理数据库”中用查询分析器创建p82页的课程数据表(表名为kcb),并输入数据内容。

2.用查询分析器在student表中增加一个字段:“电话号码”,字符型,并设置默认值为“1111111”。

3.用查询分析器删除kcb表的主键4.用企业管理器或查询分析器修改course表,设置约束:学时>=学分*16。

5.用查询分析器修改学生管理数据库中的students_dat文件增容方式为一次增加3MB.6.将“学生管理数据库”更名为“学生管理”。

7.将“学生管理”数据库备份到外存中。

8.将“学生管理”数据库的数据导出为excel文件,并保存在外存中。

9.为course表中的课程名建立唯一性索引。

10.将“学生管理”数据库从系统中分离出来。

11. 将“学生管理”数据库附加到企业管理器中。

上机实验四1.分别查询学生表和学生修课表中的全部数据。

2.查询计算机系的学生的姓名、年龄。

3.查询选修了c01号课程的学生的学号和成绩。

4.查询成绩在70到80分之间的学生的学号、课程号和成绩。

5.查询计算机系年龄在18到20之间且性别为“男”的学生的姓名、年龄。

6.查询0412101号学生的修课情况。

7.查询c01号课程成绩最高的分数。

8.查询学生都选修了哪些课程,要求列出课程号。

9.查询Northwind数据库中orders 表的OrderlD、CustomerID和OrderDate,并将最新的定购日期(OrderDate)列在前边。

10.查询Northwind数据库中orders 表的ShipCountry列以B,C,D,F 开始且第三个字符为“a”的OrderlD、CustomerID和ShipCountry的信息。

11.查询Northwind数据库中orders 表的ShipCountry列不以A,B,C,D,E,F开始且最后一个字母是“a”的OrderlD、CustomerlD和ShipCountry的信息。

(完整版)数据库系统基础教程第九章答案

(完整版)数据库系统基础教程第九章答案

9.3.1a)In the following, we use macro NOT_FOUND as defined in the section.void closestMatchPC() {EXEC SQL BEGIN DECLARE SECTION;char manf, SQLSTATE[6];int targetPrice, /* holds price given by user */float tempSpeed, speedOfClosest;char tempModel[4], modelOfClosest[4];int tempPrice, priceOfClosest;/* for tuple just read from PC & closest price found so far */EXEC SQL END DECLARE SECTION;EXEC SQL DECLARE pcCursor CURSOR FORSELECT model, price, speed FROM PC;EXEC SQL OPEN pcCursor;/* ask user for target price and read the answer into variabletargetPrice *//* Initially, the first PC is the closest to the target price.If PC is empty, we cannot answer the question, and so abort. */EXEC SQL FETCH FROM pcCursorINTO :modelOfClosest, :priceOfClosest, :speedOfClosest;if(NOT_FOUND) /* print message and exit */ ;while(1) {EXEC SQL FETCH pcCursor INTO :tempModel, :tempPrice,:tempSpeed;if(NOT_FOUND) break;if(/*tempPrice closer to targetPrice than is priceOfClosest */){modelOfClosest = tempModel;priceOfClosest = tempPrice;speedOfClosest = tempSpeed;}}/* Now, modelOfClosest is the model whose price is closest totarget. We must get its manufacturer with a single-row select */EXEC SQL SELECT makerINTO :manfFROM ProductWHERE model = :modelOfClosest;printf("manf=%s, model=%d, speed=%d\n",manf, modelOfClosest, speedOfClosest);EXEC SQL CLOSE CURSOR pcCursor;}b)void acceptableLaptop() {EXEC SQL BEGIN DECLARE SECTION;int minRam, minHd, minScreen; /* given by user */float minSpeed;char model[4], maker,float speed;int ram, hd, screen, price;EXEC SQL END DECLARE SECTION;EXEC SQL PREPARE query1 FROM‘ SELECT model, speed, ram, hd, screen, price, maker FROM Laptop l, Product pWHERE speed >= ?AND ram >= ? ANDhd >= ? ANDscreen >= ? ANDl.model = p.model’EXEC SQL DECLARE cursor1 CURSOR FOR query1;/* ask user for minimum speed, ram, hd size, and screen size */EXEC SQL OPEN cursor1 USING :minSpeed, :minRam, :minHd, :minScreen;while(!NOT_FOUND) {EXEC SQL FETCH cursor1 INTO:model, :speed, :ram, :hd, :screen, :price, :maker;if(FOUND){printf("maker:%s, model:%d, \nspeed:%.2f, ram:%d, hd:%d, screen:%d, price:%d\n",maker, model, speed, ram, hd, screen, price);}}EXEC SQL CLOSE CURSOR cursor1;}c)void productsByMaker() {EXEC SQL BEGIN DECLARE SECTION;char maker, model[4], type[10], color[6];float speed;int ram, hd, screen, price;EXEC SQL END DECLARE SECTION;EXEC SQL PREPARE query1 FROM‘ SELECT * FROM PCWHERE model IN (SELECT model FROM ProductWHERE maker = ? ANDtype =‘ pc’ );EXEC SQL PREPARE query2 FROM‘ SELECT * FROM LaptopWHERE model IN (SELECT model FROM ProductWHERE maker = ? ANDtype =‘ laptop’ );EXEC SQL PREPARE query3 FROM‘ SELECT * FROM PrinterWHERE model IN (SELECT model FROM ProductWHERE maker = ? ANDtype =‘ printer’ );EXEC SQL DECLARE cursor1 CURSOR FOR query1;EXEC SQL DECLARE cursor2 CURSOR FOR query2;EXEC SQL DECLARE cursor3 CURSOR FOR query3;/* ask user for manufacturer */Printf(“ maker:%s n” , ma ker);/* get PCs made by the manufacturer */EXEC SQL OPEN cursor1 USING :maker;Printf( “ product type: PC n” );while(!NOT_FOUND) {EXEC SQL FETCH cursor1 INTO:model, :speed, :ram, :hd, :price;if(FOUND){n” , model, speed, ram, hd, price);}}/* get Laptops made by the manufacturer */EXEC SQL OPEN cursor2 USING :maker;Printf(“ product type: Laptop n” );while(!NOT_FOUND) {EXEC SQL FETCH cursor2 INTO:model, :speed, :ram, :hd, :screen, :price;if(FOUND){printf("model:%d, speed:%.2f, ram:%d, hd:%d, screen:%d,price:%d\n", model, speed, ram, hd, screen, price);}}/* get Printers made by the manufacturer */EXEC SQL OPEN cursor3 USING :maker;Printf(“ product type: Printer n”);while(!NOT_FOUND) {EXEC SQL FETCH cursor3 INTO:model, :color, :type, :price;if(FOUND){printf("model:%d, color:%s, type:%s, price:%d\n",model, color, type, price);}}EXEC SQL CLOSE CURSOR cursor1;EXEC SQL CLOSE CURSOR cursor2;EXEC SQL CLOSE CURSOR cursor3;}d)void withinBudget() {EXEC SQL BEGIN DECLARE SECTION;int total_budget, rest_budget, pc_price, printer_price;char pc_model[4], printer_model[4], color[6];float min_speed;EXEC SQL END DECLARE SECTION;EXEC SQL PREPARE query1 FROM‘ SELECT model, price FROM PCWHERE speed >= ? AND price <= ?ORDER BY price’;EXEC SQL PREPARE query2 FROM‘ SELECT model, price FROM PrinterWHERE price <= ? AND color = ?ORDER BY price’;EXEC SQL DECLARE cursor1 CURSOR FOR query1;EXEC SQL DECLARE cursor2 CURSOR FOR query2;/* ask user for budget & the minimum speed of pc *//* get the cheapest PC of the minimum speed */EXEC SQL OPEN cursor1 USING :min_speed, :total_budget;EXEC SQL FETCH cursor1 INTO :pc_model, :pc_price;if (NOT_FOUND)Printf( “ no pc f n” );else{Printf( “ pc model: %s n” , pc_model);}/* get Printer within the budget–pc_price;*/ rest_budget = total_budgetcolor = “ true ”;EXEC SQL OPEN cursor2 USING :rest_budget, :color;EXEC SQL FETCH cursor2 INTO :printer_model;if(NOT_FOUND) {EXEC SQL CLOSE CURSOR cursor2;color =“ false”;EXEC SQL OPEN cursor2 USING :rest_budget, :color;if(NOT_FOUND)n” );printf(“ no printer found within the budgetelse {EXEC SQL FETCH cursor2 INTO :printer_model;printf(“ printer model: %s n” , printer_model);}}else {printf( “ printer model: %s n” , printer_model);}EXEC SQL CLOSE CURSOR cursor1;EXEC SQL CLOSE CURSOR cursor2;}e)void newPCproduct() {EXEC SQL BEGIN DECLARE SECTION;char pmaker, pmodel[4], ptype[6];float pspeed;int pram, phd, pscreen, pprice;int pcount;EXEC SQL END DECLARE SECTION;EXEC SQL PREPARE stmt1 FROM‘ SELECT COUNT(*) INTO :countFROM PCWHERE MODEL = ?;EXEC SQL PREPARE stmt2 FROM‘ INSERT INTO Product VALUES(?, ?, ?) ’;EXEC SQL PREPARE stmt3 FROM‘ INSERT INTO PC VALUES(?, ?, ?, ?, ?) ’;/* ask user for manufacturer, model, speed, RAM, hard-disk,& price of a new PC*/EXEC SQL EXECUTE stmt1 USING :pmodel;IF (count > 0)Printf( “ Warnning: The PC model already exists n” );ELSE{EXEC SQL EXECUTE stmt2 USING :pmaker, :pmodel, :ptype;EXEC SQL EXECUTE stmt3 UINGNG :pmodel, :pspeed, :pram,:phd, :pprice }}9.3.2a)void largestFirepower() {EXEC SQL BEGIN DECLARE SECTION;char cclass[20], maxFirepowerClass[20];int cnumGuns, cbore;float firepower, maxFirepower;EXEC SQL END DECLARE SECTION;EXEC SQL DECLARE cursor1 CURSOR FORSELECT class, numGuns, bore FROM Classes;EXEC SQL OPEN cursor1;EXEC SQL FETCH FROM cursor1 INTO :cclass, :cnumGuns, :cbore;if(NOT_FOUND) /* print message and exit */ ;maxFirepower = cnumGuns * (power (cbore, 3));strcpy(maxFirepowerClass, cclass);while(1) {EXEC SQL FETCH cursor1 INTO :cclass, :cnumGuns, :cbore;if(NOT_FOUND) break;firepower = cnumGuns * (power (cbore, 3));if( firepower > maxFirepower ){maxFirepower = firepower;strcpy(maxFirepowerClass, cclass);}}printf("Class of maximum firepower :%s\n", maxFirepowerClass);EXEC SQL CLOSE CURSOR cursor1;}b)void getCountry() {EXEC SQL BEGIN DECLARE SECTION;char ibattle[20], iresult[10], ocountry[20];char stmt1[200], stmt2[200];EXEC SQL END DECLARE SECTION;strcpy(stmt1,“ SELECT COUNTRY FROM Classes CWHERE C.class IN (SELECT S.class FROM Ships SWHERE IN (SELECT ship FROM OutcomesWHERE battle = ?))” );Strcpy(stm2,“ SELECT country FROM ClassesWHERE class = ( SELECT MAX(COUNT(class))FROM Ships s, Outcomes oWHERE = s.ship ANDs.result =‘ ?’ )” );EXEC SQL PREPARE query1 FROM stmt1;EXEC SQL PREPARE query2 FROM stmt2;EXEC SQL DECLARE cursor1 CURSOR FOR query1;EXEC SQL DECLARE cursor2 CURSOR FOR query2;/* ask user for battle *//* get countries of the ships involved in the battle */EXEC SQL OPEN cursor1 USING :ibattle;while(!NOT_FOUND) {EXEC SQL FETCH cursor1 INTO :ocountry;if(FOUND)n” , ocoutry);}EXEC SQL CLOSE CURSOR cursor1;/* get the country with the most ships sunk */strcpy(iresult,“ sunk” );EXEC SQL OPEN cursor2 USING :iresult;/* loop for the case there ’ s the same max# of ships sunk */While(!NOT_FOUND) {EXEC SQL FETCH cursor2 INTO :ocountry;If(FOUND)Printf(}/* get the country with the most ships damaged */strcpy(iresult, “ damaged ” ); EXEC SQL OPEN cursor2 USING :iresult;/* loop for the case there ’ s the same max# of ships damaged */While(!NOT_FOUND) {EXEC SQL FETCH cursor2 INTO :ocountry;If(FOUND)Printf(}} c)void addShips() {EXEC SQL BEGIN DECLARE SECTION; char iclass[20], itype[3], icontry[20], iship[20]; int inumGuns, ibore, idisplacement, ilaunched; char stmt1[100], stmt2[100]; EXEC SQL END DECLARE SECTION;strcpy(stmt1,“ INSERT INTO Classes VALUES (?, ?, ?, ?, ?, ?)” );strcpy(stmt2,“ INSERT INTO Ships VALUES (?, ?, ?)” );/* ask user for a class and other info for Classes table */EXEC SQL EXECUTE IMMEDATE :stmt1USING :iclass, :itype, :icontry,:inumGuns, :ibore, :idisplacement;/* ask user for a ship and launched */WHILE(there_is_input){“ country with the most ships damaged: %s, ocountry);“ country with the most ships sunk: %s, ocountry);EXEC SQL EXECUTE IMMEDATE :stmt2USING :iship, :iclass, ilaunched;/* ask user for a ship and launched */}}d)void findError() {EXEC SQL BEGIN DECLARE SECTION;char bname[20], bdate[8], newbdate[8];char sname[20], lyear[4], newlyear[4];char stmt1[100], stmt2[100];EXEC SQL END DECLARE SECTION;strcpy(stmt1, strcpy(stmt2, “ UPDATE Battles SET date = ? WHERE name = ?“ UPDATE Ships SET launched = ? WHERE name = ?” );” );EXEC SQL DECLARE C1 CURSOR FORSelect , b.date, , unchedFROM Battles b, Outcomes o, Ships sWHERE = o.battle ANDo.ship = ANDYEAR(b.date) < unched;EXEC SQL OPEN C1;while(!NOT_FOUND) {EXEC SQL FETCH C1 INTO :bname, :bdate, :sname, :lyear;/* prompt user and ask if a change is needed */if(change_battle){/* get a new battle date to newbdate */EXEC SQL EXECUTE IMMEDATE :stmt1USING :bname, :newbdate;}if(change_ship){/* get a new launched year to newlyear */EXEC SQL EXECUTE IMMEDATE :stmt2USING :sname, :newlyear;}}}9.4.1a)CREATE FUNCTION PresNetWorth(studioName CHAR[15]) RETURNS INTEGER DECLARE presNetWorth INT;BEGINSELECT netWorthINTO presNetWorthFROM Studio, MovieExecWHERE = studioName AND presC# = cert#;RETURN(presNetWorth);END;b)CREATE FUNCTION status(person CHAR(30), addr CHAR(255)) RETURNS INTEGERDECLARE isStar INT;DECLARE isExec INT;BEGINSELECT COUNT(*)INTO isStarFROM MovieStarWHERE = person AND MovieStar.address = addr;SELECT COUNT(*)INTO isExecFROM MovieExecWHERE = person AND MovieExec.address = addr;IF isStar + isExec = 0 THEN RETURN(4) ELSE RETURN(isStar +2*isExec)END IF;END;c)CREATE PROCEDURE twoLongest(IN studio CHAR(15),OUT longest VARCHAR(255),OUT second VARCHAR(255))DECLARE t VARCHAR(255);DECLARE i INT;DECLARE Not_Found CONDITION FOR SQLSTATE = '02000';DECLARE MovieCursor CURSOR FORSELECT title FROM Movies WHERE studioName = studioORDER BY length DESC;BEGINSET longest = NULL;SET second = NULL;OPEN MovieCursor;SET i = 0;mainLoop: WHILE (i < 2) DOFETCH MovieCursor INTO t;IF Not_Found THEN LEAVE mainLoop END IF;SET i = i + 1;END WHILE;CLOSE MovieCursor;END;d)CREATE PROCEDURE earliest120mMovie(IN star CHAR(30),OUT earliestYear INT)DECLARE Not_Found CONDITION FOR SQLSTATE = '02000'; DECLARE MovieCursor CURSOR FORSELECT MIN(year) FROM MoviesWHERE length > 120 ANDtitle IN (SELECT movieTitle FROM StarsInWHERE starName = star);BEGINSET earliestYear = 0;OPEN MovieCursor;FETCH MovieCursor INTO earliestYear;CLOSE MovieCursor;END;e)CREATE PROCEDURE uniqueStar(IN addr CHAR(255),OUT star CHAR(30))BEGINSET star = NULL;IF 1 = (SELECT COUNT(*) FROM MovieStar WHERE address = addr) THENSELECT name INTO star FROM MovieStar WHERE address = addr; END;f)CREATE PROCEDURE removeStar(IN star CHAR(30))BEGINDELETE FROM Movies WHERE title IN(SELECT movieTitle FROM StarsIn WHERE starName = star); DELETE FROM StarsIn WHERE starName = star;DELETE FROM MovieStar WHERE name = star;END;9.4.2a)CREATE FUNCTION closestMatchPC(targetPrice INT) RETURNS CHAR DECLARE closestModel CHAR(4);DECLARE diffSq INT;DECLARE currSq INT;DECLARE m CHAR(4);DECLARE p INT;DECLARE Not_Found CONDITION FOR SQLSTATE '02000'; DECLARE PCCursor CURSOR FORSELECT model, price FROM PC;BEGINSET closestModel = NULL;SET diffSq = -1;OPEN PCCursor;mainLoop: LOOPFETCH PCCursor INTO m, p;IF Not_Found THEN LEAVE mainLoop END IF;SET currSq = (p - targetPrice)*(p - targetPrice);IF diffSq = -1 OR diffSq > currSqTHEN BEGINSET closestModel = m;SET diffSq = currSq;END IF;END LOOP;CLOSE PDCursor;RETURN(closestModel);END;b)CREATE FUNCTION getPrice(imaker CHAR(1), imodel CHAR(4))RETURNS INTEGERDECLARE ptype VARCHAR(10);DECLARE pprice INT;DECLARE Not_Found CONDITION FOR SQLSTATE '02000';BEGINSELECT type INTO ptype FROM ProductWHERE maker = imaker AND model = imodel;IF ptype =‘ pc’ THENSELECT price INTO pprice FROM PCWHERE model = imodel;ELSE IF ptype =‘ laptop’ THENSELECT price INTO pprice FROM LaptopWHERE model = imodel;ELSE IF ptype =‘ printer’ THENSELECT price INTO pprice FROM PrinterWHERE model = imodel;ELSEpprice = NULL;END IF;RETURN (pprice);END;c)CREATE PROCEDURE addPC(IN imodel INT,IN ispeed DECIMAL(3,2),IN iram INT,IN ihd INT,IN iprice INT)DECLARE Already_Exist CONDITION FOR SQLSTATE '02300';BEGININSERT INTO PC VALUES(imodel, ispeed, iram, ihd, iprice); WHILE (Already_Exist) DOSET imodel = imodel + 1;INSERT INTO PC VALUES(imodel, ispeed, iram, ihd, iprice); END WHILE;END;d)CREATE PROCEDURE getNumOfHigherPrice(IN iprice INT,OUT NumOfPCs INT,OUT NumOfLaptops INT,OUT NumOfPrinters INT)BEGINSET NumOfPCs = 0;SET NumOfLaptops = 0;SET NumOfPrinters = 0;SELECT COUNT(*) INTO NumOfPCs FROM PCWHERE price > iprice;SELECT COUNT(*) INTO NumOfLaptops FROM Laptop WHERE price > iprice;SELECT COUNT(*) INTO NumOfPrinters FROM PrinterWHERE price > iprice;END;9.4.3a)CREATE FUNCTION getFirepower(iclass VARCHAR(10)) RETURNS INTEGER DECLARE firepower INT;DECLARE nguns INT;DECLARE nbore INT;BEGINSELECT numGuns, bore INTO nguns, nbore FROM ClassesWHERE class = iclass;SET firepower = nguns * (nbore * nbore * nbore);RETURN(firepower);END;b)CREATE PROCEDURE twoCountriesInBattle(IN ibattle VARCHAR(20),OUT firstCountry VARCHAR(20),OUT secondCountry VARCHAR(20))DECLARE i INT;DECLARE ocountry VARCHAR(20);DECLARE classCursor CURSOR FORSELECT country FROM ClassesWHERE class IN(SELECT class FROM ShipsWHERE name IN(SELECT ship FROM OutcomesWHERE battle = ibattle));BEGINSET firstCountry = NULL;SET secondCountry = NULL;SET i = 0;IF 2 = (SELECT COUNT(*) count FROM ClassesWHERE class IN(SELECT class FROM ShipsWHERE name IN(SELECT ship FROM OutcomesWHERE battle = ibattle)))THENOPEN classCursor;WHILE (i < 2) DOFETCH classCursor INTO ocountry;IF (i = 0) THENSET firstCountry = ocountry;ELSESET secoundCountry = ocountry;END IF;END WHILE;END IF;CLOSE calssCursor;END;c)CREATE PROCEDURE addClass(IN iship VARCHAR(20),IN iclass VARCHAR(20),IN itype CHAR(2),IN icountry VARCHAR(20),IN inumGuns INT,IN ibore INT,IN idisplacement INT)BEGININSERT INTO Classes VALUES(iclass, itype, icountry,inumGuns, ibore, idisplacement); INSERT INTO Ships VALUES(iship, iclass, NULL);END;d)CREATE PROCEDURE checkLaunched(IN ship VARCHAR(20))DECLARE bname VARCHAR(20);BEGINIF EXIST (SELECT INTO bnameFROM Battles b, Outcomes o, Ships sWHERE = o.battle ANDo.ship = ANDYEAR(b.date) < unched)THENUPDATE Ships SET launced = 0 WHERE name = iship;UPDATE Battles SET date = 0 WHERE name = bname; END IF;END9.4.49.5.1a)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLCHAR manf, tempModel[4];SQLFLOAT tempSpeed;SQLINTEGER tempPrice;SQLINTEGER colInfo;Int targetPrice;char modelOfClosest[4];float speedOfClosest;int priceOfClosest;/* ask user for target price and read the answer into variabletargetPrice*/errCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv);if(errCode1) {printf( ” Error for SQL_HANDLE_ENV. n” );exit(1);}errCode2 = SQLAllocHandle(SQL_HANDLE_DBC, myEnv, &myCon);if(errCode2) {printf( ” Error for SQL_ HANDLE_DBC. n” );exit(1);}errCode3 = SQLAllocHandle(SQL_HANDLE_STMT, myCon, &execStat);if(errCode3) {printf( ” Error for SQL_ HANDLE_STMT. n” );exit(1);}SQLExecDirect(execStat, “ SELECT model, price, speed FROM PC ” , SQL_NTS);SQLBindCol(execStat, 1, SQL_CHAR, tempModel,sizeof(tempModel), &colInfo);SQLBindCol(execStat, 2, SQL_INTEGER, tempPrice,sizeof(tempPrice), &colInfo);SQLBindCol(execStat, 3, SQL_FLOAT, tempSpeed,sizeof(tempSpeed), &colInfo);priceOfClosest = NULL;while(SQLFetch(execStat) != SQL_NO_DATA) {if( /* the 1st fetch or tempPrice closer to targetPrice */modelOfClosest = tempModel;priceOfClosest = tempPrice;speedOfClosest = tempSpeed;}}/* Now, modelOfClosest is the model whose price is closest totarget. We must get its manufacturer with a single-row select*/if (priceOfClosest == NULL ) /* no data fetched *//* print error message and exit */SQLPrepare (execStat,“ SELECT maker FROM Product WHERE model = ? ” , SQL_NTS); SQLBindParameter(execStat, 1,⋯,modelOfClosest,⋯);SQLExecute(execStat);SQLBindCol(execStat, 1, SQLCHAR, &manf, sizeof(manf), &colInfo);/* print manf */b)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLCHAR model[4], maker;SQLFLOAT minSpeed;SQLINTEGER minRam, minHd, minScreen;SQLFLOAT speed;SQLINTEGER ram, hd, screen;SQLINTEGER colInfo;/* ask user for minimum speed, ram, hd size, and screen size */errCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv);if(errCode1) {printf( ” Error for SQL_HANDLE_ENV. n” );exit(1);}errCode2 = SQLAllocHandle(SQL_HANDLE_DBC, myEnv, &myCon);if(errCode2) {printf( ” Error for SQL_ HANDLE_DBC. n” );exit(1);}errCode3 = SQLAllocHandle(SQL_HANDLE_STMT, myCon, &execStat);if(errCode3) {printf( ” Error for SQL_ HANDLE_STMT. n” );exit(1);}SQLPrepare(execStat,“ SELECT model, speed, ram, hd, screen, price, maker“ FROM Laptop l, Product p”||“ WHERE speed >= ? AND ” ||“ ram >= ? AND”||“ hd >= ? AND”||“ screen >= ? AND”||“ l.model = p.model”,”||SQL_NTS);SQLBindParameter(execStat, 1, SQL_FLOAT, ⋯ , minSpeed, ⋯ ); SQLBindParameter (execStat, 2, SQL_INTEGER, ⋯ , minRam, ⋯ );SQLBindParameter (execStat, 3, SQL_ SQLBindParameter (execStat, 4, SQL_ INTEGER,INTEGER,⋯ , minHd, ⋯ );⋯ , minScreen, ⋯ );SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, model, sizeof(model), &colInfo); SQLBindCol(execStat, 2, SQL_FLOAT, speed,sizeof(speed), &colInfo);SQLBindCol(execStat, 3, SQL_INTEGER, ram,sizeof(ram), &colInfo);SQLBindCol(execStat, 4, SQL_INTEGER, hd,sizeof(hd), &colInfo);SQLBindCol(execStat, 5, SQL_INTEGER, screen,sizeof(screen), &colInfo);SQLBindCol(execStat, 6, SQL_INTEGER, price,sizeof(price), &colInfo);SQLBindCol(execStat, 7, SQL_CHAR, maker,sizeof(maker), &colInfo);while(SQLFetch(execStat) != SQL_NO_DATA) {if( FOUND )/* print fetched info */}c)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLCHAR maker, model[4], type[10], color[6];SQLFLOAT speed;SQLINTEGER ram, hd, screen, price;SQLINTEGER colInfo;/* ask user for minimum speed, ram, hd size, and screen size */errCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv); if(errCode1) {printf( ” Error for SQL_HANDLE_ENV. n” );exit(1);}errCode2 = SQLAllocHandle(SQL_HANDLE_DBC, myEnv, &myCon);if(errCode2) {printf( ” Error for SQL_ HANDLE_DBC.n” );exit(1);}errCode3 = SQLAllocHandle(SQL_HANDLE_STMT, myCon, &execStat);if(errCode3) {printf( ” Error for SQL_ HANDLE_STMT.n” );exit(1);}/* get PCs made by the manufacturer */SQLPrepare(execStat,“ SELECT * FROM PC WHERE model IN ( ” ||“ SELECT model FROM Product ” ||“ WHERE maker = ? AND ” ||“ type = ‘ pc’”, SQL_NTS);SQLBindParameter(execStat, 1, SQL_CHAR,⋯, maker,⋯); SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, model, sizeof(model), &colInfo); SQLBindCol(execStat, 2, SQL_FLOAT, speed,sizeof(speed), &colInfo);SQLBindCol(execStat, 3, SQL_INTEGER, ram,sizeof(ram), &colInfo);SQLBindCol(execStat, 4, SQL_INTEGER, hd,sizeof(hd), &colInfo);SQLBindCol(execStat, 5, SQL_INTEGER, price,sizeof(price), &colInfo);while(SQLFetch(execStat) != SQL_NO_DATA) {if( FOUND )/* print fetched info */}/* get Laptops made by the manufacturer */SQLPrepare(execStat,“ SELECT * FROM Laptop WHERE model IN ( ” ||“ SELECT model FROM Product ” ||“ WHERE maker = ? AND ” ||“ type = ‘ laptop ’”, SQL_NTS);SQLBindParameter(execStat, 1, SQL_CHAR,⋯, maker,⋯); SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, model, sizeof(model), &colInfo);SQLBindCol(execStat, 2, SQL_FLOAT, speed,sizeof(speed), &colInfo);SQLBindCol(execStat, 3, SQL_INTEGER, ram,sizeof(ram), &colInfo);SQLBindCol(execStat, 4, SQL_INTEGER, hd,sizeof(hd), &colInfo);SQLBindCol(execStat, 5, SQL_INTEGER, screen,sizeof(screen), &colInfo);SQLBindCol(execStat, 6, SQL_INTEGER, price,sizeof(price), &colInfo);while(SQLFetch(execStat) != SQL_NO_DATA) {if( FOUND )/* print fetched info */}/* get Printers made by the manufacturer */SQLPrepare(execStat,“ SELECT * FROM Printer WHERE model IN (”||“ SELECT model FROM Product”||“ WHERE maker = ? AND ” ||“ type =‘printer’”,SQL_NTS);SQLBindPara meter(execStat, 1, SQL_CHAR,⋯, maker,⋯);SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, model, sizeof(model), &colInfo);SQLBindCol(execStat, 2, SQL_CHAR, color, sizeof(color), $colInfo);SQLBindCol(execStat, 3, SQL_CHAR, type, sizeof(type), $colInfo);SQLBindCol(execStat, 4, SQL_INTEGER, price, sizeof(price), &colInfo);d)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLINTEGER total_budget, rest_budget, pc_price, printer_price;SQLCHAR pc_model[4], printer_model[4], color[6];SQLFLOAT min_speed;errCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv);if(errCode1) {printf( ” Error for SQL_HANDLE_ENV.n” );exit(1);}errCode2 = SQLAllocHandle(SQL_HANDLE_DBC, myEnv, &myCon);if(errCode2) {printf( ” Error for SQL_ HANDLE_DBC.n” );exit(1);}errCode3 = SQLAllocHandle(SQL_HANDLE_STMT, myCon, &execStat);if(errCode3) {printf( ” Error for SQL_ HANDLE_STMT. n” );exit(1);}SQLPrepare(execStat,“SELECT model, price FROM PCWHERE speed >= ? AND price <= ? ORDERBY price ”,SQL_NTS);/* ask user for budget & the minimum speed of pc *//* get the cheapest PC of the minimum speed */SQLBindParameter(execStat, 1, SQL_FLOAT , ⋯ ,min_speed , ⋯ ); SQLBindParameter(execStat, 2, SQL_INTEGER, ⋯ , total_budget, ⋯ );SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, pc_model, sizeof(pc_model),&colInfo);SQLBindCol(execStat, 2, SQL_INGETER, pc_price,sizeof(pc_price),&colInfo);SQLFetch(execStat);if (NOT_FOUND) {p rintf(“no pc found within the budget n” );}else {p rintf( “ pc model: %s n” , pc_model);}/* get Printer within the budget */–pc_price;rest_budget = total_budgetcolor =“true”;SQLPrepare(execStat,“SELECT model, price FROM PrinterWHERE price <= ? AND color = ?ORDER BY price ” , SQL_NTS);SQLBindParameter(execStat, 1, SQL_INTEGER , ⋯ , rest_budget , ⋯ ); SQLBindParameter(execStat, 2, SQL_CHAR, ⋯ , color , ⋯ );SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, print_model,sizeof(print_model),&colInfo);SQLBindCol(execStat, 2, SQL_INGETER, print_price,sizeof(print_price),&colInfo);SQLFetch(execStat);if(NOT_FOUND) {color =“false”;SQLBindParameter(execStat, 1, SQL_INTEGER,⋯, rest_budget,⋯);SQLBindParameter(execStat, 2, SQL_CHAR,⋯, color,⋯);SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_CHAR, print_model,sizeof(print_model),&colInfo);SQLBindCol(execStat, 2, SQL_INGETER, print_price,sizeof(print_price),&colInfo);SQLFetch(execStat);if(NOT_FOUND)printf( “ no printer found within the budget n” );elseprintf( “ printer model: %s n” , printer_model);}elseprintf( “ printer model: %s n” , printer_model);}e)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLCHAR pmodel[4], pmaker, ptype[6];SQLFLOAT pspeed;SQLINTEGER pram, phd, pscreen, pprice, count;SQLINTEGER colInfo;/* ask user for minimum speed, ram, hd size, and screen size */errCode1 = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &myEnv);if(errCode1) {printf( ” Error for SQL_HANDLE_ENV.n” );exit(1);}errCode2 = SQLAllocHandle(SQL_HANDLE_DBC, myEnv, &myCon);if(errCode2) {printf( ” Error for n” );exit(1);}errCode3 = SQLAllocHandle(SQL_HANDLE_STMT, myCon, &execStat);if(errCode3) {printf( ” Error for SQL_ HANDLE_STMT. n” );exit(1);}/* ask user for manufacturer, model, speed, RAM, hard-disk, *//* & price of a new PC */SQLPrepare(execStat,“ SELECT COUNT(*) FROM PC WHERE model = ?”, SQL_NTS);SQLBindParameter(execStat, 1, SQL_CHAR,⋯, pmodel,⋯);SQLExecute(execStat);SQLBindCol(execStat, 1, SQL_INTEGER, count, sizeof(count), &colInfo);SQLFetch(execStat);if (count >0){ Printf( “ Warnning: The PC model already exists n” ); }else {” , SQLPrepare(execStat,“ INSERT INTO Product VALUES(?, ?, ?)SQL_NTS);SQLBindParame ter(execStat, 1, SQL_CHAR,⋯, pmaker,⋯);SQLBindParameter(execStat, 2, SQL_CHAR,⋯, pmodel,⋯);SQLBindParameter(execStat, 3, SQL_CHAR,⋯, ptype,⋯); SQLExecute(execStat);” , SQLPrepare(execStat,“ INSERT INTO PC VALUES(?, ?, ?, ?, ?)SQL_NTS);SQLBindParameter(execStat, 1, SQL_CHAR,⋯, pmodel,⋯);SQLBindParameter(execStat, 2, SQL_FLOAT,⋯, pspeed,⋯);SQLBindParameter(execStat, 3, SQL_INTEGER,⋯, pram,⋯); SQLBindParameter(e xecStat, 4, SQL_INTEGER,⋯, phd,⋯);SQLBindParameter(execStat, 5, SQL_INTEGER,⋯, pprice,⋯); SQLExecute(execStat);}9.5.2a)#include sqlcli.hSQLHENV myEnv;SQLHDBC mycon;SQLHSTMT execStat;SQLRETURN errCode1, errCode2, errCode3;SQLCHAR cclass[20], maxFirepowerClass[20];SQLFLOAT firepower, maxFirepower;SQLINTEGER cnumGuns, cbore;。

实验九-参考答案

实验九-参考答案

实验九参考答案1.写出下列SQL命令(1) Sele * from jsqk where "教授"$zc and xbbh=(sele xbbh from xb where xbmc="计算机")(2) Sele xm from jsqk where jsbh=any(sele jsbh from gz where jcgz<=1000)(3) Sele xm from jsqk where jsbh not in (sele jsbh from kyqk)(4) Sele xbmc from xb where xbbh not in (sele xbbh from jsqk,kyqk where kyqk.jsbh=jsqk.jsbh)(5) Sele sum(jcgz) from gz(6)按系部分组统计各系部科研成果数量,并按各系部数量降序排序,只输出排序第一的系部编号和数量。

Sele Top 1 xbbh ,count(cgmc) 数量from jsqk,kyqk;where jsqk.jsbh=kyqk.jsbh group by xbbh Order By 数量Desc(7)Sele xbbh,count(jsqk.jsbh) from jsqk,gz where jsqk.jsbh=gz.jsbh and jcgz>=2000 group by xbbh(8) Sele xbbh,sum(jcgz+zwbt+zjjt) from jsqk,gz where jsqk.jsbh=gz.jsbh group by xbbh2.利用实验八中所建立的xsgl数据库,使用SQL_Select完成下列查询:(1)查询系号为"d01"的男学生信息select * from student where dno="d01" and sex="男"(2)查询所有学生某门课(如"C001")的成绩,并按成绩由高到低的顺序输出sele sname,grade from student,sc where student.sno=sc.sno and cno="c001" order by grade desc若不显示姓名,则命令为:sele grade from sc where cno="c001" order by grade desc(3)查询79、80两年出生的女同学的名单sele sname from student where sex="女" and birthday between {^1979/01/01} and {^1980/12/31}(4)查询“计算机基础”课不及格的学生名单(输出学生的学号、姓名及成绩)Sele sno,sname,grade from student,sc where student.sno=sc.sno and ;sno=(sele sno from course where cname=”计算机基础”) and grade<60(5)查询同时选修了"C001"和"C002"的学生的学号Sele a.sno from sc a, sc b where a.sno=b.sno;And o="C001" and o="C002"(6)查询选修了"C001"、但没有选修"C002"的学生的学号Sele sno from sc where ;Sno in (Sele sno from sc where cno="C001" ) and ;Sno not in (Sele sno from sc where cno="C002")(7)查询至少选修了"C001"和"C002"中一门课的学生Sele sno from sc where cno="C001" union ;Sele sno from sc where cno="C002"或者Sele dist sno from sc where ;Sno in (Sele sno from sc where cno="C001" ) or ;Sno in (Sele sno from sc where cno="C002")(8)求女学生的学生总数sele count(sno) from student where sex="女"(9)查询有多少名同学计算机基础课不及格Sele count(*) from sc where ;cno=(sele cno from course where cname=”计算机基础”) and grade<60 (10)求每个系的学生数而不是求学生总数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(1) 设置一个触发器,该触发器仅允许“dbo”用户可以删除Employee表内数据,否则出错。

create trigger EmploteeDelete on employeefor deleteasif exists (select * from deleted)beginif user!='dbo'rollbackend(2) 在OrderMaster表中创建触发器,插入数据时要先检查Employee表中是否存在同样值的业务员编号,如果不存在则不允许插入。

create trigger insOrderMasteron OrderMasterfor insertasbeginif exists(select*from insertedwhere salerNo not in(select employeeNofrom Employee))rollback;end(3) 级联更新:当更新Customer表中customerNo列的值时,同时更新OrderMaster表中的customerNo列的值,并且一次只能更新一行。

create trigger uptCustomeron Customerfor updateasdeclare @oldCustomerNo char(9),@newCustomerNo char(9)if(select count(*)from inserted)>1rollbackelsebeginif update(customerNo)beginselect @oldCustomerNo=customerNo from deletedselect @newCustomerNo=customerNo from insertedupdate OrderMaster set customerNo=@newCustomerNowhere customerNo=@oldCustomerNoendend(4) 对Product表写一个UPDATE触发器。

当更新“主板”类的商品时,其单价不得高于原价格的10% create trigger uptProducton Productfor updateasbegindeclare @oldPrice numeric(7,2),@newPrice numeric(7,2)if update(productPrice)begindeclare myCur cursor forselect a.productPrice,b.productPricefrom inserted a,deleted bwhere a.productNo=b.productNo and b.productClass='主板' open myCurfetch myCur into @newPrice,@oldPricewhile(@@fetch_status=0)beginif @newPrice>@oldPrice+@oldPrice*0.1rollbackfetch myCur into @newPrice,@oldPriceendclose myCurdeallocate myCurendend(5) 保证商品的销售单价必须在成本价的正负10%之内插入触发器create trigger insOrderDetailon OrderDetailfor insertasbegindeclare @productNo char(9),@price numeric(7,2)declare @productPrice numeric(7,2),@orderNo char(12)declare myCur cursor forselect orderNo,b.productNo,price,productPricefrom Product a,inserted bwhere a.productNo=b.productNoopen myCurfetch myCur into @orderNo,@productNo,@price,@productPrice while(@@fetch_status=0)beginif(@price>@productPrice+@productPrice*0.1 or@price<@productPrice-@productPrice*0.1)delete from OrderDetailwhere orderNo=@orderNo and productNo=@productNo fetch myCur into @orderNo,@productNo,@price,@productPrice endclose myCurdeallocate myCurend更新触发器create trigger uptOrderDetailon OrderDetailfor updateasbegindeclare @productNo char(9),@oldPrice numeric(7,2)declare @newPrice numeric(7,2)declare @productPrice numeric(7,2),@orderNo char(12)if update(price)begindeclare myCur cursor forselect b.orderNo,b.productNo,b.price,c.price,productPricefrom Product a,inserted b,deleted cwhere a.productNo=b.productNo and a.productNo=c.productNo and b.orderNo=c.orderNoopen myCurfetch myCur into@orderNo,@productNo,@newPrice,@oldPrice,@productPrice while(@@fetch_status=0)beginif(@newPrice>@productPrice+@productPrice*0.1 or@newPrice<@productPrice-@productPrice*0.1)update OrderDetail set price=@oldPricewhere orderNo=@orderNo and productNo=@productNo fetch myCur into@orderNo,@productNo,@newPrice,@oldPrice,@productPrice endclose myCurdeallocate myCurendend(6) 保证员工编码的第2~5位与员工的雇佣日期的年份一致。

插入触发器create trigger insEmploteeon employeefor insertasbegindeclare @employeeNo char(8),@hireDate datetimedeclare @subEmployeeNo char(4)declare myCur cursor forselect employeeNo,hireDatefrom insertedopen myCurfetch myCur into @employeeNo,@hireDatewhile(@@fetch_status=0)beginset @subEmployeeNo=substring(@employeeNo,2,4)if(@subEmployeeNo <>convert(char(4),@hireDate,120))delete from Employeewhere employeeNo=@employeeNofetch myCur into @employeeNo,@hireDateendclose myCurdeallocate myCurend更新触发器create trigger uptEmploteeon employeefor updateasbegindeclare @employeeNo char(8),@hireDate datetimedeclare @subEmployeeNo char(4)if (update(employeeNo)or update(hireDate))begindeclare myCur cursor forselect employeeNo,hireDatefrom insertedopen myCurfetch myCur into @employeeNo,@hireDatewhile(@@fetch_status=0)beginset @subEmployeeNo=substring(@employeeNo,2,4)if(@subEmployeeNo <>convert(char(4),@hireDate,120))rollbackfetch myCur into @employeeNo,@hireDateendclose myCurdeallocate myCurendend。

相关文档
最新文档