测试(一)试题及答案

《MySchool数据库设计优化》内部测试-机试试卷

 

某中心ACCP的某班毕业后,学员纷纷找到了满意的工作。到了年底调薪的阶段了,创建一个存储过程,对这批学员进行按级别调薪。数据库名为Wages,保存学员就业信息表的结构WageInfo,见表1;保存学员信息的表为StudentInfo,见表2。

 

表 1:学员就业信息表:WagesInfo

字段名称

字段数据类型

字段具体说明

CompanyID

int

就业单位编号,表的主键,初始值为1,自增

CompanyName

varchar(50)

就业单位名称,非空

Poste

varchar(50)

岗位名称,非空

 

表 2:学员信息表:StudentInfo

字段名称

字段数据类型

字段具体说明

ID

int

学号,表的主键,初始值为1,自增

Name

varChar(10)

学员姓名,非空

CompanyID

int

就业单位编号,外键,可空

PosteDate

datetime

就业日期,可空

Wage

int

工资,可空

 

要求:

按下面的要求,编写T-SQL语句,对学员就业和目前的工资进行分析。

1)创建数据库Wages。如果数据库Wages已存在,那么,先删除再创建。

2)根据表1的表结构,创建WagesInfo表。如果表WagesInfo已存在,则先删除再创建该表。

3)根据表1的表结构,创建StudentInfo表。如果表StudentInfo已存在,则先删除再创建该表。

4)添加WagesInfo表和StudentInfo表的主外键约束。

  Alter  table  studentinfo

Add constraint FK_Wages_Student_CompanyID foreign key (companyid)

Referrence wages(companyid)

 

5)在StudentInfo表和WagesInfo表中插入至少5条测试数据。

6)在StudentInfo表PosteDate列上创建非聚集索引。

 Create nonclustered index IX_PostDate

  On studentinfo(PostData)

  With fillfactor=30

 

7)创建视图,并执行查询获得已经就业的学员记录。

8)创建视图,并执行查询获得目前尚未就业的学员记录。

9)创建并执行存储过程,查询是否有一半程序员的工资在3000元之上。如果不到分别每次给每个程序员加薪50元,至之一半程序员的工资达到3000元。

10)创建并执行存储过程,查询程序员平均工资在3500元,如果不到则每个程序员每次加50元,至到所有程序员平均工资达到3500元。

11)保存SQL代码,分离数据库,生成压缩包,提交符合命名规范的练习答案。

 

 

------------------------------------------------参考答案------------------------------------------------

USE master
GO
----------------1.建库----------------
--检验数据库是否存在,如果存在则删除此数据库;如果不存在则新建
IF exists(SELECT * FROM sysdatabases WHERE name='Wages')
    DROP DATABASE Wages
GO
CREATE DATABASE Wages
GO


----------------2.建表----------------
USE Wages
GO

CREATE TABLE WagesInfo  --学员就业信息表
(
    CompanyID int identity(1,1) primary key,  --工资编号
    CompanyName  varchar(50) NOT NULL ,       --学员姓名
    Poste varchar(50) NOT NULL                --岗位名称
    
)
GO


----------------3.建表----------------
CREATE TABLE StudentInfo  -- 学员信息表
(
    ID int identity(1,1) primary key,  --学号
    Name  varchar(10) NOT NULL ,       --学员姓名
    CompanyID int,                     --就业单位编号
    Wage  int,                         --学员工资
    PosteDate datetime                 --就业日期
)
GO


----------------4.添加约束----------------
ALTER TABLE StudentInfo  WITH CHECK ADD  CONSTRAINT FK_Student_Wages FOREIGN KEY(CompanyID)
REFERENCES WagesInfo (CompanyID)
GO


----------------5.插入数据----------------
INSERT INTO WagesInfo(CompanyName,Poste)VALUES('好好软件公司','软件售前工程师')
INSERT INTO WagesInfo(CompanyName,Poste)VALUES('好运金融公司','软件测试工程师')
INSERT INTO WagesInfo(CompanyName,Poste)VALUES('诚信理财公司','软件开发工程师')
INSERT INTO WagesInfo(CompanyName,Poste)VALUES('华彩软件工作室','软件开发工程师')
INSERT INTO WagesInfo(CompanyName,Poste)VALUES('新浪网','网页设计开发师')
INSERT INTO WagesInfo(CompanyName,Poste)VALUES('团购网','网页开发师')

