当前位置:   article > 正文

数据库实验报告--SQL server_sqlserver数据库实验

sqlserver数据库实验

前言

       SQL Server是一种关系型数据库管理系统(RDBMS),由Microsoft开发和维护。它是一款功能强大、稳定可靠的数据库软件,支持事务、数据存储、管理和查询等各种功能,是企业级应用的首选数据库。SQL Server可以在Windows操作系统上运行,并提供了大量的管理工具和API,可以支持多个用户或应用程序同时访问数据库。SQL Server还提供了多种安全功能,包括数据加密、访问控制和身份验证机制等,可以保护数据库的安全性和完整性。此外,SQL Server还支持多种语言和平台,可以方便地与其他应用程序进行集成和交互,可用于各种应用场景,包括Web应用、企业应用、商业智能和数据仓库等。

目录

1 数据库、表的创建与管理

 1.1 创建数据库

 1.2 创建表

 1.3 插入数据

 1.4 数据操作

2 数据完整性的设置

 2.1 设置外键

 2.2 创建unique约束

 2.3 创建、删除check约束

 2.4 创建、删除规则

3 数据检索

 3.1 单表数据查询

 3.2 多表查询与子查询

4 索引和视图

 4.1 创建索引

 4.2 创建视图 

 4.3 删除索引和视图

5 存储过程和触发器

 5.1 创建存储过程

 5.2 创建触发器


1 数据库、表的创建与管理

 1.1 创建数据库

       利用SQL Server Management Studio创建一个名为teaching数据库,初始大小为10MB,增长速度为10%,其他均采用默认设置。

 1.2 创建表

       在查询编辑器中输入创建表的代码,分别创建student、course、score、teacher、 class、teach_class这6张表

创建student表代码:

  1. create table teaching.dbo.student(
  2. studentno nchar(11) not null,
  3. sname nvarchar(8) null,
  4. sex nchar(1) null,
  5. birthday datetime null,
  6. classno nchar(7) null,
  7. point smallint null,
  8. phone nchar(12) null,
  9. Email nvarchar(20) null,
  10. constraint pk_student primary key
  11. (studentno asc))

创建course表代码:

  1. create table teaching.dbo.course(
  2. courseno nchar(6) not null,
  3. cname nchar(20) null,
  4. type nchar(8) null,
  5. period tinyint null,
  6. credit numeric(4,1) null,
  7. constraint pk_course primary key
  8. (courseno asc))

创建score表和teacher表代码:

  1. create table teaching.dbo.score(
  2. studentno nchar(11) not null,
  3. courseno nchar(6) not null,
  4. usually numeric(6,2) null,
  5. final numeric(6,2) null,
  6. constraint pk_score primary key
  7. (studentno asc,courseno asc))
  8. create table teaching.dbo.teacher(
  9. teacherno nchar(6) not null,
  10. tname nchar(8) null,
  11. major nchar(10) null,
  12. prof nchar(10) null,
  13. department nchar(12) null,
  14. constraint pk_teacher primary key
  15. (teacherno asc))

创建class表、teach_class表代码:

  1. create table teaching.dbo.class(
  2. classno nchar(7) not null,
  3. classname nchar(12) null,
  4. department nchar(12) null,
  5. monitor nchar(8) null,
  6. constraint pk_class primary key
  7. (classno asc))
  8. create table teaching.dbo.teach_class(
  9. teacherno nchar(6) not null,
  10. classno nchar(7) not null,
  11. courseno nchar(6) not null,
  12. constraint pk_teach_class primary key
  13. (teacherno asc,classno asc,courseno asc))

 1.3 插入数据

       分别对这6张表输入记录(每张表不少于5条记录)

向student表插入数据:

  1. Insert into teaching.dbo.student
  2. (studentno,sname,sex,birthday,classno,point,phone,Email)
  3. Values
  4. ('082211120','赵某','男','1989-12-11','1701','101','15200000000','zhao@163.com')
  5. Insert into teaching.dbo.student
  6. (studentno,sname,sex,birthday,classno,point,phone,Email)
  7. Values
  8. ('082211121','余某','男','1989-12-12','1702','102','15211111111','yu@163.com')
  9. Insert into teaching.dbo.student
  10. (studentno,sname,sex,birthday,classno,point,phone,Email)
  11. Values
  12. ('082211122','程某','女','1989-12-13','1703','103','15222222222','cheng@163.com')
  13. Insert into teaching.dbo.student
  14. (studentno,sname,sex,birthday,classno,point,phone,Email)
  15. Values
  16. ('082211123','周某','男','1989-12-14','1704','104','15233333333','zhou@163.com')
  17. Insert into teaching.dbo.student
  18. (studentno,sname,sex,birthday,classno,point,phone,Email)
  19. Values
  20. ('082211124','霍某','女','1989-12-15','1705','105','15244444444','huo@163.com')

 student 表数据

