一 SQLSERVER管理部分
1 请讲出身份验证模式与登录帐号的关系及如何用各种帐号进行登录,并画出示意图
2 请讲出登录帐号、数据库用户及数据库角色之间的关系,并画出示意图
3 请讲出数据库用户、数据库角色与数据库对象之间的关系,并画出直接对用户授权与间接对用户授权(系统权限与对象权限)的方法
4 请讲出服务器角色、数据库角色、标准角色与应用程序角色的区别与验证其权限的方法
5 请讲出数据库还原模型对数据库的影响
6 有一个执行关键任务的数据库,请设计一个数据库备份策略
7 请使用文件与文件组恢复的方式恢复数据库
8 请使用事务日志恢复数据库到一个时间点
9 请设计作业进行周期性的备份数据库
10 如何监控数据库的阻塞,并实现数据库的死锁测试
11 如何监控数据库的活动,并能使用索引优化向导生成索引
12 理解数据库框图的作用并可以设计表与表之间的关系
二 SQLSERVER的实现部分
1 有订单表,需要实现它的编号,格式如下:200211030001……200222039999等
2 有表T1,T2,现有一事务,在向表T1添加数据时,同时也必须向T2也添加数据,如何实现该事务
3 如何向T1中的编号字段(code varchar(20))添加一万条记录,不充许重复,规则如下:编号的数据必须从小写的a-z之间取值
4 如何删除表中的重复数据,请使用游标与分组的办法
5 如何求表中相邻的两条记录的某字段的值之差
6 如何统计数据库中所有用户表的数据,显示格式如下:
表名记录数
sales23
7 如何删除数据库中的所有用户表(表与表之间有外键关系)
8 表A editor_id lb2_id
123 000
123 003
123 003
456 007
456 006
表B lb2_id lb2_name
000 a
003 b
006 c
007 d
显示 a 共1条 (表A内lb2_id为000的条数)
b 共2条(表A内lb2_id为003的条数)
9 人员情况表(employee):里面有一字段文化程度(wh):包括四种情况(本科以上,大专,高中,初中以下),现在我要根据年龄字段查询统计出:表中文化程度为本科以上,大专,高中,初中以下,各有多少人,占总人数多少。
SELECT wh AS 学历,age as 年龄, Count(*) AS 人数,
Count(*) * 100 /(SELECT Count(*) FROM employee) AS 百分比
FROM employee GROUP BY wh,age
学历年龄 人数百分比
本科以上 2034 14
大专2033 13
高中2033 13
初中以下 20100 40
本科以上 2150 20
10 现在有三个表student:(FID 学生号,FName 姓名),
subject:(FSubID 课程号,FSubName 课程名),
Score(FScoreId 成绩记录号,FSubID 课程号,FStdID 学生号,FScore 成绩)
怎么能实现这个表:
姓名 英语 数学 语文 历史
张萨 78 67 89 76
王强 89 67 84 96
SELECT a.FName AS 姓名,
英语 = SUM(CASE b.FSubName WHEN ’英语’ THEN c.FScore END),
数学 = SUM(CASE b.FSubName WHEN ’数学’ THEN c.FScore END),
语文 = SUM(CASE b.FSubName WHEN ’语文’ THEN c.FScore END),
历史 = SUM(CASE b.FSubName WHEN ’历史’ THEN c.FScore END)
FROM Student a, Subject b, Score c
WHERE a.FID = c.FStdId AND b.FSubID = c.FsubID GROUP BY a.FName
11 原始表的数据如下:
PID PTime PNo
111111 2003-01-28 04:30:09
111111 2003-01-28 18:30:00
222222 2003-01-28 04:31:09
333333 2003-01-28 04:32:09
111111 2003-02-09 03:35:25
222222 2003-02-09 03:36:25
333333 2003-02-09 03:37:25
查询生成表
PDate 111111 222222 333333......
2003-01-28 04:30:09 04:31:0904:32:09 ......
2003-01-28 18:30:00
2003-02-09 03:35:25 03:36:2503:37:25 ......
12 表一(AAA)
商品名称mc 商品总量sl
A 100
B 120
表二(BBB)
商品名称mc 出库数量sl
A 10
A 20
B 10
B 20
B 30
用一条SQL语句算出商品A,B目前还剩多少?
一
declare @AAA table (商品名称 varchar(10), 商品总量 int)
insert into @AAA values(’A’,100)
insert into @AAA values(’B’,120)
declare @BBB table (商品名称 varchar(10), 出库数量 int)
insert into @BBB values(’A’, 10)
insert into @BBB values(’A’, 20)
insert into @BBB values(’B’, 10)
insert into @BBB values(’B’, 20)
insert into @BBB values(’B’, 30)
select TA.商品名称,A-B AS 剩余数量 FROM
(select 商品名称,sum(商品总量) AS A
from @AAA
group by 商品名称)TA,
(select 商品名称,sum(出库数量) AS B
from @BBB
group by 商品名称)TB
where TA.商品名称=TB.商品名称
二
select 商品名称,sum(商品总量) 剩余数量 from (select * from @aaa union all select 商品名称,-出库数量 from @bbb) a group by 商品名称
13 优化这句SQL语句
UPDATE tblExlTempYear
SET tblExlTempYear.GDQC = tblExlTempMonth.GDQC
FROM tblExlTempYear,tblExlTempMonth
where tblExlTempMonth.GDXM=tblExlTempYear.GDXM and tblExlTempMonth.TXDZ=tblExlTempYear.TXDZ
(1)、加索引:
tblExlTempYear(GDXM,TXDZ)
tblExlTempMonth (GDXM,TXDZ)
(2)、删除无用数据
(3)、转移过时数据
(4)、加服务器内存,升级服务器
(5)、升级网络系统
UPDATE tblExlTempYear
SET tblExlTempYear.GDQC = tblExlTempMonth.GDQC
FROM tblExlTempYear (index indexY),tblExlTempMonth (index indexM)
where tblExlTempMonth.GDXM=tblExlTempYear.GDXM and tblExlTempMonth.TXDZ=tblExlTempYear.TXDZ
14 品种 日期 数量
P0001 2002-1-10 10
P0001 2002-1-10 11
P0001 2002-1-10 50
P0001 2002-1-12 9
P0001 2002-1-12 8
P0001 2002-1-12 7
P0002 2002-10-10 5
P0002 2002-10-10 7
P0002 2002-10-12 0.5
P0003 2002-10-10 5
P0003 2002-10-12 7
P0003 2002-10-12 9
结果要先按照品种汇总,再按照日期汇总,结果如下:
P0001 2002-1-10 71
P0001 2002-1-12 24
P0002 2002-10-10 12
P0002 2002-10-12 0.5
P0003 2002-10-10 5
P0003 2002-10-12 16
SQL SERVER能做出这样的汇总吗…
15 在分組查循中with{cube|rollup}的區別是什么?
如:
use pangu
select firm_id,p_id,sum(o_price_quantity)as sum_values
from orders
group by firm_id,p_id
with cube
與
use pangu
select firm_id,p_id,sum(o_price_quantity)as sum_values
from orders
group by firm_id,p_id
with rollup
的區別是什么?
CUBE 和 ROLLUP 之间的区别在于:
CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
例如,简单表 Inventory 中包含:
Item Color Quantity
-------------------- -------------------- --------------------------
Table Blue 124
Table Red 223
Chair Blue 101
Chair Red 210
下列查询将生成小计报表:
SELECT CASE WHEN (GROUPING(Item) = 1) THEN ’ALL’
ELSE ISNULL(Item, ’UNKNOWN’)
END AS Item,
CASE WHEN (GROUPING(Color) = 1) THEN ’ALL’
ELSE ISNULL(Color, ’UNKNOWN’)
END AS Color,
SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH ROLLUP
Item Color QtySum
-------------------- -------------------- --------------------------
Chair Blue 101.00
Chair Red 210.00
Chair ALL 311.00
Table Blue 124.00
Table Red 223.00
Table ALL 347.00
ALL ALL 658.00
(7 row(s) affected)
如果查询中的 ROLLUP 关键字更改为 CUBE,那么 CUBE 结果集与上述结果相同,只是在结果集的末尾还会返回下列两行:
ALL Blue 225.00
ALL Red 433.00
CUBE 操作为 Item 和 Color 中值的可能组合生成行。例如,CUBE 不仅报告与 Item 值 Chair 相组合的 Color 值的所有可能组合(Red、Blue 和 Red + Blue),而且报告与 Color 值 Red 相组合的 Item 值的所有可能组合(Chair、Table 和 Chair + Table)。对于 GROUP BY 子句中右边的列中的每个值,ROLLUP 操作并不报告左边一列(或左边各列)中值的所有可能组合。例如,ROLLUP 并不对每个 Color 值报告 Item 值的所有可能组合。ROLLUP 操作的结果集具有类似于 COMPUTE BY 所返回结果集的功能;然而,
ROLLUP 具有下列优点: ROLLUP 返回单个结果集;COMPUTE BY 返回多个结果集,而多个结果集会增加应用程序代码的复杂性。ROLLUP 可以在服务器游标中使用;COMPUTE BY 不可以。有时,查询优化器为 ROLLUP 生成的执行计划比为 COMPUTE BY 生成的更为高效。
16 假如我有两个表
表1(电话号码,是否存在)
表2(电话号码,是否拨打)
想查找表1中的电话号码是否在表2中存在,如果存在就更新表1中的是否存在字段为1。
UPDATE 表1 SET 是否存在=1
WHERE EXISTS(SELECT * FROM 表2 WHERE 表2.电话号码 = 表1.电话号码)
17 用存储过程调用外部程序.
不过要做成com控件
用sp_OACreate存储过程)
DECLARE @object int
DECLARE @hr int
DECLARE @src varchar(255), @desc varchar(255)
EXEC @hr = sp_OACreate ’SQLDMO.SQLServer’, @object OUT
IF @hr 〈〉 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
RETURN
END
18 以下作业皆以*.sql文件存储于c:\homework目录中
实践1:创建和维护SQL Server数据库
(1)使用下表提供的值,创建数据库ClassNorthwind
参数 值
数据库名称 ClassNorthwind
数据库文件名 ClassNorthwind_Data
位置 C:\data
初始大小 25MB
文件组Primary
文件增长 1MB
最大文件长度 100MB
事务日志文件名称 ClassNorthwind_Log
位置C:\data
初始大小 15MB
文件增长 1MB
最大文件长度30MB
(2)使用sp_helpdb存储过程浏览有关数据库ClassNorthwind的信息
(3)修改数据库属性
编写和执行将ClassNorthwind事务日志文件的最大文件长度增加到50MB的语句
编写和执行向数据库ClassNorthwind添加一个事务日志文件ClassNorthwind_LogApp,文件属性如下:
位置 C:\dataapp
初始大小 20MB
文件增长 1MB
最大文件长度 40MB
实践2:创建和修改SQL Server数据库的表
(1)创建数据库ClassNorthwind中的雇员表Employees、雇员工资表wage和工资税表tax
雇员表Employees:
字段名称 类型 空否
EmployeeID Int,identity ,初值为1,增量为1 NOT NULL
Name VarChar(10) NOT NULL
Sex Char(2) NOT NULL
Birthdate Date NULL
Address Varchar(50) NULL
Phone Char(13) NULL
Remark text
雇员工资表wage:
字段名称 类型 空否
EmployeeID Int NOT NULL
Name VarChar(10) NOT NULL
Wage money NOT NULL
Putdate Date NOT NULL
工资税表tax:
字段名 类型 空否
EmployeeID Int NOT NULL
Name VarChar(10) NOT NULL
Tax money NOT NULL
Paydate Date NOT NULL
(2)向雇员表Employees中添加列Department varchar(20) NULL
(3)修改雇员表Employees中的列Address varchar(60)
(4)删除雇员表Employees中的列Remark
(5)用存储过程sp_help查看三个表的信息
(6)向雇员表Employees中插入十个雇员信息
(7)向雇员工资表wage中插入十个雇员相应的工资发放情况信息
(8)向工资税表tax中插入十个雇员相应的交税情况
实践3:创建SQL Server数据库表的视图和索引
(1)在雇员表Employees中,创建一个name和phone列上的合成索引
(2)使用存储过程sp_helpindex Employees列出表的索引
(3)分别查询雇员表Employees、雇员工资表wage和工资税表tax中的行数据
(4)创建一个视图,用于检索雇员工资、税款情况,包括下列字段:
EmployeeID、Name、Sex、Wage、Putdate 、Tax、Paydate
(5)创建一个视图,用于检索雇员工资高于1000元的雇员情况表
(6)创建一个视图,用于检索雇员工资高于5000元的雇员情况表
实践4:查询SQL Server数据库表的信息
(1)列出每个雇员的工资、税款情况一览表
(2)列出工资超过1000元,而未交税的雇员
(3)列出工资在1000元以下,不应该交税的雇员情况一览表
(4)列出只领工资而未交税的雇员表
(5)对以上四种情况各作一统计报告
(6)删除三个表中的所有记录
实践5:实现SQL Server数据库的完整性
(1)创建雇员表Employees的主关键字,列:EmployeeID
(2)创建雇员工资表wage的外部关键字,列:EmployeeID,参考Employees的主键
(3)创建工资税表tax的外部关键字,列:EmployeeID,参考Employees的主键
(4)向雇员表Employees中添加关于以下列的DEFAULT约束:
name:unknown,sex:男,Address:Salt Lake,Phone:(000)00000000
(5)向雇员表Employees中添加BirthDate列的CHECK约束:在BirthDate列中的值必须早于今天的日期
(6)定义雇员电话号码Phone的规则:(***)********,其中*是0~9之间的数字字符
(7)执行存储过程sp_helpconstraint浏览上面创建的约束信息
(8)向雇员表Employees中插入十个雇员信息,并检查约束
(9)向雇员工资表wage和工资税表tax中添加关于以下列的DEFAULT约束:
Putdate:昨天,Paydate:昨天
实践6:SQL Server数据库的高级查询
(1)分别列出在雇员表Employees中而未领工资和未交税的男、女雇员情况
(2)查询电话号码区号为(010)、工资大于3000的男雇员情况
(3)查询交税最多的六名雇员情况
(4)列出工资在前六名的,而交税并不在前六名的雇员情况
实践7:创建、执行、修改SQL Server数据库的存储过程
(1)编写存储过程,向雇员表Employees、雇员工资表wage和工资税表tax中各插入两条记录
(2)编写存储过程,列出工资最高的六名雇员情况
(3)编写存储过程,查找雇员表Employees中Sex、Phone与指定值相匹配的雇员
(4)编写存储过程,查找雇员表Employees中BirthDate在指定两个日期之间的雇员
(5)编写存储过程,用于计算男、女雇员的平均工资,男、女雇员的人数,并输出
(6)用存储过程sp_helptext查看上面的存储过程定义
实践8:创建和使用SQL Server数据库的触发器
(1)创建触发器,从雇员表Employees中一次删除的记录数应不超过2条
(2)创建触发器,当向雇员工资表wage中插入记录时,同时向工资税表tax中插入记录,工资税计算为:
Wage:1000以下,不交税;1000~5000:交税工资的1%
5000以上:交税工资的3%
(3)创建触发器,当修改雇员工资表wage中的记录时,同时修改工资税表tax中的记录
(4)创建触发器,当删除雇员表Employees中的记录时,同时删除雇员工资表wage和工资税表tax中的有关该雇员的所有记录
(5)创建触发器,当修改工资税表tax中Tax列的值时,检查交税情况是否符合(2)的交税比例
(6)测试上面创建的触发器
实践9:使用SQL Server数据库的游标
(1)使用游标获取雇员表Employees中的记录
(2)使用游标检查雇员工资税的交纳是否正确
实践10:使用SQL Server数据库的用户字定义函数
(1)编写函数,按男、女雇员分类计算平均工资和合计工资
(2)编写函数,查找雇员表Employees中Sex、Phone与指定值相匹配的雇员
(3)编写函数,查找雇员表Employees中BirthDate在指定两个日期之间的雇员
(4)定义数据类型mytext,向雇员表Employees中添加列Remark,其类型为mytext