INSERT INTO StudentInfo(Name,CompanyID,Wage,PosteDate)VALUES('白可',1,3000,'2010-11-10')
INSERT INTO StudentInfo(Name,CompanyID)VALUES('张丰宛',null)
INSERT INTO StudentInfo(Name,CompanyID,Wage,PosteDate)VALUES('蔡绢',1,1800,'2010-11-10')
INSERT INTO StudentInfo(Name,CompanyID,Wage,PosteDate)VALUES('周小林',2,1300,'2010-10-10')
INSERT INTO StudentInfo(Name,CompanyID,Wage,PosteDate)VALUES('王阳',3,5000,'2010-10-10')
INSERT INTO StudentInfo(Name,CompanyID,Wage,PosteDate)VALUES('刘琳',4,1500,'2010-9-10')
INSERT INTO StudentInfo(Name,CompanyID,Wage,PosteDate)VALUES('刘翔',2,1500,'2010-11-10')
INSERT INTO StudentInfo(Name,CompanyID,Wage,PosteDate)VALUES('张琳',3,1500,'2010-11-10')
INSERT INTO StudentInfo(Name,CompanyID,Wage,PosteDate)VALUES('刘晓晓',null,null,null)
INSERT INTO StudentInfo(Name,CompanyID,Wage,PosteDate)VALUES('赵亮',4,2500,'2010-9-10')
GO
--如果需要重置该表请执行下列语句
--truncate table WagesInfo
--truncate table StudentInfo


-------------------6.创建索引--------------------------------
IF EXISTS (SELECT name FROM sysindexes
          WHERE name = 'ix_Student_PosteDate')
DROP INDEX StudentInfo.ix_Student_PosteDate  --删除索引
GO

CREATE NONCLUSTERED INDEX ix_Student_PosteDate
   ON StudentInfo(PosteDate)
       WITH FILLFACTOR = 30
GO


------------------6.创建视图--------------------------------
--查询已经就业的学员记录
IF EXISTS (SELECT * FROM sysobjects WHERE name='vw_GetWagesStudent ')
    DROP VIEW vw_GetWagesStudent
GO
CREATE VIEW vw_GetWagesStudent
AS
  SELECT Name,CompanyName,Poste,Wage
  FROM StudentInfo 
  WITH (INDEX=ix_Student_PosteDate)
  INNER JOIN WagesInfo ON StudentInfo.CompanyID = WagesInfo.CompanyID
  WHERE  StudentInfo.CompanyID is not null
GO

SELECT * FROM vw_GetWagesStudent
GO


------------------8.查询目前尚未就业的学员----------------
IF EXISTS (SELECT * FROM sysobjects WHERE name='vw_GetNoWagesStudent ')
    DROP VIEW vw_GetNoWagesStudent
GO
CREATE VIEW vw_GetNoWagesStudent
AS
  SELECT ID,Name
  FROM StudentInfo 
  WHERE  StudentInfo.PosteDate is null
GO

SELECT * FROM vw_GetNoWagesStudent


--------------------9.创建存储过程--------------------
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='proc_SumWage')
    DROP PROCEDURE proc_SumWage
GO
CREATE PROCEDURE proc_SumWage 
    @WageA INT,
    @WageB INT,
    @totalWage INT
AS
WHILE(1=1)
    BEGIN
        IF (SELECT COUNT(*) FROM wagesInfo) > 2 * (SELECT COUNT(*) FROM StudentInfo WHERE Wage>=@WageA)
            UPDATE StudentInfo SET @totalWage=@totalWage+@WageB,Wage=Wage+@WageB
            WHERE CompanyID is null
    ELSE
        BREAK
    END
PRINT'总共加薪:' + CONVERT(VARCHAR,@totalWage) + ''
PRINT'加薪后学员的工资列表:'
SELECT * FROM StudentInfo
GO