向course表插入数据:

  1. Insert into teaching.dbo.course
  2. Values('c05120','数据结构','必修','60','1')
  3. Insert into teaching.dbo.course
  4. Values('c05121','操作系统','选修','61','2')
  5. Insert into teaching.dbo.course
  6. Values('c05122','数据逻辑','必修','62','3')
  7. Insert into teaching.dbo.course
  8. Values('c05123','计算方法','必修','63','4')
  9. Insert into teaching.dbo.course
  10. Values('c05124','大学体育','选修','64','5')

course表数据

向score表插入数据:

  1. Insert into teaching.dbo.score
  2. Values('0822111201','c06101','89','91')
  3. Insert into teaching.dbo.score
  4. Values('0822111202','c06102','88','92')
  5. Insert into teaching.dbo.score
  6. Values('0822111203','c06103','87','93')
  7. Insert into teaching.dbo.score
  8. Values('0822111204','c06104','86','94')
  9. Insert into teaching.dbo.score
  10. Values('0822111205','c06105','85','95')

score表数据

向teacher表插入数据:

  1. Insert into teaching.dbo.teacher
  2. Values('t05001','赵某某','数据结构','教授','计算机学院')
  3. Insert into teaching.dbo.teacher
  4. Values('t05002','余某某','操作系统','教授','计算机学院')
  5. Insert into teaching.dbo.teacher
  6. Values('t05003','程某某','数据逻辑','教授','经济学院')
  7. Insert into teaching.dbo.teacher
  8. Values('t05004','周某某','计算方法','导师','计算机学院')
  9. Insert into teaching.dbo.teacher
  10. Values('t05005','霍某某','大学体育','教授','经济学院')

teacher表数据

向class表插入数据:

  1. Insert into teaching.dbo.class
  2. Values('080601','机械','机械学院','马飞')
  3. Insert into teaching.dbo.class
  4. Values('080602','机械','机械学院','李飞')
  5. Insert into teaching.dbo.class
  6. Values('080603','机械','机械学院','张飞')
  7. Insert into teaching.dbo.class
  8. Values('080604','机械','机械学院','周飞')
  9. Insert into teaching.dbo.class
  10. Values('080605','机械','机械学院','余飞')

class表数据

向teach_class表插入数据:

  1. Insert into teaching.dbo.teach_class
  2. Values('t05001','080601','c05120')
  3. Insert into teaching.dbo.teach_class
  4. Values('t05002','080602','c05121')
  5. Insert into teaching.dbo.teach_class
  6. Values('t05003','080603','c05122')
  7. Insert into teaching.dbo.teach_class
  8. Values('t05004','080604','c05123')
  9. Insert into teaching.dbo.teach_class
  10. Values('t05005','080605','c05124')

 teach_class表数据 

 1.4 数据操作

      向student表插入、删除、修改一条记录

插入一条记录:

  1. insert into teaching.dbo.student
  2. values('0937221508','平静','女','1998-02-12','1709','109','15299999999','ping@qq.com')

删除一条记录:

  1. delete from teaching.dbo.student
  2. where studentno='0937221508'

修改一条记录:

  1. update teaching.dbo.student set point=888
  2. where studentno='0937221508'

通过本次实验,我掌握了创建、修改数据库的方法及管理数据库的方法,并掌握了创建、修改表结构的方法及插入、更新和删除表数据的方法,让我对SQL server2008的使用更加得心应手。总而言之,本次实验的内容让我受益匪浅,也为数据库这门课程的学习做了铺垫作用。

2 数据完整性的设置

 2.1 设置外键

       利用SQL Server Management Studio将teaching数据库中score表的courseno列设置为引用表course的外键。

 2.2 创建unique约束

     在teaching数据库中class表的classname创建UNIQUE约束。

  1. alter table class
  2. add constraint u_classname
  3. unique nonclustered(classname)
  4. go

 2.3 创建、删除check约束

      为teaching数据库中student表的birthday列创建check约束,规定学生的年龄在17~25之间,为course表的credit列创建check约束,规定学分的取值范围为1~6,删除check约束。

  1. alter table student
  2. add constraint ck_birthday
  3. check
  4. (year(getdate()-year(birthday)) between 17 and 25)
  5. go
  6. alter table course
  7. add constraint ck_credit check(credit>=1 and credit<=6)
  8. Go
  9. alter table course
  10. drop constraint ck_credit

 2.4 创建、删除规则

     为teaching数据库创建规则prof_rule,规定教师职称取值只能为”助教”、“讲师”、“副教授”、“教授”,并将其绑定到teacher表的Prof列,删除创建的规则。

  1. create rule prof_rule
  2. as @prof='助教' and @prof='讲授' and @prof='副教授' and @prof='教授'
  3. Go
  4. Exec sp_bindrule 'prof_rule','teacher.prof'
  5. EXEC sp_unbindrule 'teacher.prof'
  6. Drop rule prof_rule

