数据库原理与实践教材练习题答案.doc
第一章一、单项选择题DBDCD ABBCC CADAD二、填空题1、文件系统2、层次模型的IMS系统,网状模型的DBTG报告,E.F.Codd3、数据的完整性,并发控制4、操作系统,数据库管理系统5、内三、简答题1、数据处理是指信息的收集、管理、加工、传播等一系列活动的总和。数据管理是指对数据进行分类、组织、编码、存储、检索和维护。数据管理是数据处理的基本环节,是任何数据处理业务中必不可少的共有部分,是数据处理的中心问题。2、数据库技术的特点:(1)数据整体结构化,数据的共享性高,冗余度小;(2)程序与数据之间的独立性高;(3)数据得到统一管理和控制。数据的整体结构化是数据库技术的主要特征之一,也是数据库系统与文件系统的根本区别。文件系统是数据库技术的基础,因为数据库技术中对数据库的读写操作最终还是通过文件系统去实现的。3、尽管有各种各样的信息系统,但它们的主要功能都是进行信息处理(即数据处理),而数据处理都涉及到数据的管理问题。如果数据的管理由各个信息系统自己去实现,不但耗时耗钱,而且系统的稳定性、可靠性、安全性、响应时间都不能得到保证。因为数据管理软件的编写是一项专业性很强的工作,不是一般的程序员可以胜任的。采用数据库技术后,数据的管理就由DBMS去完成,而DBMS是专业公司开发的,系统的稳定性、可靠性、安全性、响应时间都有保证,而且缩短了系统的开发时间,节约了成本。4、数据库系统是引入了数据库技术后的计算机系统,一般由数据库、数据库管理系统(及其开发工具)、数据库应用系统、数据库管理员(DBA)构成。DBA是数据库系统中最重要的一类人员。具体职责包括:(1)决定数据库中的信息内容和结构;(2)决定数据库的存储结构和存取策略;(3)定义数据的安全性要求和完整性约束条件;(4)监控数据库的使用和运行;(5)数据库的改进和重组。5、目前最常见的商用DBMS有:Oracle、DB2、SQL Server、MySQL等。DBMS一般有六大功能:(1)数据定义功能;(2)数据组织、存储和管理;(3)数据操纵功能;(4)数据库的运行管理和事务管理;(5)数据库的建立和维护功能。6、模式是数据库中全体数据的逻辑结构和特征的描述,是全体用户数据的最小并集。数据库模式以某一种数据模型为基础,综合考虑了所有用户的需求,并将这些需求有机地结合成一个逻辑整体。一个数据库只有一个模式。外模式是用户的数据视图,是用户可看见和使用的局部数据逻辑结构和特征的描述,是与某一具体应用有关的数据的逻辑表示。显然,外模式是模式的子集,且可以有多个。内模式是数据库中数据的物理结构和存储方法的描述,是数据在数据库内部的表示方式。内模式负责定义所有数据的物理存储策略和访问控制方法。一个数据库只有一个内模式。7、数据库系统采用外模式、模式、内模式三级模式结构,三级模式是对数据的三个抽象级别,它把数据的具体组织留给DBMS管理,使用户能逻辑地抽象地处理数据,而不必关心数据在计算机中的具体表示方式和存储方式,不必考虑存取路径等细节。DBMS在这三级模式之间提供了两层映像:外模式/模式映像、模式/内模式映像。正是这两层映像保证了数据库系统中的数据具有较高的逻辑独立性和物理独立性。另外,外模式是数据库安全性的一个有力措施,模式实现了数据的共享,减少了数据的冗余。8、程序与数据的逻辑独立性是指当模式改变时,可由数据库管理员改变外模式模式映像,使得每个外模式保持不变,而应用程序是根据外模式编写的,从而不必修改应用程序。程序与数据的物理独立性是指当内模式改变时,可由数据库管理员改变模式/内模式映像,使得模式保持不变(外模式当然也不变),从而不必修改应用程序。第二章一、单项选择题BDACA BDCBB ABDAB DBDAD二、填空题1、模拟现实世界2、数据结构3、逻辑模型4、实体5、多对多6、网状模型,面向对象模型7、指针8、关系9、候选码10、实体完整性,参照完整性三、简答题1、概念模型具有较强的语义表达能力,能够方便、直接地表达应用所涉及到的现实世界中的各种语义知识,另一方面它概念简单、清晰,易于用户理解,且不依赖于具体的计算机系统。概念模型主要用于数据库设计,是用户与数据库设计人员之间进行交流的桥梁。2、表示概念模型最常用的方法是用E-R图来表示概念模型,这种概念模型也称E-R模型。画E-R图的步骤:(1)确定实体;(2)确定各实体的属性;(3)确定实体之间的联系;(4)确定各联系的属性。3、非关系模型中实体之间的联系是通过指针来实现的,因此查询效率较高。缺点是数据结构复杂,不易理解,编程也复杂。关系模型的优点是:有严格的理论基础,概念单一;数据结构简单、清晰、用户易理解;存取路径对用户透明,程序与数据的独立性高,易于应用程序的编写和维护。缺点主要是查询效率不如非关系模型,DBMS的开发难度高。4、在关系模型中的概念单一主要体现在数据结构单一(即现实世界中实体以及实体之间的各种联系都用关系来表示),而数据结构单一又带来操作符的统一。操作符的统一体现在无论是插入(或删除修改)一个实体值还是插入(或删除修改)一个联系值,操作的命令是相同的(不像DBTG中用STORE插入实体值,用CONNECT插入联系值),这大大方便了用户的使用。5、所谓存储路径对用户透明就是指用户不需要知道数据的物理结构和存储方式。优点:因为存取路径对用户透明,从而具有更高的数据独立性,更好的安全保密性,简化了程序员的工作。缺点:因为存取路径对用户透明,导致查询效率不如非关系系统,增加了开发DBMS的难度。6、关系模型中有三类完整性约束,包括实体完整性、参照完整性和用户定义的完整性。其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性,应该由关系数据库系统自动支持。实体完整性规则:若属性A是基本关系R主码中的属性,则属性A不能取“空值”。参照完整性规则:若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码Ks相对应(R和S可以是同一个关系),则对于R中每个元组在F上的值必须等于S中某个元组的主码值或者取空值(F的每个属性值均为空值)。用户定义的完整性是针对某一具体的关系数据库的约束条件,它反映了某一具体应用所涉及的数据必须满足的语义要求。7、外码不是一定可以取空值的。当外码是本关系主码中的属性时,外码不能取空值,如果取空值将违反实体完整性规则。例如,选修关系中的外码“学号”和“课程号”就不能取空值。所以只有当外码不是本关系主码中的属性时,外码才可以取空值。8、用户只要告诉系统操作的要求,不必告诉系统如何来完成该操作(即用户只要告诉系统“做什么”,而不必告诉“怎么做”)的语言就是非过程化语言。9、自然连接是一种特殊的等值连接,它与等值连接的区别表现在:被连接的两个关系中进行相等比较的分量必须是相同的属性(组),并且要在结果中把重复的属性(组)去掉。10、例如,如果要实现查询要求“查询所有学生信息并同时查询他的选课信息”,这时就要做学生关系与选修关系的自然连接,如果有学生还没有选修过课程,那么该学生信息将会在结果关系中消失,不符合查询要求,这时就要用到左外连接。四、关系代数1、Gnane, Price(Manufac='海尔' (Goods)2、Gnane, Price(Gtype='手机' Manufac='华为' (Goods)3、Cno(Customers) -Cno(Sells)4、Cno, Cname, Mphone(Customers) (Cno(Customers) -Cno(Sdate>='2015-01-01' (Sells) )5、Sno, Gno(Detail)÷Gno(Gno='140010123'Gno='150020234' (Goods) 也可以用自连接做6、Cno, Gno(Sells Detail)÷Gno(Gtype='奶粉' (Goods)7、gsum(Quantity) as 销售总数量(Detail Gno(Gname='WR700N无线路由器' Manufac='TP-LINK' (Goods) )8、Gtypegcount(Gno) as 品种数, avg(Price) as 平均价格(Goods)9、Gtype(平均价格>'1000' ( Gtypegavg(Price) as 平均价格(Goods) )10、Cno, Cname, Mphone, Sdate, IsPay(Customers Sells)第三章一、单项选择题DACDB ADADB BCBAB DCDAC二、填空题1、主数据,日志2、查询速度,13、1,主4、字符数据,二进制数据5、系统,系统,数据字典,系统6、用户,tempdb7、拒绝8、删除三、简答题1、数据定义语言(DDL)主要定义数据库的逻辑结构,包括定义基本表、索引和视图三个部分;数据操纵语言(DML)包括数据查询和数据更新两大类操作,其中数据更新又包括插入、删除和修改三种操作;数据控制语言(DCL)主要有对基本表和视图的授权,事务控制语句等。2、SQL语言的主要特点包括:(1)综合统一,即集DDL、DML和DCL功能于一体;(2)面向集合的操作方式,即操作的对象和操作的结果都是元组的集合;(3)高度非过程化,即在完成某项查询要求时,用户无需了解存取路径,只要提出“做什么”,不必指出“怎么做”;(4)以同一种语法结构提供两种使用方式,即独立地用于联机交互的使用方式和嵌入到高级语言中这两种不同的使用方式下,语法结构是基本上一致的;(5)支持三级模式结构。3、RDBMS的完整性控制机制都应有完整性定义、完整性检查和违约处理这三方面的功能。4、列级完整性约束条件中涉及的属性只能是本列中的属性,而表级完整性约束条件中涉及的属性可以是本表中所有列中的属性。5、SQL语言中,在用CREATE TABLE语句创建表时,可以用PRIMARY KEY定义主码,定义主码即实现了实体完整性;也可以用FOREIGN KEY REFERENCES定义外码,定义外码即实现了参照完整性。6、用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求。在SQL Server中可以在列级或表级用NOT NULL(属性取非空值)、UNIQUE(属性取值唯一)和CHECK(检查属性值是否满足一个逻辑表达式)三种形式实现用户定义的完整性。另外,T-SQL语言中的DEFAULT(属性取默认值)也可以理解为列级用户定义的完整性约束。7、三种处理方式:(1)拒绝(NO ACTION)执行,即不允许执行该操作,一般为默认违约处理方式。(2)级连(CASCADE)操作,表示当删除或修改被参照表的一个元组造成了参照表中某些元组的外码违反了参照完整性约束,则系统会自动删除或修改参照表中所有违反参照完整性约束的元组。(3)设置为空值(SET NULL),表示当删除或修改被参照表的一个元组造成了参照表中某些元组的外码违反了参照完整性约束,则系统会自动将参照表中所有违反参照完整性约束的元组的外码设置为空值。8、只有一种处理方式,拒绝(NO ACTION)执行,即不允许执行该操作。四、SQL语言1、 CREATE TABLE Customers ( Cnochar(8) PRIMARY KEY , Cnamechar(12) NOT NULL , Csexchar(2) NOT NULL CHECK ( Csex IN ('男','女') ) , Cagetinyint NOT NULL , Caddress varchar(50) , Mphonechar(11) NOT NULL , Email varchar(30) ) CREATE TABLE Goods ( Gnochar(9)PRIMARY KEY , Gnamechar(20) NOT NULL , Gtype char(8)NOT NULL , Price decimal(9,2) NOT NULL CHECK ( Price BETWEEN 1 AND 100000 ) , Manufac char(12) NOT NULL ) CREATE TABLE Sells ( Snochar(14)PRIMARY KEY , Sdatedatetime NOT NULL , Saddress varchar(50) NOT NULL , Cno char(8) NOT NULL FOREIGN KEY REFERENCES Customers(Cno) , IsPay char(1) NOT NULL CHECK ( IsPay IN ('N','Y') ) ) CREATE TABLE Detail ( Snochar(14) FOREIGN KEY REFERENCES Sells(Sno) , Gnochar(9) FOREIGN KEY REFERENCES Goods(Gno) , Quantity smallint NOT NULL CONSTRAINT ck_D CHECK ( Quantity BETWEEN 1 AND 100 ) , PRIMARY KEY ( Sno,Gno ) )2、ALTER TABLE Customers ADD CONSTRAINT ck1_C CHECK ( Cage >= 10 ) ALTER TABLE Customers ADD CONSTRAINT ck2_C UNIQUE ( Mphone )3、ALTER TABLE Detail DROP CONSTRAINT ck_D ALTER TABLE Detail ADD CONSTRAINT ck_D CHECK ( Quantity BETWEEN 1 AND 1000 )4、SELECT Gname, Price FROM Goods WHERE Manufac='海尔' ORDER BY Price DESC5、SELECT Gname, Price FROM Goods WHERE Manufac='华为' AND Gname LIKE '%手机%'6、SELECT COUNT(*) FROM Goods7、SELECT Gtype, COUNT(*), AVG(Price) FROM Goods GROUP BY Gtype8、SELECT Gtype FROM Goods GROUP BY Gtype HAVING AVG(Price)>10009、SELECT Sno, S.Cno, Cname, Mphone FROM Sells S JOIN Customers C ON S.Cno=C.Cno WHERE IsPay='N' AND Sdate BETWEEN '2015-05-01' AND '2015-05-31'10、SELECT C.Cno, Cname, Mphone, Sdate, IsPay FROM Customers C LEFT JOIN Sells S ON C.Cno=S.Cno11、SELECT S.Sno, Sdate, Cname, SUM(Quantity*Price) FROM Sells S, Customers C, Detail D, Goods G WHERE S.Cno=C.Cno AND S.Sno=D.Sno AND D.Gno=G.Gno GROUP BY S.Sno, Sdate, Cname12、SELECT SUM(Quantity) FROM Detail D JOIN Goods G ON D.Gno=G.Gno WHERE Manufac='TP-LINK' AND Gname='WR700N无线路由器' 另一种做法: SELECT SUM(Quantity) FROM Detail WHERE Gno IN (SELECT Gno FROM Goods WHERE Manufac='TP-LINK' AND Gname='WR700N无线路由器')13、SELECT Cno FROM Customers WHERE Cno NOT IN (SELECT Cno FROM Sells)14、SELECT Cno, Cname, Mphone FROM Customers WHERE Cno NOT IN (SELECT Cno FROM Sells WHERE Sdate>='2015-01-01')15、SELECT Gno, Gname, Manufac FROM Goods G WHERE Price = (SELECT MIN(Price) FROM Goods WHERE Gtype=G.Gtype)16、SELECT Gname, Price, Manufac FROM Goods WHERE Gno IN (SELECT Gno FROM Detail GROUP BY Gno HAVING SUM(Quantity)>=ALL(SELECT SUM(Quantity) FROM Detail GROUP BY Gno)17、SELECT Sno FROM Detail D WHERE Gno='140010123' AND EXISTS (SELECT * FROM Detail WHERE Sno=D.Sno AND Gno='150020234') 另一种做法: SELECT Sno FROM Detail WHERE Gno='140010123' OR Gno='150020234' GROUP BY Sno HAVING COUNT(*)=218、SELECT Cno FROM Customers C WHERE NOT EXISTS (SELECT * FROM Goods G WHERE Gtype='奶粉' AND NOT EXISTS (SELECT * FROM Sells S JOIN Detail D ON S.Sno=D.Sno WHERE S.Cno=C.Cno AND D.Gno=G.Gno)19、SELECT Gno, Gname, Manufac FROM Goods G, (SELECT Gtype, MIN(Price) AS MinPrice FROM Goods GROUP BY Gtype) AS GtypePrice WHERE G.Gtype=GtypePrice.Gtype AND Price=MinPrice20、UPDATE Goods SET Price=0.95*Price WHERE Gtype='手机'21、DELETE FROM Goods WHERE Gno='110050111'22、INSERT INTO Goods VALUES ('150050111', 'P8手机', '手机', 2499, '华为')第四章一、单项选择题ABADC ACCDB二、填空题1、搜索码,搜索码值2、有序3、稀疏,稠密,1,多4、249,165、CLUSTERED6、PRIMARY KEY,UNIQUE7、索引视图三、简答题1、模式DDL有CREATE TABLE语句,子模式DDL有CREATE VIEW语句,内模式DDL有CREATE INDEX语句。2、表中每个搜索码值都有一个索引项,这种索引称为稠密索引。当表按照搜索码值有序存储时,可以只为搜索码的某些值建立索引项,这种索引称为稀疏索引。稠密索引可以比稀疏索引更快地定位一条记录,但稠密索引所占用的存储空间比稀疏索引大。3、所谓聚集索引就是指表中的元组按照索引中搜索码指定的顺序排序,使得具有相同搜索码值的元组在物理上聚集在一起。显然,一张表最多只能有一个聚集索引。聚集索引往往是稀疏索引,可以只存储部分搜索码值。因为表中的元组是按聚集索引而不是辅助索引的搜索码有序存放的,所以辅助索引必须是稠密索引,对每个搜索码值都有一个索引项,包含指向表中每个元组的指针。显然,一张表可以创建多个辅助索引。4、如果索引小到可以放在内存中,那么搜索一个索引项的时间就可以忽略。但是,如果索引过大而不能放在内存中,那么当需要时,就必须从磁盘中读取索引块,于是搜索一个索引项可能需要多次读取磁盘块,是一个相当耗时的过程。所以不管是聚集索引,还是辅助索引,当索引项很多,索引很大时,实际使用的往往都是多级索引。 5、见教材4.1.2小节6、基本表在数据库中既要存放它的定义,又要存放它的数据。而视图是从一张或几张基本表(或视图)导出的表。与基本表不同,视图是一张虚表,在数据库中只存放视图的定义(即SELECT语句),不存放视图对应的数据(即SELECT语句的查询结果)。两者的联系是视图的数据在它对应的基本表中,所以基本表中的数据一旦发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,通过它用户可以看到数据库中自己感兴趣的数据及其变化。7、如果定义视图的子查询对下列条件都能满足,那么该视图是可以更新的:(1)FROM子句中只有一个数据库关系;(2)SELECT子句中只包含关系的属性名,不包含任何表达式、聚集函数或DISTINCT短语;(3)没有出现在SELECT子句中的属性可以取空值,也不是主码中的属性;(4)子查询中没有GROUP BY或HAVING子句。四、SQL语言1、CREATE INDEX Index_Customers_Cname ON Customers(Cname)2、CREATE INDEX Index_Goods_GtypePrice ON Goods(Gtype, Price)3、CREATE INDEX Index_Sells_CnoSdate ON Sells(Cno, Sdate DESC)4、CREATE VIEW GoodsPhone AS SELECT * FROM Goods WHERE Gtype='手机'5、CREATE VIEW GoodsPhoneHuaWei AS SELECT * FROM GoodsPhone WHERE Manufac='华为'6、CREATE VIEW SellsQuantity(Gname, Price, Manufac, Squantity) AS SELECT Gname, Price, Manufac, SUM(Quantity) FROM Goods G JOIN Detail D ON G.Gno=D.Gno GROUP BY G.Gno, Gname, Price, Manufac7、SELECT Gname, Price, Manufac FROM SellsQuantity WHERE Squantity = (SELECT MAX(Squantity) FROM SellsQuantity)8、CREATE VIEW SellsMoney(Sno, Sdate, Cname, Csex, Cage, Smoney) AS SELECT S.Sno, Sdate, Cname, Csex, Cage, SUM(Quantity*Price) FROM Sells S, Customers C, Detail D, Goods G WHERE S.Cno=C.Cno AND S.Sno=D.Sno AND D.Gno=G.Gno GROUP BY S.Sno, Sdate, Cname, Csex, Cage9、SELECT Cname, Csex, Cage FROM SellsMoney WHERE Sdate BETWEEN '2014-01-01' AND '2014-12-31' GROUP BY Cname, Csex, Cage HAVING SUM(Smoney)>1000010、INSERT INTO GoodsPhone VALUES ('150050111', 'P8手机', '手机', 2499, '华为')第五章一、单项选择题BADCB CABDD二、填空题1、网络系统2、合法权限检查机制3、自主,强制4、视图机制,审计,数据加密5、dbo,guest,dbo6、public7、数据库对象,操作类型8、Windows,混合三、简答题1、数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄漏、更改或破坏。数据库的完整性是指数据库的任何状态变化都能反映真实存在的客观世界的合理状态,数据库中的数据应始终保持正确且合理的状态。也就是说,数据库的完整性是指数据的正确性和相容性。两者的定义已经看出两者的区别,而两者的联系主要体现在触发器机制既可以用来实现完整性,也可以用来实现安全性。2、数据库安全性控制的常用方法和技术有:1、用户标识和鉴别;2、存取控制;3、视图机制;4、审计;5、数据加密。3、在SQL Server中,有登录名和数据库用户两个概念。登录名是验证用户是否有权限连接到SQL Server服务器,数据库用户是验证用户登录服务器后是否有对服务器上的某个数据库进行操作的权限。用户必须拥有和自己登录名对应的数据库用户才可以对某个数据库进行操作,这样增强了数据库的安全性,避免了一个用户在登录到服务器后可以对服务器上的所有数据库进行操作。DBA可以用CREATE LOGIN和DROP LOGIN创建和删除登录名,用CREATE USER和DROP USER创建和删除数据库用户。4、角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。可以为一组具有相同权限的数据库用户创建一个角色,所以也可以说角色是具有相同权限的数据库用户组。对一个角色授权或收回权限适用于该角色的所有成员,因此使用角色来管理权限可以简化授权的过程。5、DBA可以用CREATE ROLE和DROP ROLE创建和删除角色,用系统存储过程sp_addrolemember和sp_droprolemember为角色添加成员和从角色删除成员。6、固定角色是系统内置的(预先定义好的),用户不能添加、修改或删除固定角色,只能修改固定角色的成员。固定角色分为固定服务器角色和固定数据库角色两大类。固定服务器角色有八种,其成员是登录名;而固定数据库角色有十种,其成员是数据库用户。DBA可以用系统存储过程sp_addsrvrolemember为某个固定服务器角色添加成员,用sp_dropsrvrolemember从某个固定服务器角色中删除成员。DBA可以用系统存储过程sp_addrolemember为某个固定数据库角色添加成员,用sp_droprolemember从某个固定数据库角色中删除成员。第六章一、单项选择题DCBAC ACADB二、填空题1、GO2、-3、4、多语句表值型5、游标6、T-SQL7、sp_8、VARYING9、UPDATE10、DML三、简答题1、批是一起提交给SQL Server服务器执行的一个或多个T-SQL语句的集合。由于批中的语句是作为一个整体发送给SQL Server服务器进行语法分析、优化、编译和执行,所以大大提高了执行效率。批也常常被用在某些事必须在前面做,或者必须与其他事分开的脚本中。2、一条SET语句只能给一个变量赋值,而一条SELECT语句可以给多个变量赋值。另外,SELECT语句也可以把查询的结果存放到局部变量中保存起来。3、关闭游标意味着释放当前数据结果集,并解除定位于游标的行上的游标锁定;关闭游标并不释放它占用的数据结构以便重新打开,但在重新打开游标之前,不允许读取和定位修改。如果一个游标名或游标变量是最后引用游标的名称或变量,则释放游标后,游标使用的任何资源也随之释放。4、存储过程是一组实现某个特定功能的T-SQL语句的集合,经预编译后存储在服务器上的数据库中。存储过程可以避免代码的重复,隐藏SQL的细节,实现对业务逻辑的封装。存储过程既提高了执行效率,又减少了网络流量,降低了网络负载。另外,系统管理员可以通过对执行存储过程的权限进行限制,避免非授权用户对数据的访问,保证数据的安全性。5、触发器作为一种特殊类型的存储过程,不同于存储过程,触发器不能被显式地调用,当触发器所定义的触发事件发生时,触发器被触发而自动执行。触发器的主要作用是能够实现比参照完整性更为复杂的两张表或多张表之间的数据的完整性和一致性,从而保证表中数据的变化符合数据库设计者所确定的业务规则。触发器也可以用来实现数据库的安全性。四、SQL语言 INSERT INTO Customers VALUES('12345678','张永斌','男',35,'上海市',13612345678,'ybzhang') INSERT INTO Customers VALUES('12345680','李元祥','男',23,'上海市',13612345680,'yxli') INSERT INTO Customers VALUES('12345682','王雪旖','女',19,'苏州市',13612345682,'xywang') INSERT INTO Goods VALUES('140010123', '1.5匹变频空调', '空调', 2799, '海尔') INSERT INTO Goods VALUES('140050234', 'B199电信手机', '手机', 999, '华为') INSERT INTO Goods VALUES('150020234', '16G至尊高速TF卡 ', '存储卡', 39, '闪迪') INSERT INTO Goods VALUES('150050111', 'P8手机', '手机', 2499, '华为') INSERT INTO Sells VALUES('20140012345678','2014-10-01','上海市','12345678','N') INSERT INTO Sells VALUES('20140012345680','2014-11-11','上海市','12345680','Y') INSERT INTO Detail VALUES('20140012345678','140010123',3) INSERT INTO Detail VALUES('20140012345680','140050234',1) INSERT INTO Detail VALUES('20140012345680','150020234',2)1、 CREATE FUNCTION F_年销售总金额(年份 smallint = 2014) RETURNS real BEGIN DECLARE 总金额 real SELECT 总金额=SUM(Quantity*Price) FROM Sells S JOIN Detail D ON S.Sno=D.Sno JOIN Goods G ON D.Gno=G.Gno WHERE YEAR(Sdate)=年份 RETURN 总金额 END GO PRINT dbo.F_年销售总金额(DEFAULT) PRINT dbo.F_年销售总金额(2015)2、 CREATE FUNCTION F_年各月份销售总金额(年份 smallint = 2014) RETURNS TABLE RETURN ( SELECT 月份, SUM(Quantity*Price) 月销售总金额 FROM ( SELECT MONTH(Sdate) 月份, Quantity, Price FROM Sells S JOIN Detail D ON S.Sno=D.Sno JOIN Goods G ON D.Gno=G.Gno WHERE YEAR(Sdate)=年份 ) AS Temp GROUP BY 月份 ) GO SELECT * FROM dbo.F_年各月份销售总金额(DEFAULT) SELECT * FROM dbo.F_年各月份销售总金额(2015)3、 CREATE PROC P_年销售总金额 年份 smallint = 2014, 总金额 real OUTPUT AS IF 年份 IS NULL RETURN 2 IF NOT EXISTS (SELECT * FROM Sells WHERE YEAR(Sdate)=年份) RETURN 1 SELECT 总金额=SUM(Quantity*Price) FROM Sells S JOIN Detail D ON S.Sno=D.Sno JOIN Goods G ON D.Gno=G.Gno WHERE YEAR(Sdate)=年份 RETURN 0 GO下面是一个执行该自定义存储过程的示例: DECLARE 返回值 smallint, 总金额 real EXEC 返回值 = P_年销售总金额 DEFAULT, 总金额 OUTPUT IF 返回值 = 2 PRINT '必须提供年份 !' ELSE IF 返回值 = 1 PRINT '该年份没有销售记录 !' ELSE PRINT 总金额 G