--调用存储过程
EXEC proc_SumWage @WageA=3000,@WageB=50,@totalWage=0
EXEC proc_SumWage @WageA=4000,@WageB=50,@totalWage=0
EXEC proc_SumWage @WageA=6000,@WageB=50,@totalWage=0


--------------10.创建存储过程----------------------
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='proc_AvgWage')
    DROP PROCEDURE proc_AvgWage
GO
CREATE PROCEDURE proc_AvgWage 
    @WageA INT,
    @WageB INT,
    @totalWage INT
AS 
WHILE (1=1)
    BEGIN
        IF ((SELECT AVG(Wage) FROM StudentInfo)<=@WageA)
            UPDATE StudentInfo SET @totalWage=@totalWage+@WageB,Wage=Wage+@WageB
    ELSE
        BREAK
    END
PRINT'总共加薪:' + CONVERT(VARCHAR,@totalWage)+''
PRINT'加薪后学员的工资列表:'
SELECT * FROM StudentInfo
GO

--调用存储过程
EXEC proc_AvgWage @WageA=3500,@WageB=50,@totalWage=0

笔试题 

《MySchool数据库设计优化》内部测试-笔试试卷

 

1)  在SQL Server 中,为数据库表建立索引能够( C )。

       A.    防止非法的删除操作

       B.    防止非法的插入操作

       C.    提高查询性能

       D.    节约数据库的磁盘空间

 

2)  在SQL SERVER中,创建一个表使用( C )语句。

       A.    INSERT

       B.    DROP

       C.    CREATE

       D.    ALERT

 

3)    在SQL SERVER中,下面关于视图说法错误的是( C )。

       A.    对查询执行的大多数操作也可以在视图上进行

       B.    使用视图可以增加数据库的安全性

       C.    不能利用视图增加,删除,修改数据库中的数据

       D.    视图使用户更灵活的访问所需要的数据

 

4)    在数据库设计中,用E-R图来描述信息结构但不涉及信息在计算机中的表示,它是数据库设计的( A )阶段。

       A.    需求分析

       B.    概要设计

       C.    逻辑设计

       D.    物理设计

 

5)  在SQL Server 数据库中,如果强制要求grades表中的学员必须是Students表中存在的学员,以下描述正确的是( A )。

       A.    在grades表中创建外键约束

       B.    在grades表中创建检查约束

       C.    在grades表中创建唯一约束

       D.    在grades表中创建默认约束

 

6)    在SQL Server 数据库中,下面的T-SQL语句段执行第三句时出现错误,数据库中的内容修改情况是( C )。

BEGIN TRANSACTION

update Account set balance=7800 where id=1

update Account set balance=9000 where id=1

IF @@error <> 0

        ROLLBACK TRANSACTION

ELSE

        COMMIT TRANSACTION

 

       A.    Account表中id为1的记录中balance字段的值被修改为7800

       B.    Account表中id为1的记录中balance字段的值被修改为9000

       C.    Account表中id为1的记录中balance字段的值不变

       D.    不可能发生这种情况

 

7)    在SQL Server 数据库中,有关下列T-SQL语句的功能,说法正确的是( C )。

DECLARE @I int, @J int

SET @I=0

WHILE (@I < 2)

  BEGIN

    SELECT @J=COUNT(*) FROM stuMarks WHERE writtenExam<60

    IF(@J>0)

      UPDATE stuMarks SET writtenExam=writtenExam+5 WHERE writtenExam<60

    ELSE

      BREAK

    SET @I = @I + 1

  END

SELECT stuNo,成绩=CASE

                    WHEN writtenExam<60 THEN '不及格'

                    ELSE '及格'

                  END

   FROM stuMarks

       A.    给不及格的学员反复提5分直到通过为止,最后展示所有学员是否及格的情况信息

       B.    给不及格的学员提10分,最后展示所有学员是否及格的情况信息

       C.    给不及格的学员提5分,提分后仍不及格的学员再提5分,最后展示所有学员是否及格的情况信息

       D.    给不及格的学员提5分,最后展示所有学员是否及格的情况信息

 

