现在的位置: 首页 > 综合 > 正文

数据库程序员入门测试题

2013年06月26日 ⁄ 综合 ⁄ 共 13485字 ⁄ 字号 评论关闭

1、写一个触发器,一个存储过程、一个函数、一个表,一个视图 的创建代码。

   题目内容:考你T-SQL知识
   答题要求:贴出代码。

2、求从今天往后数的7000天,所在日期的当月有多少天。

   题目内容:考你T-SQL及函数知识
   答题要求:贴出代码。

3、写几个表,能够表明完整表达学生选择课程的意思。
     字段不要太多,我要你表明它们的关系怎么建立的。

   题目内容:考你范式设计
   答题要求:贴出完整关系图

标准答案

 

 1.1创建一个table:
 create table firm(
 firm_id int identity(1000,1) primary key,
 firm_name varchar(50) not null,
 firm_introduce varchar(255) null
 )on[primary]

 1.2创建一个procedure
 create proc strconnect
  @str1 varchar(30),@str2 varchar(30),@connect varchar(60) output
 as
 set @connect=@str1+@str2
  

 1.3创建一个view
 create view firm_view
 as 
 select firm_id,firm_name from firm

 1.4创建一个function
 create function compute_sum 
 (@price money,@quantity int)
 return money
 as
 begin
 declare @p_sum money
 set @p_sum=@price*@quantity
 return(@p_sum)
 end

 1.5创建一个触发器
 /*我这个触发器建得很漏哦~~*/
 create trigger firm_trigger
 on firm
 for insert,update
 as
 begin
 declare @firm_fund int
 select @firm_fund=firm_fund from firm
 if @firm_fund>=1000000 
 begin
 update firm set firm_ /> end
 if @firm_fund<1000000 
 begin
 update firm set firm_ /> end 
 end

 2、declare @date_time datetime,@day_num int,@d int
 set @date_time=dateadd(d,7000,getdate())
 set @d=month(@date_time)
 if @d=12
 set @day_num=31
 else

 set @day_num=day(dateadd(d,-1,(cast(year(@date_time) as varchar(4))+'-'+cast((month(@date_time)+1) as varchar(2))+'-01')) )

 select @day_num,@d as dd,@date_time

本题目专门考数据库管理知识

1、创建一个数据库 AAA
   
   答题要求:T-SQL实现

2、完全备份数据库AAA到磁盘文件c:/AAA.bak

   答题要求:T-SQL实现

3、删除数据库AAA

   答题要求:T-SQL实现
   

4、从磁盘文件C:/AAA.bak中还原数据库为BBB

   答题要求:T-SQL实现

5、将数据库BBB的物理文件移动到另外一个目录。(假设原来在系统的默认目录,现在让你移动到c:/下面)
   
   答题要求:语言描述。当然,能用T-SQL实现最好。

标准答案

 

1、Create Database AAA 
2、backup database aaa to disk='c:/aaa.bak' 就好了!

3、drop database aaa

4、Restore database BBB From disk='c:/aaa.bak'

另外注:

如果没有3,也就是没有删除AAA数据库。

那算我出题超题,没有考虑到逻辑文件名:),所以难度太大了。

大概这样写:(我没有测试。)

RESTORE DATABASE bbb
  FROM DISK = 'c:/aaa.bak'
     WITH move 'aaa' to 'd:/bbb.mdf',
     move 'aaa_Log' to 'd:/bbb_Log.ldf'

其中,aaa,aaa_log是逻辑文件名。 

如何获得逻辑文件名可以用

Restore FileListOnly From Disk='c:/aaa.bak' 获得。

呵呵,具体我就不编程了,算是我超题。

5、
第一步:分离数据库(exec sp_detach_db 'bbb','true');
第二步:将数据库文件移到c:/下面;
第三步:通过指定移动文件的新位置附加数据库:
exec sp_attach_db 'bbb','c:/bbb_data.mdf',
'c:/bbb_log.ldf'
 

