`

第二次SQL实验

    博客分类:
  • SQL
阅读更多
drop database DBS

create database DBS

use DBS

create table 院系表
(YXBH CHAR(8) PRIMARY KEY CLUSTERED,--院系编号
YXMC CHAR(20) NOT NULL,--院系名称
YXZR CHAR(8) --院系主任
)

create table 教师表
(
jsh char(5) constraint pk_jsh primary key,
jsm char(20)
)

create table 课程表
(
kch char(3) constraint pk_kch primary key,
kcm char(20)
)
go

create table 教师表
(
jsh char(5) constraint pk_jsh primary key,
jsm char(20)
)

create table 成绩表
(
xh char(7) references 学生表,--学号
kch char(3) references 课程表,--课程号
cj int default 0 check (cj >= 0and cj <= 100),--成绩
jsh char(5) references 教师表--教师号
constraint pk_cj primary key(xh,kch)--主码
)



CREATE TABLE 学生表
(
XH CHAR(7)
CONSTRAINT PK_XH PRIMARY KEY NONCLUSTERED,--学号
XM CHAR(20) NOT NULL,--姓名
sfz char(18) unique nonclustered,--身份证
yxbh char(8) references 院系表 --院系编号,外码
)

drop table 学生表
insert into 学生表 values('0301001','李永年','350500198305214026','001')
insert into 学生表 values('0301002','张丽珍','350500198512017017','001')
insert into 学生表 values('0302001','陈俊雄','320300198503213042','001')
insert into 学生表 values('0302002','李军','210200198409112402','001')
insert into 学生表 values('0302003','王任芳','502400198401223341','001')
insert into 学生表 values('0303001','赵雄伟','401200198312111123','001')
select * from 学生表

select top 4 * from 学生表
select top 50 percent * from 学生表 order by xm

select distinct(kch) as kch from 学生表

insert into 教师表 values('01002','王崇阳')
insert into 教师表 values('01001','李穆')
insert into 教师表 values('02001','吴赛')
insert into 教师表 values('02002','冯远客')
insert into 教师表 values('03001','李莉')
insert into 教师表 values('03002','简方')
insert into 教师表 values('01003','刘高')

insert into 课程表 values('001','高等数学')
insert into 课程表 values('002','计算机基础')
insert into 课程表 values('003','网络基础')
insert into 课程表 values('005','大学英语')

insert into 院系表 values('001','计算机','冯远客')
insert into 院系表 values('002','经管','简方')
insert into 院系表 values('003','数学','黄梅')

insert into 成绩表 values('0301001','001','89','01001')
insert into 成绩表 values('0301002','001','78','01002')
insert into 成绩表 values('0302001','002','85','02001')
insert into 成绩表 values('0301001','005','69','02002')
insert into 成绩表 values('0302001','001','56','01002')
insert into 成绩表 values('0302002','001','93','02001')
insert into 成绩表 values('0302003','001','67','01003')

use DBS
create login teacher with password='123',default_database=DBS
create user teacher1 for login teacher
exec sp_change_users_login 'update_one','teacher1','teacher';--建立登录账号与数据库用户之间的关系


exec sp_addlogin 'student','0000','DBS',
sp_addlogin loginname,password,database --"创建用户"
grant all on 管理系统 to student with grant option--用存储过程创建账号

revoke insert on 学生表 from student

revoke all on 学生表 from public

deny create database ,create table to student

--5-72

declare @var1 varchar(7) --声明局部变量
select @var1='学生姓名'  --为局部变量赋初始值
select @var1=xm  --查询结果赋值给变量
from 学生表
where xh='0302001'
select @var1 as '学生姓名'  --显示局部变量结果

--5-73

declare @var1 varchar(8)
select @var1='学生姓名'
select @var1=xm --查询结果赋值,返回的是整个列的全部值,但最后一个给变量
from 学生表
select @var1 as '学生姓名'--显示局部变量的结果


--5-74
declare @no varchar(10)
set @no='0302001'--变量赋值
select xh,xm
from学生表
where xh=@no

--5-75
select @@version
select @@servername --本地服务器名

--5-76
select xh,cj,from 成绩表
where cj=(select max(cj) from 成绩表)

--5-77
declare @StringTest char(10)
SET @StringTest='Robin'
select substring(@StringTest,3,Len(@StringTest))

--5-78
declare @StringTest char(10)
set @StringTest=ascii('Robin  ')
select @StringTest


--5-79
declare @StringTest char(10)
set @StringTest=ascii('Robin  ')
select char(@StringTest)

--5-80
create procedure checks_kch @param int
as if(select count(kch) from 成绩表 where kch=@param)>0 return 1
else return 2

declare @param int
exec @param=check_kch '001'
print @param

--5-81

--如果课程中有计算机课程,统计其数量,否则显示没有计算机课程

if exists(select * from 课程表 where kcm like '计算机%')
select count(*) as 计算机课程数量
from 课程表
where kcm like '计算机%'
else
print'数据库中没有计算机课程'

--5-82


if exists(select * from 课程表 where kcm='高等数学')
select cpunt(*) as 选修高等数学人数
from 成绩表,课程表
where kcm='高等数学' and 成绩表.kch=课程表.kch
else
if exists(select*from课程表 where kcm='编译原理')
select count(*) as 选修编译原理人数
from 成绩表,课程表
where kcm='编译原理'
else
print'高等数学和编译原理都没开'

--5-83
if exists(select * from 课程表 where kcm='高等数学')
begin
select count(*) as 高等数学
from 课程表
where kcm-'高等数学'
end
else
begin
if exists(select * from 课程表 where kcm='编译原理')
select count(*) as 编译原理
from 课程表
where kcm='编译原理'
else
print'高等数学和编译原理都没开!'
end

--5-84
declare @x int
set @x=0
while @x<3
begin
set @x=@x+1
print'x='+convert(char(1),@x)
--类型转换函数convert
end

--5-85
waitfor delay '00:00:30'
select * form 学生表

--5-86
waitfor time '21:20:00'
select * from 学生表

--5-87
select xh,'课程数量'=
case count(*)
when 1 then '选修了一门课'
when 2 then '选修了两门课'
when 3 then '选修了三门课'
end
from 成绩表
group by xh

--5-88
select xh,count(*) as 数量,课程数量=
case
when count(*)=1 then '选修了一门课'
when count(*)=2 then '选修了两门课'
when count(*)=3 then '选修了三门课'
end
from 成绩表
group by xh

--5-89
--创建函数
create function age(@borntime datetime,@today datetime)
--borntime 表示出生日期,today表示当前日期
returns int
as begin
declare #age int
set @age=(year(@today)-year(@borntime))
return(@age)
end--结束函数定义
do
--调用函数
select DBS.dbo.age('1999-7-1',getdate()) as some_age

--5-90
--创建函数
create function course_grade(@kch varchar(30))
--kch 表示课程号
returns table
as
return(select * from 成绩表 where kch=@kch)
go
--调用函数
select * from DBS.dbo.course_grade('001')

--5-91
--创建函数
create function choisecourse(@xm varchar(30))
returns @choiseinfo table(学号 char(10),学生姓名 char(20),
所选课程号 char(10),成绩 numeric(5,1))
begin
insert @choiseinfo
select 学生表.xh,xm,kch,cj
from 学生表,成绩表
where 学生表.xh=成绩表.xh and 学生表.xm=@xm
return
end
go
--调用函数
select * from DBS.dbo.choisecourse('李永年')

--5-92
declare firstcur cursor for select xh,xm,sfz,yxbh from 学生表

--5-93
declare firstcur cursor for select xh,xm,sfz,yxbh from 学生表 for readonly

--5-94
declare firstcur cursor for select xh,xm,sfz,yxbh from 学生表 for update

--5-95
declare @stuname char(10)
--定义游标学生信息_cursor
declare 学生信息_cur cursor
local scroll for select xm from 学生表
--打开游标
open 学生信息_cur
fetch next from 学生信息_cur into @stuname
--取游标中的数据
while @@fetch_status --循环开始,系统默认@@fetch_status的初始值是
begin
print @stuname
fetch next from 学生信息_cur into @stuname
end
close 学生信息_cur
deallocate 学生信息_cur

--5-96
select * from 学生表 where xh='0302001'
begin transaction exampletrans  --开始一个事务
update 学生表  --第一次更新
set YXBH='001'
where xh='0302001'
go
save transaction change  --设置保存点
update 学生表  --第二次更新
set xm='李小丽'
where xh='0302001'
go
select * from 学生表 where xh='0302001'
rollback transaction change --回滚到保存点
print'program go on'
commit transaction
select * from 学生表 where xh='0302001'

--5-97
if exists(select name from sysobjects
where name='cj_info_all' and type='P')
drop procedure cj_info_all
go
create procedure cj_info_all
as
select xm as 学生姓名,kcm as 课程名,jsm as 教师姓名,cj as 成绩
from 成绩表 inner join 学生表  on 学生表.xh=成绩表.xh
inner join 课程表 on 课程表.kch=成绩表.kch
inner join 教师表 on 教师表.jsh=成绩表.jsh
go
cj_info_all  存储过程可以通过以下方法执行:
execute cj_info_all

--5-98
if exists(select name from sysobjects
where name='cj_info' and type='P')
drop procedure cj_info
go
create procedure cj_info
@xm varchar(20)
@jsm varchar(20)
as select sm as 学生姓名,kcm as 课程名,jsm as 教师姓名,cj as 成绩
from 成绩表 inner join 学生表  on 学生表.xh=成绩表.xh
inner join 课程表 on 课程表.kch=成绩表.kch
inner join 教师表 on 教师表.jsh=成绩表.jsh
where xm=@xm adn jsm=@jsm
go
cj_info 存储过程可以通过以下方式执行,第一条命令的运行结果
execute cj_info '张丽珍','李穆'
--or
execute cj_info @jsm='李穆',@xm='张丽珍'
--or
execute cj_info @xm='张丽珍',@jsm='李穆'
--or
execute cj_info '张丽珍','李穆'
--or
execute cj_info @jsm='李穆',@xm='张丽珍'
--or
execute cj_info @xm='张丽珍',@jsm='李穆'

cj_info '张丽珍','李穆'
--or
cj_info @jsm='李穆',@xm='张丽珍'
--or
cj_info @xm='张丽珍',@jsm='李穆'

--5-99

if exists(select name from sysobjects
where name='cj_info2' and type='P')
drop procedure cj_info2
create procedure cj_info2
@xm varchar(20)='李%',
@jsm varchar(20)='%'
as
select xm as 学生姓名,kcm as 课程名,jsm as 教师姓名,cj as 成绩
from 成绩表 inner join 学生表  on 学生表.xh=成绩表.xh
inner join 课程表 on 课程表.kch=成绩表.kch
inner join 教师表 on 教师表.jsh=成绩表.jsh
go
--cj_info_all  存储过程可以通过以下方法执行:
execute cj_info2

--查找张姓同学的成绩单
execute cj_info2'张%'
--查找陈姓同学的成绩单
execute cj_info2 @xm='陈%'
--查找张姓同学的成绩单
execute cj_info2'[陈张]%'
--查找张姓同学,选修李姓老师的成绩单
execute cj_info2'张%','李%'


--5-100

if exists(select name from sysobjects
where name='get_avg' and type='P')
drop procedure get_avg
go
create procedure get_avg
@xm varchar(20)='张%',@avg int output
as
begin
declare @xh varchar(7)
select @xh=学生表.xh from 成绩表,学生表
where 成绩表.xh=学生表.xh and xm like @xm
select @avg=avg(xj) from 成绩表
where 成绩表.xh=@xh group by 成绩白哦.xh
end


declare @getavg int
execute get_avg '张%',@getavg output
if @getavg<60
begin
print''
print'张姓同学的成绩平均不及格'
end
else
select '张姓同学的平均成绩是'+rtrim(cast(@getavg as varchar(20)))


--5-101
if exists(select name from sysobjects
where name='xs_cursor' and type='P')
drop procedure xs_cursor
go
create procedure xs_cursor
@xs_cursor=cursor forward_only static for
select * from 学生表

open @xs_cursor
go

declare @mycursor cursor
exec xs_cursor @xs_cursor=@MyCursor output
while (@@fetch_status=0)
begin
fetch next from @mycursor
end
close @mycursor
go


--5-102
if exists(select name from sysobjects
where name='学生选课单' and type='P')
drop procedure 学生选课单
go
create procedure 学生选课单 @@lname_pattern varchar(30)
with recompile
as select (rtrim(YXBH)+''+rtrim(xm)) as '专业及姓名'
kcm as 课程名,jsm as 教师名
from 学生表 s
inner join 成绩表 t on s.xh-g.xh
inner join 课程表 t on g.kch=c.kch
inner join 教师表 t on g.jsh=c.jsh
where xm like @@lname_pattern
exec 学生选课单  '李%'

--5-103
if exists(select name from sysobjects
where name='encryp_xs' and type='P')
drop procedure encryp_xs
go
create procedure encryp_xs with encryption
as
select * from 学生表
go
exec sp_helptext encryp_xs


select c.id,c.text
from sysobjects c inner join sysobjects o on c.id=o.id
where o.name='encryp_xs'

--5-104
if exists(select name from sysobjects
where name='sp_showindexes' and type='P')
drop procedure sp_showindexes
go
create procedure sp_showindexes
@@table varchar(30)='sys%'
as
select o.name as table_name,
i.name as index_name,
indid as index_id
from sysindexes i inner join sysobjects o
on o.id=i.id
where o.name like @@table
go
exec sp_showindexes'教%'

--5-105
if exists(select name from sysobjects
where name='proc1' and type='P')
drop procedure proc1
go
--创建一个查询并不存在的表格的存储过程
create procedure proc1
as select * from does_not_exist
exec proc1


--5-106
select o.id,c.text
from sysobjects o inner join syscomments c
on o.id=c.id
where o.type='P' and o.name='proc2'

--5-107
if exists(select name from sysobjects
where name='proc2' and type='P')
drop procedure proc2
go

--5-108
create procedure proc2
as 
declare @middle_init char(1)
set @middle_init=null
select xh,middle_init=@middle_init
from 学生表
exec proc2

--5-109
select o.id,c.text
from sysobjects o inner join syscomments c
on o.id=c.id
where o.type='P' and o.name='proc2'

--5-110

if exists(select table_name from information_schema.views
where table_name='学生')
drop view 学生
go
create view 学生
as
select xh,xm,sfz from 学生表
go
select * from 学生

--5-111
if exists(select table_name from information_schema.views
where table_name='成绩单')
drop view 成绩单
go
create view 成绩单(学号,姓名,平均成绩) with encryption
as
select 成绩表.xh,xm,avg(cj) from 学生表,成绩表
where xm like '张%' and 学生表.xh=成绩表.xh
group by 成绩表.xh,xm
go
select * from 成绩单

select c.id,c.text
from syscomments c,sysobjects o
where c.id=o.id and o.name='成绩表'
go

--5-112
if exists(select table_name from information_schema.views
where table_name='学生_计算机')
drop view 学生_计算机
go
create view 学生_计算机(学号,姓名,身份证)
as
select xh,xm,sfz from 学生表
where ybxh='001'
with check option
go
select * from 成绩单

--5-113
if exists(select table_name from information_schema.views
where table_name='专业平均成绩统计')
drop view 专业平均成绩统计
go
create view 专业平均成绩统计(院系,平均成绩)
as
select yxbh,avg(cj) from 成绩表,学生表
where 成绩表.xh=学生表.xh
group by yxbh
select * from 专业平均成绩统计

--5-114
if exists(select table_name from information_schema.views
where table_name='行数统计')
drop view 行数统计
go
create view 行数统计
as select @@rowcount 查询返回的行数
select * form 学生表
select * from 行数统计

--5-115
--创建表格并插入记录
create table 供应商1(
supplyID int promary key check(supplyID between 1 and 150),
supplier char(50)
)
create table 供应商2(
supplyID int promary key check(supplyID between 151 and 300),
supplier char(50)
)
create table 供应商3(
supplyID int promary key check(supplyID between 301 and 450),
supplier char(50)
)
create table 供应商4(
supplyID int promary key check(supplyID between 451 and 600),
supplier char(50)
)

insert 供应商1 values('1','CalifoniaCorp')
insert 供应商1 values('5','BraziliaLtd')
insert 供应商2 values('231','FarEast')
insert 供应商2 values('280','NZ')
insert 供应商3 values('321','EuroGroup')
insert 供应商3 values('442','UKArchip')
insert 供应商4 values('475','India')
insert 供应商4 values('521','Afique')

--创建一个包所有4个表格的视图
create view 所有供应商视图(供应商编号,供应商地址)
as select * from 供应商1
union all
select * from 供应商2
union all
select * from 供应商3
union all
select * from 供应商4
--查询所有供应商的视图,命令如下,
select * from 所有供应商视图

 

分享到:
评论

相关推荐

    第二次实验.sql

    第二次实验.sql

    数据库 实验2 代码

    数据库 实验报告 代码 试验2 sqlsever 代码

    实验3答案-sql2.sql

    SQL查询二 2 通过本实验使学生掌握多表查询、子查询以及基本数据操作 二、实验内容 使用实验一建立的银行贷款数据库和表,完成以下查询。 1-4是多表查询和子查询,5-11是数据操作 查询经济性质为“国营”的...

    第二次实验1

    以实验二建立的数据库为基础,编写 C语言(或其它支持ODBC接口的高级程序设计语言) 数据库应用程序,按照如下步骤访问数据库:Step1. ODBC初始化,为O

    实验2答案-sql1.sql

    二、实验内容 使用实验一建立的银行贷款数据库和表,完成以下查询。 1-10题为单表查询,11-25为多表查询。 查询所有法人的法人代码、法人名称、经济性质和注册资金。 查询“B1100”银行的的银行名称和电话。 查询...

    sql.rar_西工大

    这个压缩包是西工大第二次上机实验SQL源代码。。

    【学习笔记】温习sql及MySQL的使用(数据库第2次实验)

    文章目录实验二:交互式SQL1.实验目的2.实验工具3.实验过程3.1 数据定义3.1.1 熟悉基本表的创建、修改及删除3.1.2 熟悉索引的创建和删除3.1.3 熟悉视图的创建和删除3.2 数据操作3.1.1 完成各类更新操作(插入数据,...

    VB.NET+SQL SERVER 成绩管理系统

    用VB.NET+SQL SERVER 开发的成绩管理系统,功能强大,多级管理,数据库设计规范,代码可读性第二次开发能力强,并有水晶报表等功能,附E-R图、关系图和实验报告

    第二、三次实验报告1

    1. 问题 1 2. 问题 2 1. 问题 1 2. 问题 2

    SQLServer大数据库教案设计.doc

    二、教学重点和难点: 重点:熟悉企业管理器与查询分析器 难点:系统数据库和系统表的作用 三、教学方法与手段: 注重实例分析,采用一次理论一次实验的教学方式。理论教学使用多媒体投影室。 四、教学课时: 3课时...

    SQL语法大全

    SQL语法大全 SQL语法大全 1. ASP与Access数据库连接: dim conn,mdbfile mdbfile=server.mappath("数据库名称.mdb") set conn=server.createobject("adodb.connection") conn.open "driver={microsoft access ...

    实验二 创建数据库和表-(不经典不传)

    一、实验目的与要求 通过实验,要求学生掌握和使用在SQL Server 2000企业管理器和查询分析器,创建和管理数据库及表的方法。 (1)创建和管理数据库。 (2)创建表、确定表的主码和约束条件。

    20150726-Linux系统及程序设计实验全部代码+4种动态网页语言完成综合性实验+2000字综合性实验报告详细

    题目名称 linux实验-基本指令1 题目关键字 linux实验-基本指令1 题目录入时间 2013-4-1 ...(2)第二种动态语言 (3)第三种动态语言 以下同。 2、实验总结(有对比有分析有感想) 题目创建人 题目注释

    交互式计算机实验室教学管理系统的设计与实现.doc

    第二,实验预习功能模块,里面包括预习测试功能,作为附加附加的功能模块可以帮 助学生学习,这个功能能够让学生提前了解实验过程和实验设备,对实验有一定的认知 ,在实际操作实验时更容易。第三,实验预约功能充分...

    4软件工程实验报告.doc

    "第 一 次实验 实验项目名称: 熟悉Visio " "时间: 年 月 日 " " " "实验环境及原理说明: " "(一)实验环境 " "1.硬件环境P4以上的个人计算机环境,要求内存不少于512MB,硬盘不小于20G.。 " "2.软件环境操作系统...

    工业互联网安全测试技术:数据库攻击.docx

    防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当web程序调用存储在数据库中恶意数据并执行SQL查询时,就发生了SQL二次注入。...

    东北大学软件学院程序实践(四)数据库实验报告

    第二部分: 写出如下SQL语句: 1.用DDL语言中的CREATE TABLE语句创建以上两张表,并确定指定了表的主码和备用码; 2.利用INSERT语句向每张表中以上四条记录; 3.写SQL语句检索两个出版人之一(比如说是Addison...

    实验室仪器预约管理系统源码 ShiYanShiWebMS.rar

    该实验室在线预约系统,采用了BS架构开发,利用.NET技术和sqlserver数据库进行了系统的开发, 系统是一款专业的实验室预约管理软件。灵活调度手段可以即时进行预订,并且自动通知和与会者 确认。所有用户无需安装...

    数据库系统原理实验.docx

    因为完整性约束绝大部分是在定义表结构的时候完成的,因此可能需要多次定义表,如果表名发生重复,可以先将旧表删除再重建 二、实验设备(环境)及要求 利用实验1所安装的RDBMS及其交互查询工具来操作SQL语言 三、...

Global site tag (gtag.js) - Google Analytics