8)    在SQL Server 数据库中,下面调用存储过程的语句错误的是( B )。

       A.    EXEC proc_stu @sum OUTPUT,64,78

       B.    EXEC proc_stu  @sum OUTPUT,@total output,78

       C.    EXEC proc_stu  @sum OUTPUT,604

       D.    EXEC Calculate @sum OUTPUT,@total output

 

9)    在SQL SERVER中,下面关于子查询的说法你认为正确的是( CD )。

       A.    应用简单子查询的SQL语句的执行效率比采用SQL变量的实现方案要低

       B.    带子查询的查询执行顺序是,先执行父查询,再执行子查询

       C.    表连接一般都可以用子查询替换,但有的子查询不能用表连接替换

       D.    如果一个子查询语句一次返回二个字段的值,那么父查询的where子句中应该使用NOT EXISTS关键字

 

10)在SQL SERVER中,按以下要求创建学员表正确的SQL语句是( D )。

学员表(stuTable)的要求是:学号为5位数字,自动编号;姓名最多为4个汉字,身份证号码最多为18位数字。

       A.    CREATE TABLE stuTable (

              ID NUMERIC(6,0) NOT NULL,

              Name VARCHAR(4),

              Card INT

)

       B.    CREATE TABLE stuTable

(

       ID INT IDENTITY(10000,1),

       Name VARCHAR(4),

       Card DECIMAL(18,0)

)

       C.    IF EXISTS(SELECT * FROM sysobjects WHERE name=' stuTable ')

DROP TABLE stuTable

GO

CREATE TABLE stuTable

(

       ID NUMERIC(4,0) NOT NULL,

       Name VARCHAR(4),

       Card INT

)

       D.    IF EXISTS(SELECT * FROM sysobjects WHERE name=' stuTable ')

DROP TABLE stuTable

GO

CREATE TABLE stuTable

(

       ID INT IDENTITY(10000,1),

       Name VARCHAR(8),

       Card NUMERIC(18,0)

)

 

11)   在SQL SERVER中,声明并创建以下存储过程,正确调用该存储过程的的语句是( BC )。

CREATE PROCEDURE  PRO

@passNum int OUTPUT,

@passPoint int=60

AS

Select @passNum=count(*) From stuTable Where point >@passPoint

GO

       A.    Declare @sum int

EXEC PRO @passNum,70

       B.    Declare @sum int

EXEC PRO @sum output,70

       C.    Declare @sum int

EXEC PRO @sum output

       D.    EXEC PRO 70

 

12)  下面描述的四个阶段中,不是数据库设计过程中经历的阶段是( D )。

       A.    需求分析阶段

       B.    概要设计阶段

       C.    详细设计阶段

       D.    代码设计阶段

 

13) 在SQL Server 中,对IN语句取反的方法是,在IN前面添加( B )。

       A.    NONE

       B.    NOT

       C.    !

       D.    NO

 

14) 在SQL Server 数据库中,以下对变量的定义错误的是( D )。

       A.    DECLARE @username  varchar(10)

       B.    DECLARE @RowCount  varchar(30)

       C.    DECLARE @@username  varchar(10)

       D.    DECLARE @@RowCount  varchar(30)

 

15)  在SQL Server中,绘制E-R图时一般使用( B )表示实体的属性。

       A.    矩形

       B.    椭圆

       C.    菱形

       D.    三角形

 

16)  在SQL SERVER中,运行下列语句,输出结果是( B )。

Create proc proc_Search

@myStuno varchar(8) is null

as

if @myStuno = null              --改成等等

begin

    print '你忘记了传递学号'

   return

end

Select * from stuinfo where stuno=@myStuno

go

exec proc_Search

       A.    你忘记了传递学号

       B.    编译错误

       C.    显示空的记录

       D.    调用存储过程proc_Search出错

 

17)  下面关于SQL Server中变量的操作正确的是( AD )。

       A.    DECLARE @name varchar(8)

SET @name='lkl'

print '姓名是'+@name

       B.    DECLARE name varchar(8)       --少@

SET name='lkl'

print '姓名是'+name

       C.    print  @@VERSION AS '版本', @@SERVERNAME AS '服务器'

       D.    SELECT @@VERSION AS '版本', @@SERVERNAME AS '服务器'

 