本题目专门考存储过程知识和TSQL知识!!测试2的题目太浅了,这次要深一点!!

:(:(

 

1、创建一个通用存储过程,要求备份任意数据库到任意磁盘文件的功能。即有两个参数,一个是数据库的名字,一个是备份的文件名字。执行如:
    
    Exec spBackupDB 'myDatabase','c:/myDatabase.Bak'

实现备份。

   答题要求:T-SQL实现
   注意要点:不允许写死是某一个数据库,也不允许写死是某一个文件!!
   提示:    Execute , sp_ExecuteSQL

2、现有环境:

   Student表

   结构如下:
   
   Create Table Student(
   StudID  int not null primary key,     --学号
   Name    varchar(20),                  --姓名
   Sex     bit Not null                  --性别,1表示男,0表示女
   )

   数据如下:
   
   StudID           Name           Sex
   ----------------------------------------------------------------
    1               Chair3          1
    2               CGF             0
    3               xwj             0

   要求写一段更新代码,自动给客户删除StudID=1的数据,并增加一条新的数据,数据为:
   
   StudID           Name           Sex
   ----------------------------------------------------------------
    4               西方不敢很帅    1
    
   考虑到用户的可能误操作,因此要求在程序中进行一定的判断,避免异常!
 
   答题要求:T-SQL实现
   提示:注意判断 

3、给上一条题目2的Student表进行修改,修改结构为:

   Create Table Student(
   StudID    int not null primary key,     --学号
   Name      varchar(20),                  --姓名
   Sex       bit Not null,                 --性别,1表示男,0表示女
   Chinese   Float Not Null Default 0  --语文的分数
   )

   也是给客户更新的。注意不要破坏客户原有的数据!!

   答题要求:T-SQL实现
   提示:  sysColumns, Object_ID()    

标准答案

 

修改自  文洁。

呵呵,我发现我的几个学生,有时候一些技巧比我做的好。
比如第一题,我就一开始认定是要使用动态SQL的(拍拍前额,老了…)

-------------------------
老师的意思这样就可以了?

1、create proc stu_back2
  @dbname        nvarchar(100),
  @dbbuckup      nvarchar (500)

as

BACKUP DATABASE  @dbname TO disk=@dbbuckup

后面2道(今天看到第3题的提示:做了一些修改,第一次没有用if判断)

2
if not exists (select studid from student where StudID=4)
begin
 delete from student where StudID=1
 insert into student values(4,'西方不敢很帅',1)
end

3
if exists (select name,id from syscolumns where  name='Chinese'and id=OBJECT_ID('test..student'))
print 'this  is  exists'
else
alter table student
add Chinese   Float Not Null
DEFAULT 0 WITH valueS

呵呵,以前记得有个写通讯的朋友很看不起数据库,说,不就是那几条语句么?

我当时冷冷的说:就一条Select ,我就可以让你足足学够一个星期!!

本次专题:Select ,再Select,然后还是Select !!

   环境一:
   
   表结构:

   Create Table Student(
   ClassID   int Not Null,                 --班级编码
   StudID    int not null primary key,     --学号
   Name      varchar(20),                  --姓名
   Sex       bit Not null                  --性别,1表示男,0表示女
   Chinese   Float Not Null Default 0    --语文的分数
   )

   数据:
   
   ClassID   StudID           Name           Sex       Chinese
   ----------------------------------------------------------------
     2        1               Chair3          1           77  
     1        2               CGF             0           88 
     2        3               xwj             0           78
     3        4               西方不敢很帅    1           55.9 
     2        5               Saten           1           77
     3        6               歪书生          1           66.7 
     
0.(环境一)求姓“歪”的男生的资料。
  
   答题要求:SQL实现   

1.(环境一)求学号前面3位学生

   答题要求:SQL实现(注意,不是T-SQL阿!以下同)

2.(环境一)求所有学生中,男生与女生的数量。
  
   答题要求:SQL实现
  
3.(环境一)求各班的语文分数。
  
   答题要求:SQL实现

4.(环境一)生成一个相同结构的Student2表,同时把这个表的数据复制过去。
  
   答题要求:SQL实现

5.(环境一)求男生最多的一个班级
  
   答题要求:SQL实现

6.(环境一)显示所有的数据,Sex=1显示为“男”,Sex=0显示为“女”

   答题要求:SQL实现

7.(环境一)求取语文前5名的学生。

   答题要求:T-SQL实现

   其他说明:
             在学校排名中,如果a,b的分数相同,那么,他们是同一个名次的,比他们稍低分数的c则要跳过一个名次。
             也就是,我要得到这个结果:

   ClassID   StudID           Name           Sex       Chinese     ChineseOrder
   -----------------------------------------------------------------------------------
     1        2               CGF             0           88            1
     2        3               xwj             0           78            2 
     2        1               Chair3          1           77            3 
     2        5               Saten           1           77            3
     3        6               歪书生          1           66.7          5  

    

   提示:临时表,Indentity。   这题有一定的难度。可能我又要超题了……:)不过,这可是非常现实的题目。
 

标准答案

 

0.(环境一)求姓“歪”的男生的资料。
select * from student where  left(name,1) ='歪'   and sex=1

1.(环境一)求学号前面3位学生
select top 3  * from student order by studid

2.(环境一)求所有学生中,男生与女生的数量。
select  sex,count(*) as num  from student group by sex
   
3.(环境一)求各班的语文分数。
select classid,sum(chinese) as 总分, avg(chinese) as 平均分 from student group by classid
  
4.(环境一)生成一个相同结构的student2表,同时把这个表的数据复制过去。
/*请教过别人,才知道做的:$ ,原来不知道select into用法*/
select * into student2 from student

5.(环境一)求男生最多的一个班级
select  top 1 classid from student where sex=1 group by classid order by count(*) desc

6.(环境一)显示所有的数据,sex=1显示为“男”,sex=0显示为“女”
/*请教过别人,才知道做的:$  */
select  classid,studid,name ,case when sex=1 then '男' else '女' end as sex ,chinese from student 

7、
 select *,isnull((select sum(1) from student 
  where chinese>e.chinese),0)+1 as chineseorder from student e  where isnull((select sum(1) from student 
  where chinese>e.chinese),0)+1<=5  order by chinese desc

本次专题:再来Select一把!同时搞点别的!

   环境一:
   
   Student表结构:

   Create Table Student(
   ClassID   int Not Null,                 --班级编码
   StudID    int not null primary key,     --学号
   Name      varchar(20),                  --姓名
   Sex       bit Not null,                 --性别,1表示男,0表示女
   Chinese   Float Not Null Default 0      --语文的分数
   )

   数据:
   
   ClassID   StudID           Name           Sex       Chinese
   ----------------------------------------------------------------
     2        1               Chair3          1           77  
     1        2               CGF             0           88 
     2        3               xwj             0           78
     3        4               西方不敢很帅    1           55.9 
     2        5               Saten           1           77
     3        6               歪书生          1           66.7 

   ------------
   Class表结构:
   
   Create Table Class(
     ClassID Int Not Null Primary key,
     SchoolID int not null,
     ClassName varchar(30)
   ) 

   数据:
  
   ClassID      SchoolID      ClassName
   --------------------------------------------
     1             1           952班
     2             2           953班
     3             2           955班
     4             1           995班
     5             1           921班
     6             3           953班  

   -------------
   School表结构:
   Create Table School(
     SchoolID int not null primary key,
     School   varchar(50)
   )

   数据:
   
   SchoolID         School
   --------------------------------------
     1              北京2中
     2              北京3中  
     3              上海1中
     4              上海2中 

   ---------------

   他们的关系:

   School  <--  Class   (SchoolID,级联)    (以后提到级联,若非特别指出,均指级联更新与级联删除)
   Class   <--  Student (ClassID,级联)

0.(环境一)显示学生表中所有的数据,并同时显示他们的学校以及班级名称

   答题要求:SQL实现

     
1.(环境一)求各个学校的男女学生人数及小计人数(各个学校总人数)、总计人数(所有人数)
  
   答题要求:SQL实现   
   提示:WITH 子句。With CUBE | ROLLUP    

2.(环境一)删除“上海2中”的所有数据,包括学校、班级、学生数据。
  
   答题要求:SQL实现
  
3.(环境一)假设题目中的级联,仅仅指级联更新,那么,2题又该怎么实现?要求使用同一事务。
  
   答题要求:TSQL实现
   提示:Trans

4.(环境一)创建一条唯一索引在School.School中。不允许学校名相同。

   答题要求:TSQL实现

标准答案

 

0.显示学生表中所有的数据,并同时显示他们的学校以及班级名称
select student.*,school,classname
from school  inner join class on school.schoolid = class.schoolid
inner join student on class.classid = student.classid

1.求各个学校的男女学生人数及小计人数(各个学校总人数)、总计人数(所有人数)
select case when (grouping(school) = 1) then 'all'
            else isnull(school, 'unknown')
        end  as school,
        case sex when 1 then '男'  when 0 then '女'  else  'all' 
        end  as sex ,
        count(sex) as sumnum 
from school  inner join class on school.schoolid = class.schoolid
inner join student on class.classid = student.classid
group by  school,sex with rollup

2.删除“上海2中”的所有数据,包括学校、班级、学生数据。
delete from school where school='上海2中'

3..(环境一)假设题目中的级联,仅仅指级联更新,那么,2题又该怎么实现?要求使用同一事务
begin transaction t1
         delete from student where classid in (select classid 
         from class where schoolid in (select schoolid 
         from school where school='上海2中'))
         if @@error<>0
         goto err
   
         delete from class where schoolid in (select schoolid 
         from school where school='上海2中')
         if @@error<>0
         goto err
  
         delete from school where school='上海2中'
         if @@error<>0
        goto err  
commit transaction t1
err:
rollback transaction t1

4.创建一条唯一索引在school.school中。不允许学校名相同。
create unique clustered index school_ind
on school(school)
with ignore_dup_key

本次训练设计。

 

1、设计类似Windows NT的用户权限结构。要求有几个方面:
   A.用户组   B.用户   C.用户操作记录   D.权限(允许查询,允许编辑,允许管理)

   答题要求: 贴出关系图。(字段不要很多,能够表达意思就可以。请文字注明字段的含义。)

2、设计一个无限分级的雇员关系图(类似Dev-Club的论坛树形结构)

   答题要求:贴出关系图。

3、设计一个大学里面的管理系统。要求有几个方面
   A.学院    B.专业    C.班级     D.学生      E.课程

   就这几个方面,请根据一般大学里面的实际情况设计。能够完全表达相应的意思。

   答题要求:贴出关系图。

 

本题无标准答案:),实际上要根据具体情况来设计的。

 

