SQLSEREVER测试题(中)

2019-04-14 19:56发布

SQLSERVER的实现部分1 有订单表,需要实现它的编号,格式如下:200211030001……200222039999  2 有表T1,T2,现有一事务,在向表T1添加数据时,同时也必须向T2也添加数据,如何实现该事务  3 如何向T1中的编号字段(code varchar(20))添加一万条记录,不充许重复,规则如下:编号的数据必须从小写的a-z之间取值  4 如何删除表中的重复数据,请使用游标与分组的办法  5 如何求表中相邻的两条记录的某字段的值之差  6 如何统计数据库中所有用户表的数据,显示格式如下:表名       记录数  sales       23  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 (表Alb2_id000的条数)
   b   2条(表Alb2_id003的条数)   9 人员情况表(employee:里面有一字段文化程度(wh):包括四种情况(本科以上,大专,高中,初中以下),现在我要根据年龄字段查询统计出:表中文化程度为本科以上,大专,高中,初中以下,各有多少人,占总人数多少。SELECT wh AS 学历,age as 年龄, Count(*) AS 人数,       Count(*) * 100 /(SELECT Count(*) FROM employee) AS 百分比FROM employee GROUP BY wh,age学历      年龄     人数       百分比本科以上  20       34          14大专      20       33          13高中      20       33          13初中以下  20       100         40本科以上  21       50          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 cWHERE a.FID = c.FStdId AND b.FSubID = c.FsubID GROUP BY a.FName  11 原始表的数据如下:PID PTime     PNo111111     2003-01-28 04:30:09      111111     2003-01-28 18:30:00222222    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:09      04:32:09     ......2003-01-28    18:30:00 2003-02-09    03:35:25     03:36:25      03: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 Afrom @AAA group by 商品名称)TA,(select 商品名称,sum(出库数量) AS Bfrom @BBB group by 商品名称)TBwhere 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)、加索引:tblExlTempYearGDXMTXDZtblExlTempMonth GDXMTXDZ2)、删除无用数据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  10P0001  2002-1-10  11P0001  2002-1-10  50P0001  2002-1-12   9P0001  2002-1-12   8P0001  2002-1-12   7P0002  2002-10-10   5P0002  2002-10-10  7P0002  2002-10-12  0.5P0003  2002-10-10  5P0003  2002-10-12  7P0003  2002-10-12  9  结果要先按照品种汇总,再按照日期汇总,结果如下:P0001   2002-1-10    71P0001    2002-1-12   24P0002    2002-10-10  12P0002    2002-10-12  0.5P0003    2002-10-10  5P0003    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 QtySumFROM InventoryGROUP 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 值的所有可能组合(RedBlue Red + Blue),而且报告与 Color Red 相组合的 Item 值的所有可能组合(ChairTable 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