1、. .1在安装 SQL Server 2000 时, “仅客户端工具” 、 “服务器和客户端工具”及“仅连接”等安装定义有什么差别?答: 仅客户端工具: 仅安装客户端关系数据库管理工具。此选项包含管理 SQL Server 的客户端工具和客户端连接组件。 服务器和客户端工具: 执行安装服务器和客户端工具以创建具有管理能力的关系数据库服务器。 仅连接: 仅安装关系数据库客户端连接组件,包括连接 SQL Server 2000 命名实例所需的 MDAC 2.6(Microsoft 数据访问组件) 。该选项只提供连接工具,不提供客户端工具或其它组件。2一个数据库中包含哪几种文件?答: 主数据库文件:
2、用来存储数据库的启动信息以及部分或者全部数据,是所有数据库文件的起点,包含指向其它数据库文件的指针。一个数据库只能有一个主数据库文件。 辅助数据库文件:用于存储主数据库文件中未存储的剩余数据和数据库对象,一个数据库可以没有辅助数据库文件,但也可以同时拥有多个辅助数据库文件 事务日志文件:一个存储数据库的更新情况等事务日志信息 ,当数据库损坏时,管理员使用事务日志恢复数据库;每一个数据库至少必须拥有一个事务日志文件,而且允许拥有多个日志文件。3事务文件和数据文件分开存放有什么好处?答: 因为利用事务日志备份可以将数据库恢复到特定的即时点(如输入不想要的数据之前的那一点)或故障发生点。在媒体恢复策
3、略中应考虑利用事务日志备份。 4什么是批处理?使用批处理有何限制?答: 包含一个或多个 T-SQL 语句的组,从应用程序将一次性发送到 SQL Server 执行,SQL Server 批处理语句作为整体编译成一个可执行单元。 限制:如不能够在同一个批处理中更改表,然后引用新列。如在一个批处理程序中,有两条语句。第一条语句用来在一张表中插入一个字段,如在 User 表中插入员工的出生年月;第二条语句则用来引用这个列,如根据身份证号码来推算出这个员工的出身年月并把这个值赋值给这个第一条语句创建的出身年月字段。5数据检索时,COMPUTE 和 COMPUTE BY 产生的结果有何不同?答: 当 C
4、OMPUTE 带 BY 子句时,符合 SELECT 条件的每个组都有两个结果集: 每个组的第一个结果集是明细行集,其中包含该组的选择列表信息。 每个组的第二个结果集有一行,其中包含该组的 COMPUTE 子句中所指定的聚合函数的小计。 当 COMPUTE 不带 BY 子句时,SELECT 语句有两个结果集: 每个组的第一个结果集是包含选择列表信息的所有明细行。 第二个结果集有一行,其中包含 COMPUTE 子句中所指定的聚合函数的合计。6什么是索引?索引分为哪两种?各有什么特点?答: 数据库中的索引与书籍中的目录类似。在一本书中,利用目录可以快速查找所需信息,无须阅读整本书。在数据库中,索引使
5、数据库程序无须对整个表进行扫描,就可以在其中找到所需数据。. . 聚集索引和非聚集索引。 聚集索引的特点:行的物理位置和行在索引中的位置是相同的,每个表只能有一个聚集索引,聚集索引的平均大小大约为表大小的 5%左右。 非聚集索引特点:若未指定索引类型,则默认为非聚集索引,叶节点页的次序和表的物理存储次序不同,每个表最多可以有 249 个非聚集索引,在非聚集索引创建之前创建聚集索引。7创建索引有什么优点和缺点?答: 优点:索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。使用索引查找数据,无需对整表进行扫描,可以快速找到所需数据。 缺点:索引需要占用数据表以外的物理存储空间。
6、创建索引和维护索引要花费一定的时间。当对表进行更新操作时,索引需要被重建,这样降低了数据的维护速度。8什么是视图?使用视图的优点和缺点是什么?答: 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。 优点:隐蔽数据库的复杂性;控制用户提取数据;简化数据库用户管理;简化查询 缺点: 性能:SQL Server 必须把视图的查询转化成对基本表的查询,如果这个视图是由,一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQL Server
7、 也,把它变成一个复杂的结合体,需要花费一定的时间。 修改限制:当用户试图修改视图的某些行时,SQL Server 必须把它转化为对基本,表的某些行的修改。对于简单视图来说,这是很方便的,但是,对于比较复杂的,视图,可能是不可修改的。9. 修改视图中的数据会受到哪些限制?答: 必须对视图的操作权限有权限 对视图上的某些列不能修改,这些列是:计算列,内置函数列和行集合函数列 删除基表并不删除视图,建议采用与表明显不同的名字命名规则 对由多表连接成的视图修改数据时,不能同时影响一个以上的基表,也不能删除视图中的数据 如果某些列因为规则或者约束的限制不能接受从视图插入的数据时,则插入数据可能会失败
8、对具有 NOT NULL 的列进行修改时可能会出错。通过视图修改或者插入数据时,必须保证未显示的具有 NOT NULL 属性的列有值,可以是默认值,IDENTITY 等,否则不能像视图中插入数据行。10. 什么是数据完整性?如果数据库不实施数据完整性会产生什么结果?答: 指的是数据库中存储的数据的一致性和准确性;包括了实体完整性、域完整性、参照完整性、用户定义的完整性。能够防止数据库中存在不符合语义规定的数据,并且可以防止因错误信息的输入输出造成无效操作或错误信息。 后果:无法保证数据库数据的一致性和准确性;容易造成数据库中存在不符合规定的数据或者错误信息11数据完整性有哪几类?如何实施?答:
9、. . 数据完整性分为四类:实体完整性、域完整性、参照完整性、用户定义的完整性。 数据库采用多种方法来保证数据完整性,包括外键、束约、规则和触发器。系统很好地处理了这四者的关系,并针对不同的具体情况用不同的方法进行,相互交叉使用,相补缺点。12. 什么是主键约束?什么是惟一约束?两者有什么区别?答: 主键约束:有一列或列的组合,其值能唯一的标识表中的每一行。 唯一约束:不允许数据库表在指定列上具有相同的值,但允许有空值。 区别:一个表可以定义多个唯一约束,只能定义一个主键约束;空值得列上可以定义唯一约束,不能定义主键约束。13什么是外键,怎样建立外键约束?答: 外键是用于建立和加强两个表数据之
10、间的链接的一列或多列。 通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。14什么是存储过程?使用存储过程有什么好处?答: 定义:存储过程指的是存储在服务器上的 Transact-SQL 语句的命名集合,是封装重复性任务的方法,支持用户声明变量、条件执行以及其他强有力的编程特性。 好处: 存储过程封装了商务逻辑,确保一致的数据访问和修改。若规则或策略有变化,则只需要修改服务器上的存储过程,所有的客户端就可以直接使用 屏蔽数据库模式的详细资料。用户不需要访问底层的数据库和数据库内的对象 提供了安全性机制。用户可以被赋予执行存储过程的权限,而不必
11、在存储过程引用的所有对象上都有权限 改善性能。预编译的 Transact-SQL 语句,可以根据条件决定执行哪一部分 减少网络通信量。客户端用一条语句调用存储过程,就可以完成可能需要大量语句才能完成的任务,这样减少了客户端和服务器之间的请求/回答包15什么是触发器?触发器分有什么作用?答: 触发器是一类特殊的存储过程,不能被直接调用,也不传递或接受参数 作用: 维护不可能在表创建时刻通过声明性约束进行的复杂的完整性约束限制。 通过记录所进行的修改以及谁进行了修改来审计表中的信息。 当表被修改的时候,自动给其他需要执行操作的程序发信号。程序设计题假设在 factory 数据库中已创建了如下 3
12、个表,(1)职工表 worker,其结构为:职工号:int,姓名:char(8),性别:char(2),出生日期:datetime,党员否:bit,参加工作:datetime,部门号:int。(2)部门表 depart,其结构为:部门号:int,部门名:char(10)。(3)职工工资表 salary,其结构为:职工号:int,姓名:char(8),日期:datetime,工资:decimal(6,1)。. .1.使用 Transact-SQL 语句完成如下各题:(1) 显示所有职工的年龄。(2) 求出各部门的党员人数。(3) 显示所有职工的姓名和 2004 年 1 月份工资数。(4) 显示所
13、有职工的职工号、姓名和平均工资。(5) 显示所有职工的职工号、姓名、部门名和 2004 年 2 月份工资,并按部门名顺序排列。(6) 显示各部门名和该部门的所有职工平均工资。(7) 显示所有平均工资高于 1200 的部门名和对应的平均工资。(8) 显示所有职工的职工号、姓名和部门类型,其中财务处和人事处属管理部门,市场部属市场部门。答案:(1) SELECT 姓名,YEAR(GETDATE()-YEAR(出生日期) AS 年龄 FROM worker(2) SELECT depart.部门名,count(*) AS 党员人数FROM worker,departWHERE worker.党员否=
14、1 AND worker.部门号=depart.部门号GROUP BY depart.部门名(3) SELECT worker.姓名,salary.工资FROM worker,salaryWHERE worker.职工号= salary.职工号 AND YEAR(salary.日期)=2004 AND MONTH(salary.日期)=1(4). SELECT 职工号,AVG(工资) AS 平均工资FROM salaryGROUP BY 职工号(5) SELECT worker.职工号,worker.姓名, depart.部门名, salary.工资 AS 2004 年2 月工资FROM wo
15、rker,depart,salaryWHERE worker.部门号=depart.部门号 AND worker.职工号= salary.职工号 AND YEAR(salary.日期)=2004 AND MONTH(salary.日期)=2ORDER BY worker.部门号(6) SELECT depart.部门名, AVG(salary.工资) AS 平均工资FROM worker,depart,salaryWHERE worker.部门号=depart.部门号 AND worker.职工号= salary.职工号 GROUP BY depart.部门名(7) SELECT depart
16、.部门名, AVG(salary.工资) AS 平均工资FROM worker,depart,salaryWHERE worker.部门号=depart.部门号 AND worker.职工号= salary.职工号 GROUP BY depart.部门名HAVING AVG(salary.工资)1200(8). USE factoryGOSELECT worker.职工号,worker.姓名CASE depart.部门名WHEN 财务处 THEN 管理部门WHEN 人事处 THEN 管理部门. .WHEN 市场部 THEN 市场部门END AS 部门类型FROM worker,departWH
17、ERE worker.部门号=depart.部门号GO2在前面建立的 factory 数据库上,用 Transact-SQL 语句完成下列各题:(1)在 worker 表中的“部门号”列上创建一个非聚集索引,若该索引已存在,则删除后重建。(2)在 salary 表的“职工号”和“日期”列创建聚集索引,并且强制惟一性。答案:(1)SET NOCOUNT OFFUSE factoryIF EXISTS(SELECT name FROM sysindexes WHERE name=depnoDROP INDEX worker.depnoGOCREATE INDEX depno ON worker(部
18、门号)GO(2) SET NOCOUNT OFFUSE factoryIF EXISTS(SELECT name FROM sysindexes WHERE name=no_dateDROP INDEX salary.no_dateGOCREATE UNIQUE CLUSTERED INDEX no_date ON salary(职工号,日期)GO3在前面建立的 factory 数据库上,用 Transact-SQL 语句完成下列各题:(1)建立视图 View1,查询所有职工的职工号、姓名、部门名和 2004 年 2 月份工资,并按部门名顺序排列。(2)建立视图 View2,查询所有职工的职工
19、号、姓名和平均工资。(3)建立视图 View3,查询各部门名和该部门所有职工平均工资。(4)显示视图 View3 的定义答案:(1)USE factoryGOIF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWSWHERE TABLE_NAME=View1)DROP VIEW View1GOCREATE VIEW View1AS SELECT TOP 15 worker.职工号,worker.姓名,depart.部门名,salary.工资 AS 2004 年 2 月工资FROM worker,depart,salaryWHERE wo
20、rker.部门号=depart.部门号 AND worker.职工号=salary.职工号AND YEAR(salary.日期)=2004 AND MONTH(salary.日期)=2ORDER BY worker.部门号. .GOSELECT * FROM View1GO(2)USE factoryGOIF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWSWHERE TABLE_NAME=View2)DROP VIEW View2GOCREATE VIEW View2AS SELECT worker.职工号,worker.姓名,AV
21、G(salary.工资) AS 平均工资FROM worker,salaryWHERE worker.职工号=salary.职工号GROUP BY worker.职工号,worker.姓名GOSELECT * FROM View2GO(3)USE factoryGOIF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWSWHERE TABLE_NAME=View3)DROP VIEW View3GOCREATE VIEW View3AS SELECT depart.部门名, AVG(salary.工资) AS 平均工资FROM work
22、er,depart,salaryWHERE worker.部门号=depart.部门号 AND worker.职工号=salary.职工号GROUP BY depart.部门名GOSELECT * FROM View3GO(4)USE factoryGOEXEC sp_helptext View3GO4在前面建立的 factory 数据库上,用 Transact-SQL 语句完成下列各题:(1) 实施 worker 表的“性别”字段默认值为“男”的约束。(2) 实施 salary 表的“工资”字段值限定在 09999 的约束。(3) 实施 depart 表的“部门号”字段值惟一的非聚集索引的约
23、束。(4) 为 worker 表建立外键“部门号” ,参考表 depart 的“部门号”列。(5) 建立一个规则 sex:性别=男 OR 性别=女,将其绑定到 worker 表的“性别”列上。(6) 删除(1)小题所建立的约束。(7) 解除(5)小题所建立的绑定并删除规则 sex。答案:. .(1)ALTER TABLE workerADD CONSTRAINT default_sex DEFAULT 男 FOR 性别(2)ALTER TABLE salaryADD CONSTRAINT check_salary CHECK(工资0 AND 工资0BEGINROLLBACK TRANRETUR
24、NEND. .COMMIT TRANSACTIONPRINT 职工+name+的信息成功添加到表 worker 中执行下列语句,可验证存储过程的正确性:USE factoryGOAddwoeker 20,陈立,女,55/03/08,1,75/10/10,4GOSELECT * FROM workerGO(2)USE factoryGOCREATE PROCEDURE Delworkerno int=NULLASIF no IS NULL BEGINPRINT 必须输入职工号!RETURNENDBEGIN TRANSACTIONDELETE FROM worker WHERE 职工号=noIF
25、error0BEGINROLLBACK TRANRETURNENDCOMMIT TRANSACTIONPRINT 成功删除职工号为+CAST(no AS CHAR(2)+的职工记录执行下列语句,可验证存储过程的正确性:USE factoryGODelwoeker 20GOSELECT * FROM workerGO(3)USE factoryGOEXEC sp_helptext DelworkerGO(4)USE factoryGOIF EXISTS (SELECT name FROM sysobjectsWHERE name=Addworker AND type=PDROP PROCEDUR
26、E AddworkerGOIF EXISTS (SELECT name FROM sysobjects. .WHERE name=Delworker AND type=PDROP PROCEDURE DelworkerGO6在前面建立的 factory 数据库上,用 Transact-SQL 语句完成下列各题:(1) 在表 depart 上创建一个触发器 depart_update,当更改部门号时同步更改 worker 表中对应的部门号。(2) 在表 worker 上创建一个触发器 worker_delete,当删除职工记录时同步删除 salary 表中对应职工的工资记录。(3) 删除触发器
27、depart_update。答案:(1)USE factoryGOIF EXISTS (SELECT name FROM sysobjectsWHERE type=TR AND name=depart_updateDROP TRIGGER depart_updateGOCREATE TRIGGER depart_update ON departFOR UPDATEASDECLARE olddepno int,newdepno intSELECT olddepno=部门号 FROM deletedSELECT newdepno=部门号 FROM insertedUPDATE workerSET
28、部门号=newdepnoWHERE 部门号=olddepnoGO(2)USE factoryGOIF EXISTS (SELECT name FROM sysobjectsWHERE type=TR AND name=worker_deleteDROP TRIGGER worker_deleteGOCREATE TRIGGER worker_delete ON workerFOR DELETEASDECLARE no intSELECT no=职工号 FROM deletedDELETE FROM salaryWHERE 职工号=noGO(3) USE factoryGODROP TRIGGE
29、R depart_updateGO. .-use mastergoxp_cmdshell mkdir d:project, NO_OUTPUT -创建文件夹 project,xp_cmdshell 为系统存储过程-检验数据库是否存在,如果为真,删除此数据库-IF EXISTS(SELECT NAME FROM master.dbo.SYSDATABASES WHERE NAME=NstuDB)DROP DATABASE stuDBGO-创建数据库-CREATE DATABASE stuDBON(NAME=NstuDB,FILENAME=d:projectstuDB.mdf,SIZE=5mb,M
30、AXSIZE=10mb,FILEGROWTH=15%)LOG ON(NAME=NstuDB_log,FILENAME=d:projectstuDB_log.ldf,SIZE=2mb,MAXSIZE=4mb,FILEGROWTH=15%)GOUSE stuDB-判断此表是否存在,如果为存在,删除此表-IF EXISTS(SELECT NAME FROM stuDB.dbo.SYSOBJECTS WHERE NAME=NstuInfo)DROP TABLE stuInfoGO-创建主表 stuInfo-CREATE TABLE stuInfo(stuName NVARCHAR(20) NOT NULL,stuNo NCHAR(6) NOT NULL,stuSex NCHAR(4) NOT NULL,stuAge SMALLINT NOT NULL,stuSeat SMALLINT IDENTITY(1,1),stuAddress NTEXT)