范式采用与否以及采用深度都要根据情况。

本次训练专题:动态SQL。

总提示只有两个:sp_ExecuteSQL,Execute

 

1、写一个存储过程,可以清空任意一个表的数据。

   答题要求:贴出代码。

2、写一个存储过程,该存储过程可以对任意一个数据库(假设该数据库中不存在任何关系)进行数据清空。

   答题要求: 贴出代码

3、写一个存储过程,要求这个存储过程返回某一个表的记录数量。

   答题要求:帖出代码(不允许用数据集返回)

4、写一个存储过程,要求这个存储过程返回某一个表的某一个字段排序下第X条记录的ID值(注:假设该表存在一个整型ID字段,唯一标识)。

   答题要求:贴出代码 (不允许用数据集返回)

大概都测试过,还有什么不对的地方请老师指点。目前就是还有第2题含有不解之处。我对第2题大概注明一下,请老师看看。

 

1、写一个存储过程,可以清空任意一个表的数据。
create proc trun_table
  @tb_name varchar(50)
as
  exec ('truncate table ' +' '+@tb_name)
 GO
2、写一个存储过程,该存储过程可以对任意一个数据库(假设该数据库中不存在任何关系)进行数据清空。

create proc deldbdata
   @dbname varchar(50)--定义一变量,来传递所要清空数据库名。
