SqlServer实验报告

该博客展示了多个关于数据库查询的实例,包括使用子查询、变量和联接操作来获取特定信息,如男性学生的大学英语成绩、选修特定课程的学生详情、相同成绩的学生等。此外,还涉及课程表的结构调整、年龄计算、学生信息筛选以及课程选择情况统计等复杂SQL操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 实验内容

   

使用数据库和表(表中要有大量有效数据).

1 学生表(学号  姓名  专业名  性别  生日  照片 备注 团员否)

2 课程表(课程号  课程名称  任课教师   学分)

 3 成绩表(学号  课程号  成绩 学分)

实验内容:

1 查出大学英语男生的成绩情况:学号, 课程号,成绩 (尽量使用两种办法分别实现)

:

第一种

select  学号,课程号,成绩 from 成绩表 where 学号 in

(select  学号 from 学生表 where 性别='男') and 课程号 in (select 课程号 from 课程表 where 课程号='D005' )

第二种

declare @kch nchar(4)

select @kch=课程号 from 课程表 where 课程名称='英语'

select  学号,课程号,成绩 from 成绩表 where 课程号=@kch and 学号 in (select 学号 from 学生表 where 性别='男')

2 查出选了高等数学(上和下)的学生情况:学号,姓名,生日,课程号,名称,成绩

:

select * into temp1 from 成绩表 where 课程号='D002' or 课程号='D003' order by 课程号

select temp1.学号,temp1.课程号,课程名称,temp1.成绩 into temp2 from temp1,课程表 where temp1.课程号=课程表.课程号

select 学生表.学号,姓名,出生日期,temp2.课程号,temp2.课程名称,temp2.成绩  from temp2,学生表 where temp2.学号=学生表.学号 order by 课程号

3 查出与李大方的大学英语成绩相同的其它学生的情况:学号,姓名,课程号,名称,成绩

:

declare @xh char(10)

select @xh=学号 from 学生表 where 姓名='李大方'

declare @kch nchar(4)

select @kch=课程号 from 课程表 where 课程名称='英语'

declare @cj numeric(4,1)

select @cj =成绩 from 成绩表 where 学号=@xh

select 学号,成绩表.课程号 ,课程表.课程名称,成绩 into 临时表 from 成绩表,课程表 where 成绩表.课程号=@kch and 成绩=@cj and  成绩表.课程号=课程表.课程号

select 学生表.学号,学生表.姓名,临时表.课程号 ,临时表.课程名称,临时表.成绩 into temp6 from 学生表,临时表 where  临时表.学号=学生表.学号

delete from temp6 where 姓名='李大方'

select *from temp6

4 查出哪些学生没有选修大学英语:学号,姓名

: select  姓名 ,学号 from 学生表 where 学号 not in (select 学号 from 成绩表 where 课程号='D005' )

5 查出选修了大学英语学生成绩情况,并按成绩值降序显示:学号,课程号,成绩

:select 学号,课程号,成绩 from 成绩表 where 课程号='D005'order by 成绩 desc

6 排序:先按性别排,性别相同则按是否团员排,再相同就按生日降序排.

:select *from 学生表 order by 性别, 是否党员 ,出生日期 asc

7 根据生日计算,把学生表中年龄最小的两个男生同学查询出来

:select top 2 *from 学生表 order by getdate()-出生日期 asc

8 把年龄较大的一半学生显示出来 

:select top 50 percent *from 学生表 order by getdate()-出生日期 desc

9  求出李大方比李四方大多少岁。

 方法1:直接使用一条SQL命令实现

select convert(smallint,(datediff(day ,出生日期,GETDATE()))*1.0/365 ) -( select convert(smallint,(datediff(day ,出生日期,GETDATE()))*1.0/365 )   from 学生表 where  姓名='李四方') as 年龄  from 学生表 where  姓名='李大方'

 方法2:使用变量法实现。定义变量,把李方大和李四方两个同学的年龄通过生日计算出来保存两个变量中,最后求出二人相差多少岁

declare @天数1 smallint

