《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 [email protected]
go
exec proc_Search
A. 你忘记了传递学号
B. 编译错误
C. 显示空的记录
D. 调用存储过程proc_Search出错
17) 下面关于SQL Server中变量的操作正确的是( AD )。
A. DECLARE @name varchar(8)
SET @name=‘lkl‘
print ‘姓名是‘[email protected]
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=‘一次性纸杯‘)