as
  declare @tbname varchar(50)--定义来传递所要清空数据库中的用户表表名的变量
  declare @id int                     --定义来传递临时表中自增长字段的变量
  declare @sql varchar(2000)   
  create table #tep(id INT IDENTITY(1,1) PRIMARY KEY,t_name varchar(50))--创建一个带有自增长字段和存取要清空数据库中用户表表名的字段。
  set @sql='insert into #tep select name from '+@dbname+'..sysobjects where xtype=''U'' and name<>''dtproperties'''
  exec (@sql)                                                       --把数据库中用户表表名插入临时表。
  while(exists(select * from #tep))                           /* 这部分代码作用就是先判断临时 begin                                                                  表中是否还有纪录,有就每次取1       select top 1 @id=id,@tbname=t_name from #tep     条id号和表名,之后对该库和该表进行
      exec('delete from '+@dbname+'..'+@tbname)    清空,同时删除临时表中该id号的那条
      delete from #tep where id=@id                         纪录。如此循环到最后临时表纪录为
  end                                                                    空则数据库中用户表数据也清空 。*/
drop table #tep
GO

对于这个问题的不解之处是我一开始只在一个固定的库中测试,所以没有用到引用库名的那个 '@dbname'参数,先没有用到这个变量所以关于临时表创建和赋值语句就没用到exec(@sql)。直接这样
create table #tep(id INT IDENTITY(1,1) PRIMARY KEY,t_name varchar(50))
  insert into #tep select name from dbname..sysobjects where xtype='U' and name<>'dtproperties'
。。。
后来因为要实现对任意库操作,再做了修改才成为答题中那样。发现这部分代码如果这样写

  set @sql='create table #tep(id INT IDENTITY(1,1) PRIMARY KEY,t_name varchar(50))
insert into #tep select name from '+@dbname+'..sysobjects where xtype=''U'' and name<>''dtproperties'''
  exec (@sql)
就是说把前面的创建临时表语句也放到@sql里,执行该sp的结果这样:
 (所影响的行数为 35 行) 
服务器: 消息 208,级别 16,状态 1,过程 deldbdata,行 13 对象名 '#tep' 无效。 
我不明白为什么会这样。这样写我犯的是什么错误?

唠叨了半天,不知道我表达清楚了没有。先贴出来请老师看看吧。

3、写一个存储过程,要求这个存储过程返回某一个表的记录数量。
create  proc count_tb
  @tb_name varchar(50)
as
  declare @sql nvarchar(300)
  declare @parminfo nvarchar(100)
  declare @t_count int
  set @sql=N'select @t_count=count(*) from  '+@tb_name
  set @parminfo=N'@t_count int output'
 exec SP_EXECUTESQL @sql,@parminfo, @t_count OUTPUT
 return @t_count
go

4、写一个存储过程,要求这个存储过程返回某一个表的某一个字段排序下第X条记录的ID值(注:假设该表存在一个整型ID字段,唯一标识)。
create proc searchid_tb
  @tb_name varchar(50),
  @tb_columns varchar(200),
  @tb_record int
as
  declare @sql nvarchar(500)
  declare @praminfo nvarchar(100)
  declare @id int
set @sql=N'select top 1 @id=id from (select top '+CONVERT(nvarchar,@tb_record)+' * from '+@tb_name+' order by '+@tb_columns+') t1 order by  '+@tb_columns+' desc'
set @praminfo=N'@id int output'
exec sp_executesql @sql,@praminfo,@id output
return @id
GO
 

抱歉!评论已关闭.