通过本次实验,我掌握了数据完整性的类型和实现机制,并掌握了约束、规则对象的创建和修改,实验中,在删除创建规则中遇到了一些问题,通过自己上网查找资料和翻阅书籍,最终得以解决,也让我对数据库这部分内容更加清晰的了解,希望自己在今后的学习中更加的努力认真。

3 数据检索

 3.1 单表数据查询

     (1)查询所有课程的课程编号、课程名和学分,查询160501班所有学生的基本信息

  1. select courseno,cname,credit
  2. from teaching.dbo.course
  3. select * from teaching.dbo.student
  4. where classno='160501'

 

     (2)查询student表中所有年龄大于20岁的男生的姓名和年龄

  1. select sname as '姓名',
  2. YEAR(getdate())-YEAR(birthday)as'年龄'
  3. from teaching.dbo.student
  4. where sex='男' and
  5. YEAR(getdate())-YEAR(birthday)>20

 

      (3)查询计算机学院教师的专业名称

  1. select prof from teaching.dbo.teacher
  2. where department='计算机学院'

 

     (4)查询每名学生的学号、选修课程数目、总成绩,并将查询结果存放到生成的“学生选课统计表”

  1. use teaching
  2. go
  3. if exists (select * from sys.objects where name='学生选课统计表')
  4. drop table 学生选课统计表
  5. select studentno,COUNT(*) as '选修课程数目',sum(final) as '总成绩' into 学生选课统计表
  6. from score
  7. group by studentno
  8. select * from 学生选课统计表

 

      (5)查询student表中所有学生的基本信息,查询结果按班级号classno升序排序,同一班级中的学生按入学成绩point降序排列

  1. select * from teaching.dbo.student
  2. order by classno,point desc

 

      (6)查询各班学生的人数(按班级分组),查询各班期末成绩的最高分和最低分

  1. select COUNT(*) as '人数',MAX(final) as '最高分',
  2. MIN(final) as '最低分'
  3. from teaching.dbo.student,teaching.dbo.score
  4. where student.studentno=score.studentno
  5. group by classno
  6. order by classno

 

      (7)查询教授一门及以上课程的教师编号、课程编号和任课班级

  1. select teacherno,courseno,classno
  2. from teaching.dbo.teach_class
  3. where exists (select courseno,COUNT(*)
  4. from teaching.dbo.course group by courseno
  5. having COUNT(*)>=1)

     (8)查询课程编号以c05开头,被三名及以上学生选修,且期末成绩的平均分高于75分的课程号、选修人数和期末成绩平均分,并按平均分降序排序。 

  1. use teaching
  2. go
  3. select courseno,count(studentno)as '选修人数',avg(final) as '期末平均分'
  4. from score
  5. where courseno like 'c06%' and final is not null
  6. GROUP BY courseno
  7. having COUNT(studentno)>=3 and AVG(final)>75
  8. order by AVG(final) desc

 