18) 下面选项中关于在SQL语句中使用的逻辑控制语句的说法正确的是( B)。

A.    在IF-ELSE 条件语句中,IF为必选,而ELSE为可选

B.    在IF-ELSE 条件语句中,语句块使用{  }括起来

C.    在CASE多分支语句中不可以出现ELSE分支

D.    在WHILE循环语句中条件为false,就重复执行循环语句

 

19) 已知dept表有部门编号字段deptno、部门名称字段dname,员工表emp具有员工编号字段empno、员工姓名字段ename、电话字段phone和所属部门编号字段deptno,该字段参考dept表的deptno字段,要使用SQL语句查询 “研发部”部门所有员工的编号和姓名信息,下面选项中正确的是( B )。

A.    SELECT empno,ename FROM emp

WHERE empno=(SELECT empno FROM dept WHERE dname="研发部")

B.    SELECT empno,ename FROM emp

WHERE deptno=(SELECT deptno FROM dept WHERE dname='研发部')

C.    SELECT empno,ename FROM emp

WHERE deptno=(SELECT * FROM dept WHERE dname='研发部')

D.    SELECT empno,ename FROM dept

WHERE deptno=(SELECT deptno FROM emp WHERE dname="研发部")

 

20)  在SQL Server中,下面关于视图的描述,说法正确的是( AD )。

       A.    使用视图可以筛选原始物理表中的数据,增加了数据访问的安全性

       B.    视图是一种虚拟表,数据只能来自一个原始物理表

       C.    CREATE VIEW语句中可以包含UPDATE语句

       D.    为了安全起见,一般只对视图执行查询操作,不推荐在视图上执行修改操作

 

21)  在SQL Server中,创建如下存储过程:

create proc stu_exam

@writtenExam int=null

    as

        if @writtenExam is null

            begin

                print '请输入笔试成绩及格线'

                return

            end

        select * from student where stu_id in

        (select stu_id from stu_marks

        where writtenExam>@writtenExam)

GO

下列选项正确的是( C )。

       A.    执行EXEC stu_exam语句,控制台显示所有笔试成绩及格的学生信息记录集

       B.    存储过程(stu_exam)代码存在语法错误

       C.    执行EXEC stu_exam语句,控制台显示“请输入笔试成绩及格线”

       D.    执行EXEC stu_exam 75语句,控制台显示“请输入笔试成绩及格线”

 

22)  下列选项中不属于SQL Server的逻辑控制语句的是( B )。

       A.    IF-ELSE语句

       B.    FOR循环语句

       C.    CASE子句

       D.    WHILE循环语句

 

23)  在SQL SERVER中,关于聚集索引和非聚集索引的描述错误的是( B )。

       A.    一个表可以有多个非聚集索引,但只能有一个聚集索引

       B.    非聚集索引的值顺序与数据表中记录的物理顺序完全相同

       C.    在建立聚集索引的列上不允许有重复的值

       D.    使用聚集索引查询的速度要比非聚集索引速度快

 

24)  在SQL SERVER中,关于系统存储过程以下说法错误的是( D )。

       A.    系统存储过程提供了管理数据库和更新表的机制

       B.    所有系统存储过程都以sp_开头

       C.    所有系统存储过程都存放在master数据库中

       D.    用户不能使用系统存储过程更新系统表,只能查询系统表

 

25)  在SQL Server 数据库中,从product表里查询出price(价格)高于pName(产品名称)为“一次性纸杯”所有记录中最高价格的产品的查询语句为( D )。

       A.    SELECT * FROM product WHERE max(price)>'一次性纸杯'

       B.    SELECT * FROM product WHERE price>(SELECT max(*) FROM product WHERE pName= '一次性纸杯')

       C.    SELECT * FROM product WHERE EXISTS pName='一次性纸杯'

       D.    SELECT * FROM product WHERE price>(SELECT max(price) FROM product WHERE pName='一次性纸杯')

 

转载于:https://www.cnblogs.com/WuXuanKun/p/5291668.html

你可能感兴趣的:(测试(一)试题及答案)