• 测试(一)试题及答案


    《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='一次性纸杯')

  • 相关阅读:
    vue中router与route的区别
    网络编程-20200427
    JSP-20200428
    Servelet-1
    多线程-20200422-高级应用
    20200415_多线程——重点是应用场景
    2020-04-13注解和反射
    HIVE
    流的关联关系
    排序算法整理——坑+后期的数据结构部分
  • 原文地址:https://www.cnblogs.com/WuXuanKun/p/5291668.html
Copyright © 2020-2023  润新知