通过本次实验,我掌握了SELECT各个子句的功能和检索数据的方法,掌握WHERE子句中LIKE、IN、BETWEEN、IS等逻辑运算符的使用,掌握了聚合函数的使用,本次实验,编写代码途中出现点小差错,导致运行失败,但经过自己查找资料,最终问题得以解决,让我更加对SQL server的使用游刃有余。希望自己在今后的实验中严谨认真,做好每一次实验。

 3.2 多表查询与子查询

     (1)查询所有班级的期末成绩平均分,并按照平均分降序排序

  1. select classno,AVG(final)
  2. from teaching.dbo.score join teaching.dbo.teach_class on
  3. score.courseno=teach_class.courseno
  4. group by classno
  5. order by AVG(final) desc

 

      (2)查询教师基本信息和教授课程信息,其中包括未分配课程的教师信息

  1. select teacher.teacherno,tname,major,prof,courseno
  2. from teaching.dbo.teacher left join teaching.dbo.teach_class on
  3. teacher.teacherno=teach_class.teacherno

 

      (3)查询两门及以上课程的期末成绩超过80分的学生姓名及其平均成绩

  1. select sname,AVG(final)
  2. from teaching.dbo.score join teaching.dbo.student on score.studentno=student.studentno
  3. where exists (select courseno,COUNT(*)
  4. from teaching.dbo.score group by courseno having COUNT(*)>=2)
  5. and final>80
  6. group by sname

 

      (4)查询没有被任何学生选修的课程编号、课程名称和学分(子查询)

  1. select courseno,cname,credit from teaching.dbo.course
  2. where not exists (select * from teaching.dbo.score
  3. where score.courseno=course.courseno)

 

      (5)查询入学成绩最高的学生学号、姓名和入学成绩(子查询)

  1. select studentno,sname,point
  2. from teaching.dbo.student
  3. where studentno in (select top 1 studentno from teaching.dbo.student
  4. order by point desc)

 

      (6)查询同时教授c05120号和c05121号课程的教师信息(子查询)

  1. select * from teaching.dbo.teacher left join teaching.dbo.teach_class
  2. on teacher.teacherno=teach_class.teacherno
  3. where courseno='c05120' and teacher.teacherno in
  4. (select teacherno from teaching.dbo.teach_class where courseno='c05121')

      (7)查询每门课程的课程号、课程名和选修该课程的学生人数,并按所选人数升序排序

  1. select courseno,cname,COUNT(*)
  2. from teaching.dbo.course
  3. group by courseno,cname
  4. order by COUNT(*)

 

      (8)使用游标输出学生姓名、选修课程名称和期末考试成绩

  1. declare student_cursor cursor
  2. for select sname,cname,final
  3. from teaching.dbo.student join teaching.dbo.score on student.studentno=score.studentno
  4. join teaching.dbo.course on score.courseno=course.courseno
  5. open student_cursor
  6. declare @sname nchar(8),@cname nchar(20),@final numeric(6,2)
  7. fetch next from student_cursor into @sname,@cname,@final
  8. print '学生名字课程名称期末成绩'
  9. print'-----------------------'
  10. while @@FETCH_STATUS=0
  11. begin
  12. print @sname+@cname+cast(@final as nchar(6))
  13. fetch next from student_cursor into @sname,@cname,@final
  14. end
  15. close student_cursor
  16. deallocate student_cursor

通过本次实验,我掌握了多表连接的各种方法(内连接和外连接),掌握了子查询的方法(相关子查询和不相关子查询),还有游标处理集的基本过程,会使用JOIN ON连接两个及两个以上表,查询到了表中相关信息,也学会了在SELECT查询语句中再嵌套一个SELECT语句,还学会了使用游标对查询结果集进行处理。总之,本次的多表查询与子查询的实验,我受益匪浅,更坚定了我对这门课程的学习的决心。 

4 索引和视图

 4.1 创建索引

     (1)在teaching数据库的student表的classno字段创建非聚集非唯一索引cu_classno

  1. create nonclustered index cu_classno
  2. on teaching.dbo.student(classno)

      (2)在teaching数据库中的teacher表的tname列上创建非聚集唯一索引UQ_name ,若该索引已存在,则删除后重建

  1. if exists(select name
  2. from sysindexes
  3. where name='UQ_name')
  4. drop index teacher.UQ_name
  5. go
  6. create index UQ_name on teaching.dbo.teacher(tname)

 4.2 创建视图 

创建视图步骤: 

 1.在“对象资源管理器”窗口中展开“数据库”下的teaching子目录。

 2.右击“视图”选项,从弹出的快捷菜单中选择“新建视图”命令,进入视图设计页面。

 3.同时在弹出的“添加表”对话框中,选择course和score两个表,单击“添加”按钮。

 4.点击“添加表”对话框中的“关闭”按钮,返回SQL Server Management Studio的视图设计界面进行设计。

     

   

 (1)在teaching 数据库中创建视图v_teacher_course,包含教师编号、教师姓名、职称、课程号、课程名和任课班级,通过视图v_teacher_course将教师编号为t05017的教师职称更改为”副教授”

  1. create view v_teacher_course
  2. as
  3. select teacher.teacherno,tname,
  4. prof,course.courseno,cname,classno
  5. from teaching.dbo.teacher,teaching.dbo.course,teaching.dbo.teach_class where
  6. teacher.teacherno=teach_class.teacherno
  7. and
  8. teach_class.courseno=course.courseno
  9. go
  10. update v_teacher_course
  11. set prof='副教授'
  12. where teacherno='t05107'
  13. Go

      (2)修改v_course_avg视图的定义,添加WITH CHECK OPTION选项

  1. alter view v_course_avg as
  2. select course.courseno,
  3. cname,AVG(final) as avg
  4. from teaching.dbo.course,teaching.dbo.score
  5. group by course.courseno,cname
  6. having AVG(final)>80
  7. with check option

 4.3 删除索引和视图

  1. drop index cu_classno on teaching.dbo.student
  2. drop view v_course_avg