declare @天数2 smallint

select @天数1=(datediff(day ,出生日期,GETDATE())) from 学生表 where 姓名='李四方'

select @天数2=(datediff(day ,出生日期,GETDATE())) from 学生表 where 姓名='李大方'

print '李大方比李四方大'+convert(nchar(2),(@天数2- @天数1)/365)+'岁!'

10 向课程表中添加一个列:课程编码 nchar(4) , 要求课程编码的第一个字母必须是C,第2-4个字符必须是数字1-9中一个

alter table 课程表 add 课程编码 nchar(4) check (课程编码 like '[C][0-9][0-9][0-9]')

11 从学生表中查询出:学号,姓名,年龄

select  学号,姓名,year(getdate())-Year(出生日期)  as 年龄 from 学生表

12 查询出生日为今天的学生信息

select * from 学生表 where (day(GETDATE())-day(出生日期))%365=

13 从成绩表中查出有哪些课程被选

select 课程名称 from 课程表 where 课程号 in

(select distinct 课程号 from 成绩表 )

14 从成绩表中查询已选课程有几门

select count(课程名称) from 课程表 where 课程号 in

(select distinct 课程号 from 成绩表 )

或者

select count(distinct 课程号) from 成绩表

15 从学生表中,查出1985—1991年之间出生的学生

select * from 学生表 where year(出生日期) between 1985 and 1991

16 使用between and方法,查出成绩表中成绩在80-95之间的情况

select *from 成绩表 where 成绩 between 80 and 95

17 从成绩表中查出课程101,104课程的情况

select * into temp5 from 成绩表 where 课程号='D001'or 课程号='D002'

select *from temp5,课程表 where temp5.课程号=课程表.课程号

18 查出家庭住址中含有“脾县”二字的学生情况

select *from 学生表 where 家庭住址 like  '%[郫][县]%'

19 查出所有姓李和杨的学生情况,请使用至少两种方法实现

第一种

select *from 学生表 where left(姓名,1)='李'or left(姓名,1)='杨'

第二种

select *from 学生表 where substring (姓名,1,1)='李'or substring (姓名,1,1)='杨'

第三种

select *from 学生表 where left(姓名,1) like '[李杨]'

第四种

select *from 学生表 where 姓名 like '[李杨]%'

第五种

select *from 学生表 where left(姓名,1) in('李','杨')

20 把学生表拆分成男,女生两个独立的表. 再把两个表合并到一个新表”学生总”

select* into temp1 from 学生表 where 5>6

select * into 男生表 from 学生表 where 性别='男'

select * into 女生表 from 学生表 where 性别='女'

insert into temp1   select *from 男生表

insert into temp1   select *from 女生表

21 查出计算机基础和大学英语课程的成绩情况

 select 课程名称,成绩 from 课程表,成绩表  where  课程表.课程号=成绩表.课程号 and (成绩表.课程号='D005'or 成绩表.课程号='D008')

order by 课程名称

