SQL server数据库—存储过程
一、选择题
创建一个名为ManageDB的数据库
员工表EmpInfo
字段说明 | 字段 | 数据类型 | 备注 |
员工编号 | EmpID | int | 主键,标识列 |
员工姓名 | EmpName | Varchar(20) | 不能为空 |
员工职务 | EmpDuty | Varchar(20) | 不能为空 |
员工性别 | EmpSex | Char(2) | 只能是“男”或“女” |
员工年龄 | EmpAge | Int | 20-60之间 |
部门编号 | DeptID | Int | 外键 |
部门表DeptInfo
字段说明 | 字段 | 数据类型 | 备注 |
部门编号 | DeptID | int | 主键,标识列 |
部门名称 | DeptName | Varchar(20) | 不能为空 |
员工信息表
员工编号 | 员工姓名 | 员工职务 | 员工性别 | 员工年龄 | 部门编号 |
1001 | 张三 | 员工 | 男 | 26 | 1 |
1002 | 李四 | 员工 | 女 | 31 | 1 |
1003 | 马冬梅 | 部门经理 | 女 | 32 | 2 |
1004 | 魏无羡 | 部门经理 | 男 | 28 | 1 |
1005 | 韩商言 | 员工 | 男 | 30 | 2 |
部门信息表
部门编号 | 部门名称 |
1 | 技术部 |
2 | 人事部 |
五、操作题
一、创建索引
为了提高查询员工信息的速度,特此要求在员工信息表中的员工姓名这一列创建一个非聚集索引IX_EmpName,并加密,同时使用该索引查询数据
二、创建视图
创建一个视图,查询出“人事部”的部门经理的信息,显示出员工编号,姓名,职务以及部门名称
三、创建存储过程
1、创建存储过程,根据指定的员工姓名,查询出该员工的基本信息,显示出员工编号,姓名,职务和部门名称,并调用该存储过程
2、创建存储过程,根据指定的员工姓名和部门名称,查询出相应的员工的基本信息,显示出员工变化,姓名,职务和部门名称,并调用该存储过程
3、创建存储过程,向员工信息表中插入一条员工信息,默认情况下员工的职务为“员工”,性别为“男”,并调用该存储过程向表中插入一条员工信息
4、创建存储过程,根据指定的员工姓名查询出该员工所在的部门名称,并把该部门名称作为输出参数返回,然后输出“XXX所在的部门名称为:XXX”
5、创建存储过程,分别计算出男女员工的人数,并判断男员工多还是女员工多,将判断结果返回并输出。
答案:
use master ? --切换到master数据库
go
--判断ManageDB数据库是否已存在,如果存在,就删除
if exists(select * from sys.databases where name='managedb')
drop database managedb
go
--创建ManageDB数据库
create database ManageDB
on primary
(
name='managedb_dat',
filename='c:\gao\managedb_dat.mdf',
size=8,
maxsize=100,
filegrowth=1
)
log on
(
name='managedb_log',
filename='c:\gao\managedb_log.ldf',
size=3,
filegrowth=10%
)
go
use ManageDB ?--切换数据库
go
--创建部门表
if exists(select * from sys.objects where name='deptinfo')? ?--判断是否有这个表
drop table deptinfo ? ? ? ? ? --如果有就删除
go
create table deptinfo(
deptid int identity(1,1) primary key,
deptname varchar(20) not null
)
go
--创建员工表
if exists(select * from sys.objects where name='empinfo')??--判断是否有这个表
drop table empinfo ? ? ? --如果有就删除
go
create table empinfo(
empid int identity(1001,1) primary key, ? ? --员工编号
empname varchar(20) not null, ? ? ? --员工姓名
empduty varchar(20) not null, ? ? ? --员工职务
empsex char(2) check(empsex='男' or empsex='女'), ?--员工性别
empage int check(empage between 20 and 60 ), ? ?--员工年龄
deptid int references deptinfo(deptid) ? ? ? ? ?--部门编号
)
go
--向部门表插入数据
insert into deptinfo values('技术部'),('人事部')
go
--插入员工信息表
insert into empinfo(empname,empduty,empsex,empage,deptid)
select '张三','员工','男',26,1 union
select '李四','员工','女',31,1 union
select '马冬梅','部门经理','女',32,2 union
select '魏无羡','部门经理','男',28,1 union
select '韩商言','员工','男',30,2
go
select * from deptinfo ? --查询部门表
select * from empinfo ? ?--查询员工表
go
--创建索引
create ?nonclustered
index ix_empname
on empinfo(empname desc)
with fillfactor=10
go
select * from empinfo ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --查询索引-升序
select * from empinfo with(index=ix_empname) --查询索引-降序
go
--创建一个视图
create view view_empinfo
as
select empid 员工编号,empname 员工姓名,empduty 员工职务,deptname 部门名称 from empinfo e
join deptinfo d on e.deptid=d.deptid where deptname='人事部'
go
select * from view_empinfo ? --查看视图
go
--存储过程一
create proc proc_empinfo
@prempname varchar(20)
as
select empid 员工编号,empname 员工姓名,empduty 员工职务,deptname 部门名称 from empinfo e
join deptinfo d on e.deptid=d.deptid where empname=@prempname
go
exec proc_empinfo '张三' ? ? --调用存储过程
go
--存储过程二
create proc proc_empinfo_fordept
@prempname varchar(20),
@prdeptname varchar(20)
as
select empid 员工编号,empname 员工姓名,empduty 员工职务,deptname 部门名称 from empinfo e
join deptinfo d on e.deptid=d.deptid where empname =@prempname and deptname=@prdeptname
go
exec proc_empinfo_fordept '李四','技术部' ?--调用存储过程
go
--存储过程三
create proc proc_insertempinfo
@prempname varchar(20),
@prempduty varchar(20)='员工',
@prempsex char(2)='男',
@prempage int,
@prdeptid int
as?
insert into empinfo(empname,empduty,empsex,empage,deptid) values(@prempname,@prempduty,@prempsex,@prempage,@prdeptid)
go
--插入数据
exec proc_insertempinfo '关羽',@prempage=30,@prdeptid=1
exec proc_insertempinfo '小乔','员工','女',24,1
exec proc_insertempinfo '大乔','员工','女',28,1
exec proc_insertempinfo '孙尚香','员工','女',30,2
select * from empinfo ? ?--查看
go
--存储过程四:输入部门信息
create proc proc_printdept
@prname varchar(20),
@prdept varchar(20) output
as
select @prdept=deptname from empinfo e?
join deptinfo d on e.deptid=d.deptid where empname=@prname
go
--声明变量 查看存储过程并显示
declare @prname varchar(20),@prdept varchar(20)
set @prname='李四'
exec proc_printdept @prname,@prdept output
print @prname+'所在部门是:'+@prdept
go
--存储过程五:计算男女员工比例
create proc proc_printsex
as
begin
?? ?declare @mannum int ? ?--定义一个存放男生数量的变量
?? ?declare @womannum int ?--定义一个存放女生数量的变量
?? ?declare @result varchar(50) --定义一个存放结果变量
?? ?--查询出男性员工的数量
?? ?select @mannum=count(*) from empinfo where empsex='男'
?? ?--查询出女性员工的数量
?? ?select @womannum=count(*) from empinfo where empsex='女'
?? ?--比较男性员工数量与女性员工数量
?? ?if (@mannum>@womannum)
?? ? ? set @result='男性员工数量大于女员工数量'
? ? else if(@mannum=@womannum)
?? ? ? set @result='男性员工数量等于女员工数量'
?? ?else
?? ? ? set @result='男性员工数量小于女员工数量'
? ?--输出结果
? ?select ?@result
end
go
exec proc_printsex ? --显示存储过程结果
select * from empinfo ?--查询
go