通过本次实验,我通过创建索引理解什么是聚集和非聚集,什么是唯一索引,在course表创建、删除视图,给视图添加条件约束。在实验中,创建视图总显示CREATE VIEW必须是批处理中仅有的语句,导致运行失败,经过资料的查询,可能是在这段代码之前还有其他语句是同时处理,需要在这段代码的开始和结束加一个GO才行,最终问题也成功解决,也弥补了自己对SQL server使用的盲区。

5 存储过程和触发器

 5.1 创建存储过程

     (1)创建一个存储过程ProcNum,查询每个班级中学生的人数,按班级号升序排序

  1. create proc procnum as select classno,
  2. COUNT(*) as 人数 from teaching.dbo.student
  3. group by classno order by classno asc

      (2)利用SQL语句创建一个带有参数的存储过程ProcInsert,向score表插入一条选课记录,并查询该学生的姓名、选修的所有课程名称、平时成绩和期末成绩

  1. create proc ProcInsert @sna nvarchar(255),@cna nvarchar(255),
  2. @final float,@usually float as insert into teaching.dbo.score
  3. values(@sna,@cna,@final,@usually) select sname,cname,usually,
  4. final from teaching.dbo.student join teaching.dbo.score on student.studentno=score.studentno
  5. join teaching.dbo.course on course.courseno=score.courseno

      (3)利用SQL语句创建一个存储过程ProcAvg,查询指定课程的平均分。班级号和课程名称由输入参数确定,计算出的平均分通过输出参数返回,若该存储过程已存在,则删除后重建

  1. if exists (select * from sysobjects where name='procavg')
  2. drop proc procavg
  3. go
  4. create proc procavg
  5. @classno nvarchar(255),@cname nvarchar(255),
  6. @average float output
  7. as select @average=AVG(final*0.8+usually*0.2)
  8. from teaching.dbo.student join teaching.dbo.score on student.studentno=score.studentno
  9. join teaching.dbo.course on course.courseno=score.courseno
  10. where classno=@classno and cname=@cname

 5.2 创建触发器

     (1)创建一个AFTER触发器trigsex,当插入或修改student表中性别字段sex时,检查数据是否只为“男”或“女”

  1. use teaching
  2. go
  3. create trigger trigsex on teaching.dbo.student after insert,update
  4. as begin declare @sex nvarchar(255) select @sex=sex from teaching.dbo.student
  5. if @sex='男' or @sex='女' begin raiserror('性别只能为男或女', 16,2)

      (2)利用SQL语句创建一个AFTER触发器trigforeign,当向score表中插入或修改记录时,如果插入或修改的数据与student表中数据不匹配,即没有对应的学号存在,则将此记录删除

  1. use teaching
  2. go
  3. create trigger trigforeign on score after insert ,update as
  4. begin declare @studentno nvarchar(255) select
  5. @studentno=studentno from teaching.dbo.score if not exists (select * from
  6. student where studentno=@studentno) begin
  7. raiserror('不能插入学号不存在的学生的信息',16,2) end end

     (3)利用SQL语句创建一个AFTER触发器trigclassname,当向class表中插入或修改数据时,如果出现班级名称重复则回滚事务,若该触发器已存在,则删除后重建

  1. if exists (select * from sysobjects where name='trigclassname')
  2. drop trigger trigclassname
  3. go
  4. use teaching
  5. go
  6. create trigger trigclassname on class after insert,update
  7. as begin declare @classname nvarchar(255)
  8. select @classname=classname from class
  9. if exists (select classname from class) begin
  10. raiserror('班级名称不能重复',16,2) rollback end end

通过本次实验,我掌握了创建、管理存储过程的方法,并学会创建AFTER触发器,当重复则回滚事务,如果触发器存在则删除触发器。在实验中,创建触发器时,不知道为什么一直出现“对象不存在或对此操作无效”的提示,最后经过查找资料才知需要在前面加入“use <数据库名>  go”代码才可以,最后问题也迎之而解,SQL Server方面的知识也更加全面。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/590661
推荐阅读
相关标签
  

闽ICP备14008679号