本文档为数据库上机实验报告,是自己认认真真一步一步写的,报告包含试验中的具体步骤,过程以及代码和实验结果截图,和实验总结。 实验一 实验题目: 数据库管理系统的使用 实验目的: 掌握SQL SERVER2005的使用和数据库设计的一般方法。 实验内容: (1)SQL SERVER2005的使用 (2)数据库的设计过程并利用SQL SERVER2005建立数据库。 实验二 实验题目: 数据库的定义 实验目的:掌握数据表建立、修改、删除、索引的SQL语句。 实验内容: (1)数据表的建立 (2)数据表的修改 (3)数据表的删除 (4)数据表的索引建立 为S表的DEPT建立唯一索引 (5)视图的建立与删除 建立一个计算机系学生基本信息视图CSV(SNO,SNAME,SEX,AGE) 查询1983年以后出生的计算机系学生基本信息。 建立一个计算机系学生成绩视图JSGV(SNO,CNO,GRADE)。 查询计算机系学生选课多于3门的学生学号。 查询计算机系学生2号课不及格的学生学号和成绩。 实验三 实验题目: 数据表的操作 实验目的: 掌握数据表数据操作的SQL语句。 实验内容: SQL语句插入数据操作 SQL语句修改数据操作 SQL语句删除数据操作 SQL语句查询数据操作 维护数据SQL语句: (1)在学生表中插入一新生信息(‘200213808’,’HUJING’,’女’,22,’计算机’) (2)删除数据库中学号为’200213801’的退学学生有关信息。 (3)将计算机系学生2号课成绩全部提高5%。 查询数据SQL语句: (4)统计有学生选修的课程门数。 (5)统计HU老师所授每门课程的学生平均成绩。 (6)统计所有选修人数多于20的课程号和选课人数,并按人数降序排列,若人数相等,则按课程号升序排列。 (7)检索所有缓考即成绩为NULL的同学学号、姓名和缓考课程号。 (8)检索‘OS’课成绩高于该课平均成绩的同学学号。 (1) 检索计算机系女生的学号和姓名。 (2) 检索全体学生姓名、出生年份和所在系。 (3) 检索未选修任何课程的学生学号。 (4) 检索WANG老师所授课程号、课程名。 (5) 检索所有姓LI同学的基本信息。 (6) 检索选修‘DATABASE’课程的学生学号。 (7) 检索年龄介于LIPING同学年龄和28岁之间的学生基本信息。 (8) 检索选修TIAN老师所授全部课程的学生学号。 实验四 实验题目: T-SQL编程 实验目的: 掌握T-SQL语句的使用。 实验内容: 1.定义一个表变量,用来存储两名学生的学号,姓名,所在系。 2.编写一个自定义的函数,该函数接受一个学生姓名,返回其学生表中基本信息及选课情况。 3.试用CASE语句输出学生表中各年龄段的学生人数。 4.编写存储过程,以系别作为参数,统计指定系别的人数,并作为存储过程的输出。 实验题目: 数据库的完整性 实验目的: 掌握数据库的完整性约束定义,完整性检查及违约处理方式。 掌握触发器的定义及使用。 实验内容: 1. 定义S, C表的完整性约束 2. 定义SC表的完整性约束,要求当其被参照表发生删除操作时,违约处理的方式为级联,当其被参照表发生修改操作时,违约处理的方式为拒绝。 3. 触发器 ☆ 建立一DML触发器,每当学生的成绩发生更新时,将更新的学号,成绩存入g-log表内 ☆ 建立一个INSTEAD OF触发器,每当修改课程表中记录时,利用触发器动作替代修改操作。 ☆ 建立一个DDL 触发器,不允许删除数据库中表,并作出响应。 实验六 实验题目: 数据库的安全性 实验目的: 掌握SQL SERVER 2005的安全控制机制 实验内容: 1. 创建登录 创建lg1,lg2,并设定口令 2. 定义用户 定义user1,user2,user1以lg1登录,user2以lg2登录,user1定义角色ddl_admin,datareader,datawriter 3. 掌握SQL SERVER 2005架构和用户分离的概念 为user1创建架构u1,并建立test表,通过授权模式的方法,授权给user2表访问test的权限 4. 数据库的授权、收权语句 ☆ 将查询SC表和修改GRADE属性的权限授予用户user1。 ☆ 将对表S的插入权限授予用户user2,并允许他将此权限授予其他用户。 ☆ 收回所有用户对表S的插入权限。 实验七 实验题目: 数据库的设计 实验目的: 掌握数据库的概念结构设计和逻辑结构与设计,掌握ER图的表示方法即如何将ER模型转化为关系模型 1.学校有若干系,每个系有若干班级和教研室,每个教研室有若干教师,其中有教授和副教授每人各带若干研究生,每个班有若干学生,每个学生选修若干课程,每门课有若干学生选修。 2.某工厂生产若干产品,每种产品由不同的零件组成,有的零件可用在不同的产品上。这些零件由不同的原材料组成,不同零件所用的材料可以相同。有些零件按所属的不同产品分别放在仓库中,原材料按照类别放在若干仓库中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值