数据库原理与应用实验

目录

实验一、数据库的定义和维护

实验二、数据库的简单查询和连接查询

实验三、数据库的嵌套查询和组合查询

实验四、数据库完整性和数据安全性实验



实验一、数据库的定义和维护

1.使用 T-SQL 语句创建数据库
1)在 Query Analyzer 工具下建立学生选课数据库(XSXK)。
2)根据学生选课数据库的数据库物理结构设计,定义基本表、定义相应的约束条件和索
引。
3)数据库中各表的物理结构和要求如下:
(1) student(学生表)
字段名称 数据类型 长度大小 允许空 备注
sno  char 10  学号
sname char 8 姓名
ssex char 2 性别
sage smallint √ 年龄
sdept char 30 √ 所在院系
stel char 13 √ 联系电话
① 主键:sno
② 索引:sname(升序)
③ check 约束:年龄大于 18
④ default 约束:性别默认为男
⑤ 更改学生表的结构,取消姓名不允许为空的约束。
(2)Course (课程表)
字段名称 数据类型 长度大小 允许空 说明
cno char 10 课程编号
cname char 16 课程名称
ccredit smallint 学分
cpno char 10 √ 先行课
① 主键:cno
② 索引: cno (升序)+ccredit(降序)
③ 更改课程表的结构,增加属性列教师 ctech(类型是 char )
3)SC(选课表)
字段名称 数据类型 长度大小 允许空 备注
sno char 10 学号
cno char 10 课程编号
grade smallint √ 成绩
主键:sno+cno
4)各个表的参照完整性约束
(1) FK_SC_ student
主键表:student 外键表:SC
主键:sno 外键:sno
(2) FK_SC_ course 
主键表:course 外键表:SC
主键:cno 外键:cno
3.使用 T-SQL 实现学生选课数据库的如下操作:
1)向学生选课数据库中的每个基本表中录入若干条记录,要求记录满足基本表定义的约
束条件。(学生、课程和选课表中各录入 10 条以上记录)。
2)通过 Query Analyzer 实现对学生选课数据库的数据增加、数据删除和数据修改操作。
(1)对于每个学生,求学生的选课门数和平均成绩,并把结果存入学生选课数据库中。
(2)将数据库原理与应用课程的学分修改为 4。
(3)将姓名为“王华”的学生选修数据库原理及应用课程的成绩增加 5 分。
(4)删除选课表中成绩低于 40 分的记录。
(5)删除学号为 2100001 的学生记录,并讨论该删除操作所受到的约束。
(6)删除所有选修课程“JAVA”的选课记录。
(7)将管理学院全体学生的成绩置为空。
(8)删除学生李萍的所有选课记录。

--创建XSXK数据库
CREATE database XSXK;

--创建student表、Course表、SC表
CREATE TABLE student(
sno char(10) PRIMARY KEY,
sname char(8),
ssex char(2) DEFAULT('男'),
sage smallint CHECK(sage>=18),
sdept char(30),
stel char(13)
);

CREATE TABLE Course(
cno char(10) PRIMARY KEY,
cname char(16),
ccredit smallint default null,
cpno char(10)
);
select * from Course

CREATE TABLE SC(
sno char(10),
cno char(10),
grade smallint,
constraint c PRIMARY KEY(sno,cno)
);

--建立索引
create unique index c1 on student(sname ASC);
create unique index c6 on Course(cno ASC,ccredit DESC);
select cno,ccredit from Course where cname in ('java','高等数学');

--建立参照完整性
ALTER TABLE SC ADD CONSTRAINT FK_SC_student FOREIGN KEY(sno) REFERENCES student(sno);
ALTER TABLE SC ADD CONSTRAINT FK_SC_course FOREIGN KEY(cno) REFERENCES Course(cno);
ALTER TABLE SC drop CONSTRAINT FK_SC_course;
ALTER TABLE SC drop CONSTRAINT FK_SC_student;

--在Course表中添加教师列ctech
ALTER TABLE Course ADD ctech char(10);

--添加数据
INSERT INTO student values('2100001','张一','男',21,'shuji','13324539390'),
                          ('2100002','王华','女',21,'shuji','13324539391'),
						  ('2100003','张三','男',21,'renwen','13324539393'),
						  ('2100004','李萍','男',19,'tumu','13324539394'),
						  ('2100005','张五','女',21,'wudian','13324539395'),
						  ('2100006','张六','女',21,'guanli','13324539396'),
						  ('2100007','张七','男',20,'shenggong','13324539397'),
						  ('2100008','张八','女',21,'jiaoke','13324539398'),
						  ('2100009','张九','男',21,'tiyu','13324539399'),
						  ('2100010','张四','男',21,'huaxue','13324539310');
INSERT INTO SC values('2100001','2',70),
                     ('2100002','1',75),
					 ('2100003','3',60),
					 ('2100005','2',70),
					 ('2100004','8',80),
					 ('2100006','11',80),
					 ('2100007','2',70),
					 ('2100004','2',70),
					 ('2100004','6',89),
					 ('2100010','8',79),
                     ('2100006','9',70),
					 ('2100008','1',70),
					 ('2100005','16',70),
					 ('2100010','14',70),
					 ('2100003','6',95),
					 ('2100009','6',98),
					 ('2100006','6',null),
					 ('2100008','6',null),
					 ('2100002','3',30),
					 ('2100009','3',40);
INSERT INTO Course values('1','数据库原理及应用',3,'Java','肖'),
                         ('2','Java',4,'C语言','高'),
						 ('3','C语言',5,'null','蒋'),
						 ('8','马克思主义原理',3,'null','高'),
						 ('6','大学英语',2,'null','蒋'),
						 ('9','大学物理',6,'null','赵'),
						 ('11','高等数学',5,'null','苏'),
						 ('12','大学心理健康',3,'null','皇甫'),
						 ('16','计算机网络原理',3,'null','高'),
						 ('14','概率论',5,'null','李');
--求选课门数、平均成绩并存入学生表中
  alter table student add average decimal(4,2);
  alter table student add 选课门数 int;
  update student set average = (select avg(grade) from SC where sno in ('2100001')) where sno in ('2100001');
  update student set average = (select avg(grade) from SC where sno in ('2100002')) where sno in ('2100002');
  update student set average = (select avg(grade) from SC where sno in ('2100003')) where sno in ('2100003');
  update student set average = (select avg(grade) from SC where sno in ('2100004')) where sno in ('2100004');
  update student set average = (select avg(grade) from SC where sno in ('2100005')) where sno in ('2100005');
  update student set average = (select avg(grade) from SC where sno in ('2100006')) where sno in ('2100006');
  update student set average = (select avg(grade) from SC where sno in ('2100007')) where sno in ('2100007');
  update student set average = (select avg(grade) from SC where sno in ('2100008')) where sno in ('2100008');
  update student set average = (select avg(grade) from SC where sno in ('2100009')) where sno in ('2100009');
  update student set average = (select avg(grade) from SC where sno in ('2100010')) where sno in ('2100010');

  update student set 选课门数 = (select count(grade) from SC where sno in ('2100001')) where sno in ('2100001');
  update student set 选课门数 = (select count(grade) from SC where sno in ('2100002')) where sno in ('2100002');
  update student set 选课门数 = (select count(grade) from SC where sno in ('2100003')) where sno in ('2100003');
  update student set 选课门数 = (select count(grade) from SC where sno in ('2100004')) where sno in ('2100004');
  update student set 选课门数 = (select count(grade) from SC where sno in ('2100005')) where sno in ('2100005');
  update student set 选课门数 = (select count(grade) from SC where sno in ('2100006')) where sno in ('2100006');
  update student set 选课门数 = (select count(grade) from SC where sno in ('2100007')) where sno in ('2100007');
  update student set 选课门数 = (select count(grade) from SC where sno in ('2100008')) where sno in ('2100008');
  update student set 选课门数 = (select count(grade) from SC where sno in ('2100009')) where sno in ('2100009');
  update student set 选课门数 = (select count(grade) from SC where sno in ('2100010')) where sno in ('2100010');
--将数据库课程分数修改为4
  UPDATE Course  SET ccredit = 4 where cname in ('数据库原理及应用');
  select * from Course where cname in('数据库原理及应用');

--将王华的数据库成绩增加5分
  update SC set grade = grade+5 where sno = (select student.sno from student where sname  in ('王华') and cno = (select Course.cno from Course where cname in('数据库原理及应用')));
--删除选课表中成绩低于40的
delete from SC where grade < 40;
select * from SC;
--删除学号2100001的记录,并讨论该删除操作所受到的约束。
alter table SC drop constraint FK_SC_student;
delete from student where sno = '2100001';
--删除Java的选课记录
delete from SC where cno = (select Course.cno from Course where cname in ('java'));
--将guanli学院的所有成绩置空
update SC set grade = null where sno = (select student.sno from student where sdept = 'guanli');
--删除李萍的选课记录
delete from SC where sno = (select student.sno from student where sname = '李萍');

实验二、数据库的简单查询和连接查询

1、简单查询
在学生选课数据库中实现其数据查询操作。
1)查询shujiu学院学生的学号和姓名。
2)查询选修了课程的学生学号。
3)查询选修课程编号为 6 课程的学生学号和成绩,结果按成绩降序排列,如果成绩
相同按学号升序排序。
4)查询选修课程编号为 1 课程,成绩在 80~90 之间的学生学号和成绩,并将成绩乘
以 0.8 输出。
5)查询shenggong学院或shuji学院系姓张的学生的信息。
6)查询缺少了成绩的学生的学号和课程号。
2、连接查询
在学生选课库中实现其数据连接查询操作。
1)查询学生的学号、姓名、选修的课程名称及成绩。
2)查询数计学院学生选修的课程学分大于 2 的课程详细信息。
3)查询所有学生的信息以及他(她)所选课的课程编号和成绩(要求查询结果也显示出没有
选修课程的学生信息)。
4)查询选修课程编号为 6 且成绩在 90 分以上的学生学号、姓名及成绩。
4)查询每一门课的间接先行课(即先行课的先行课)。
5)查询至少选修了两门课程的学生学号。

--简单查询
  --查询shujiu学院学生的学号和姓名
  select sno,sname from student where sdept in ('shuji');
  --查询选修了课程的学生学号
  select distinct sno from SC;
  --查询选修课程编号为6的学生学号和成绩,结果按成绩降序排列,如果成绩相同按学号升序排序
  select sno,grade from SC where cno in ('6') order by grade desc,sno asc;
  --查询选修课程编号为1,成绩在80~90之间的学生学号和成绩,并将成绩乘以0.8输出
  select * from SC where cno = '1';
  select sno,grade*0.8grade from SC where cno in (select cno from Course where cno = '1' ) and grade between 80 and 90;
  --查询shenggong学院或shuji学院姓张的学生信息
  select * from student where sdept in ('shenggong','shuji') and sname like '张%';
  --查询缺少了成绩的学生学号和课程号
  select * from SC where grade is  null
  select sno,cno from SC where grade is NULL;


  SELECT * from Course;


--连接查询
  --查询学生的学号、姓名、选修的课程名称及成绩
  select student.sno,student.sname,Course.cname,SC.grade from student join SC on student.sno = SC.sno join Course on Course.cno= SC.cno;
  --查询shuji学院的学生选修的课程学分大于2的课程信息[distinct去重]
  select  Course.* from SC left join student on SC.sno = student.sno
                                   left join Course on SC.cno = Course.cno
								   where student.sdept = 'shuji' and Course.ccredit>2;
  --(1)查询所有学生的信息以及他所选课的课程编号和成绩
  select student.*,Course.*,SC.grade from SC left join student on SC.sno = student.sno
                                             left join Course on SC.cno = Course.cno;
    --(2)【要求查询结果也显示出没有选修课程的学生信息】
	select student.*,Course.*,SC.grade from student left join SC on student.sno = SC.sno
                                             left join Course on SC.cno = Course.cno;
  --查询选修课程编号为6且成绩在90分以上的学生学号、姓名及成绩
  select student.sno,student.sname,SC.grade from SC left join student on SC.sno = student.sno where SC.cno = '6' and SC.grade > 90;                                            
  --查询每一门课的间接先行课(即先行课的先行课)
  select C.cname ,B.cpno  from Course C,Course B where C.cpno = B.cname;
  --查询至少选修了两门课程的学生学号[where分组前,不可加聚合函数 having分组后过滤,可加聚合函数]
  select SC.sno,student.sname from SC  left join student on SC.sno = student.sno where SC.sno in (select sc.sno from SC group by SC.sno having count(SC.sno)>1) group by SC.sno,student.sname;
  
  
--附加题  
  --分别统计学院男女性别并加一起
  select * from student
  select sdept 学院 ,count(*) as 总人数,
count(case when ssex='女' then 1 else null end)  本学院女生人数,
count(case when ssex='男' then 1 else null end)  本学院男生人数
from student GROUP BY student.ssex,student.sdept;

实验三、数据库的嵌套查询和组合查询

1、嵌套查询 
在学生选课库中实现嵌套查询操作。
1) 查询选修了 UML 课程的学生学号和姓名。
2) 查询比王华同学年龄大的学生学号和姓名。
3) 查询选修 18084412 课程的成绩低于张三的学生学号和成绩。
4) 查询其他学院中比数计学院学生年龄都小的学生。
5) 查询选修了 18084415 课程的学生姓名。
6) 查询选修了全部课程的学生姓名。
7) 查询至少选修了“2100001”学生所选修课程中一门课程的学生学号的姓名。
8) 查询至少选修了“2100001”学生所选修的全部课程的学生学号的姓名(查询选修课程
包含 “2100001”学生所选课程的学生学号和姓名)。
9)查询既选修了“数据结构”课程又选修了“数据库原理与应用”课程的学生姓名。
10)查询选修了“数据结构”课程或选修了“数据库原理与应用”课程的学生学号。
11)查询选修了“数据结构”课程而没有选修“数据库原理与应用”课程的学生学号。
12)查询全是男同学选修的课程号。
9)-11)任选一个,12)选做
2、组合查询和统计查询 
在学生选课库中实现组合和统计查询操作。
1)使用集合运算查询既选修了“数据结构”课程又选修了“数据库原理与应用”课程的学
生姓名。
2)使用集合运算查询选修了“数据结构”课程或选修了“数据库原理与应用”课程的学生
学号。
3)使用集合运算查询选修了“数据结构”课程而没有选修了“数据库原理与应用”课程的
学生学号。
6
4)统计选修了课程的学生人数。
5)查询选修成绩合格,并且选课门次超过 4 门以上学生的学生学号、总成绩。
6)统计各院系的学生人数。
7)统计各年龄的学生人数。
8)统计每个学生的选修课程数目和平均成绩。
9)查询每门课程的详细信息及选课人数。

--插入一些补充数据
insert into student values('2100011','王五','男','23','huaxue','13324539311 ',null,null);
insert into student values('2100012','张麻子','女','22','shuji','13324539321 ',null,null);
insert into student values('2100013','甜甜','男','20','shuji','13324539333 ',null,null);
update student set ssex = '男' where sno = '2100012';
update SC set grade = 50 where sno = '2100009' and cno = '3';
insert into SC values('2100012','1','87'),
                          ('2100012','2','87'),
						  ('2100012','3','87'),
						  ('2100012','6','87'),
						  ('2100012','8','87'),
						  ('2100012','9','87'),
						  ('2100012','11','87'),
						  ('2100012','12','87'),
						  ('2100012','14','87'),
						  ('2100012','16','87');

insert into SC values     ('2100013','1','97'),
                          ('2100013','2','97'),
						  ('2100013','3','97'),
						  ('2100013','6','97'),
						  ('2100013','8','97'),
						  ('2100013','9','97'),
						  ('2100013','11','77'),
						  ('2100013','12','77'),
						  ('2100013','14','87'),
						  ('2100013','16','87');
ALTER TABLE SC ADD CONSTRAINT FK_SC_student FOREIGN KEY(sno) REFERENCES student(sno);

--嵌套查询
  --查询选修了大学英语【cno为6】的学生学号和姓名
  select SC.sno 学号,(select sname from student where student.sno = SC.sno) 姓名
       from SC where SC.cno = (select Course.cno from Course where cname = 'c语言');

  --查询比王华同学年龄大的学生学号和姓名
  select sno 学号, sname 姓名 from student where sage > (select sage from student where sname = '王华');

  --查询选修了3课程的成绩低于张三的学生学号和成绩
  select sno 学号,grade 成绩 from SC where grade < (select grade from SC,student where SC.sno = student.sno and sname = '张三' and cno = '3');

  --查询其他学院中比shuji学院学生年龄都小的学生
  select * from student where sage < all(select sage from student where sdept = 'shuji'); select * from student;

  --查询选修了3课程的学生姓名
  select sname 姓名 from student where sno in (select sno from SC where cno = '3');

  --查询选修了全部课程的学生姓名
  --第一种
  select sname from student where not exists(select * from Course where not exists(select * from SC where SC.sno = student.sno and SC.cno = Course.cno));
  --第二种:
  select sname from student where student.sno in(select SC.sno from SC group by sno having count(cno) = (select count(*) from Course));

  --查询至少选修了“2100003”学生所选的课程中一门课程的学生学号和姓名
   select sno 学号,sname 姓名 from student where sno in (select distinct SC.sno from SC where(cno  in(select cno from SC where sno = '2100003')));

  --查询至少选修了“2100003”学生所选的全部课程的学生学号和姓名[--查询选修课程包含“2100003”学生所选课程的学生学号和姓名]
  --第一种
  select sno,sname from student where sno in (
                                               select distinct sno 
											   from SC a
											   where not exists(
											       select * from SC b 
												            where b.sno = '2100003'and  not exists (select * from SC c where c.sno = a.sno and c.cno = b.cno)
												));

  --第二种
  select sno 学号,sname 姓名 from student where sno in (
               select distinct SC.sno 
			   from SC 
                where cno in(select cno
				              from SC 
							  where sno = '2100003')
				 group by sno  having count(*) = 
				                            (select count(cno) from SC where sno = '2100003'));
    
    
  --查询即选修了“大学英语【6】”又选修了“高等数学【11】”的学生姓名
  select sname from student 
               where sno in(select a.sno from 
			   (select sno from SC where cno = (select cno from Course where cname = '大学英语')) a
			        inner join(select sno from SC where cno = (select cno from Course where cname = '高等数学')) b
					                       on a.sno = b.sno);	

  --查询即选修了“大学英语【6】”或选修了“高等数学【11】”的学生学号
  select distinct sno from SC           
			  where cno in(select cno from Course 
					                    where cname ='大学英语'or cname = '高等数学');

  --查询即选修了“大学英语【6】”没有选修了“高等数学【11】”的学生学号
  select sno from student
              where sno in(select a.sno
			                from (select sno from SC where cno = (select cno from Course where cname = '大学英语')) a
			                 left join (select  sno 
							                         from SC where cno = (select cno from Course where cname = '高等数学')) b
													  on a.sno = b.sno
													  where b.sno is null
													  );

  --查询全是男同学选修的课程号
  select distinct cno from SC a
                      where not exists(select cno from student where ssex = '女' and 
					                                                    exists(select * from SC b where b.cno = a.cno and b.sno = student.sno)
																		);

--组合查询和统计查询
  --使用集合运算查询即选修了“大学英语【6】”又选修了“高等数学【11】”的学生姓名
   select sname from student 
               where sno in(select sno from SC where cno = (select cno from Course where cname = '大学英语'))
			   intersect
   select sname from student 
               where sno in(select sno from SC where cno = (select cno from Course where cname = '高等数学'));
   
  --使用集合运算查询即选修了“大学英语【6】”或选修了“高等数学【11】”的学生学号
	  select distinct sno from SC where cno = (select cno from Course where cname = '大学英语')
                           union 
						   select sno from SC where cno = (select cno from Course where cname = '高等数学');

  --使用集合运算查询即选修了“大学英语【6】”没有选修了“高等数学【11】”的学生学号
  select sno from SC 
               where cno = (select cno from Course where cname = '大学英语')
			   except
   select sno from SC 
               where cno = (select cno from Course where cname = '高等数学');

  --统计选修了课程的学生人数
  select count(distinct sno)选课人数 from SC;

  --查询选修成绩合格(60),且选课门次超过4门以上学生的学生学号、总成绩
  select sno,sum(grade)总成绩 from SC where grade >= 60 
                                        group by sno
										  having count(cno)>4;

  --统计各院系学生人数
  select sdept,count(sdept)各学院人数 from student group by sdept;

  --统计各年龄学生人数
  select sage,count(sage)各年龄人数 from student group by sage;

  --统计每个学生的选修课程数目和平均成绩
  select sno,count(cno)选课数目,avg(grade)平均成绩 from SC group by sno;

  --查询每门课程的详细信息及选课人数
  select Course.* , 选课人数 from Course 
                           left join(select cno,count(cno)选课人数
						              from SC group by cno)as sc on sc.cno = Course.cno;

实验四、数据库完整性和数据安全性实验

1) 用用户名为“sa”的用户登录,在“SQL Server Management Studio”中将 SQL Server
的身份验证模式设置为“Windows 身份验证模式”,断开与对象资源管理器的连接,再
连接对象资源管理器时分别用“Windows 身份验证”和“SQL Server 身份验证”两种
模式登录,再将数据库的身份验证模式设置为“SQL Server 和 Windows 身份验证模式”,
再分别用两种模式登录,分析两种不同的身份验证模式下登录结果。

2) 用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建名称为
“Liping”的登录名,再创建用户名为“Liping”的用户,用用户名为“Liping”的
用户登录,对学生表执行一个查询语句,分析查询失败的原因。


3) 用用户名为“sa”的用户登录,在“SQL Server Management Studio”中给用户名为
“Liping”的用户授予查询学生表的权限,再用用户名为“Liping”的用户登录,对
学生表执行一个查询语句,分析查询成功的原因。


4) 用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建名称为
“Lili”的登录名,再创建用户名为“Lili”的用户,分别用用户名为“Liping”和
“Lili”的用户登录,对课程表执行一个查询语句,分析查询失败的原因。


5) 用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建名称为
“MyRole”的角色,将用户名为“Liping”的用户和用户名为“Lili”的用户加入该
角色中,对该角色授予查询课程表的权限,分别用用户名为“Liping”和“Lili”的
用户登录,对课程表执行一个查询语句,分析查询成功的原因。


6) 用用户名为“sa”的用户登录,创建一个规则,约束值为“男”或“女”,将该规则绑
定到学生表的“性别”列。在学生表中输入一条非法学生记录(性别值不为“男”和
“女”),体验规则的作用。


7) 用用户名为“sa”的用户登录,创建一个默认值,值为“20”,将该默认值绑定到学生
表的“年龄”列。在学生表中输入一条学生记录(不输入年龄值),体验默认的作用。


8) 用用户名为“sa”的用户登录,对选课表定义一个“insert”触发器,要求插入到选
课表中的记录满足参照完整性约束。


9) 用用户名为“sa”的用户登录,对学生表定义一个“Delete”触发器,要求删除学生
记录的同时把学生的选课记录也删除。

--2.用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建名称为,“Liping”的登录名
  -- 再创建用户名为“Liping”的用户,用用户名为“Liping”的
  -- 用户登录,对学生表执行一个查询语句,分析查询失败的原因
use XSXK
SP_addlogin 'LaiPing','123456';
SP_adduser 'LaiPing';
select * from student;

--3.用用户名为“sa”的用户登录,在“SQL Server Management Studio”中给用户名为
  --“Liping”的用户授予查询学生表的权限,再用用户名为“Liping”的用户登录,对
  --学生表执行一个查询语句,分析查询成功的原因
 grant select on student to LiPing with grant option;
 select * from student;

--4.用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建名称为
  --“Lili”的登录名,再创建用户名为“Lili”的用户,分别用用户名为“Liping”和
  --“Lili”的用户登录,对课程表执行一个查询语句,分析查询失败的原因。
SP_addlogin 'LiLi','123456';
SP_adduser 'LiLi';

--5.用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建名称为
  --“MyRole”的角色,将用户名为“Liping”的用户和用户名为“Lili”的用户加入该
  --角色中,对该角色授予查询课程表的权限,分别用用户名为“Liping”和“Lili”的
  --用户登录,对课程表执行一个查询语句,分析查询成功的原因。
  sp_addrole 'MyRole'
  sp_addrolemember 'MyRole','LiLi'
  sp_addrolemember 'MyRole','LiPing'
  grant select on Course to MyRole with grant option;
  select * from student;
  select * from Course;

--6. 用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建一个规
  --则,约束值为“男”或“女”,将该规则绑定到学生表的“性别”列。在学生表中输入
  --一条非法学生记录(性别值不为“男”和“女”),体验规则的作用
   select * from student;
   insert into student values('2100001','张一','男','18','shuji','13324539391',null,null);
   delete from student where sno = '1111';
   create rule stu_sex as @ssex = '男' or @ssex = '女';
    EXEC sp_bindrule 'stu_sex','student.ssex';
   insert into student values('2100001','张一','神','20','shuji','13324539391',null,null);
   insert into student values('2100001','张一','男','20','shuji','13324539391',null,null);

--7.用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建一个默
  --认值,值为“20”,将该默认值绑定到学生表的“年龄”列。在学生表中输入一条学生
  --记录(不输入性别值),体验默认的作用CK__student__sage__38996AB5
  create default stu_sage as '20';
   EXEC sp_bindefault  stu_sage,'student.sage';
  insert into student values('2100001','张一','男',,'shuji','13324539391',null,null);
  insert into student(sno,sname,sdept,stel) values('11110','张0','数计学院','12345678901')
  select * from student where sno = '11110';


--8.用用户名为“sa”的用户登录,在“SQL Server Management Studio”中对选课表定
  --义一个“insert”触发器,要求插入到选课表中的记录满足参照完整性约束。
  create trigger sc_insert on sc for insert
	as if (select count(*) 
			from student a,inserted b,course c 
			where a.sno = b.sno and c.cno=b.cno) = 0
begin
ROLLBACK TRANSACTION
	raiserror('不能插入!',16,10)
	end
insert into sc values('2100003','1',80)
select *  from sc where sno = '2100003'

--9.用用户名为“sa”的用户登录,在“SQL Server Management Studio”中对学生表定
  --义一个“Delete”触发器,要求删除学生记录的同时把学生的选课记录也删除
  create trigger student_delete on sc for delete
as
declare @sno varchar(11)
select @sno=sno from deleted
delete from student where sno=@sno
delete from sc where sno='2100002'
select * from student
select * from  sc where sno = '2100002';

实验1 数据库及数据定义 1、创建一个名为XSCJ的数据库,其初始大小为5MB,最大大小10MB,允许数据库自动增长,增长方式是按10%比例增长;日志文件初始为2MB,最大可增长到5MB,按1MB增长。 2、将以上XSCJ数据库的主数据文件的最大大小改为不限制。 3、参照教材82页例3.5、例3.6、例3.7分别建立Student表、Course表和SC表,并录入数据库表中相应元组。 4、分别采用SQL编程模式和设计模式修改Course表,为其增加一列开课学期,数据类型自行定义。 5、为Course表的Cname列建立一个唯一索引,索引名Cname_idx。 6、分离数据库XSCJ并拷贝文件至U盘保存好,用于下次实验;然后再将其附加上。 7、删除唯一索引Cname_idx。 8、删除基本表Student。 实验2 数据查询 将上次实验课的学生成绩数据库(XSCJ)附加到SQL SERVER中,录入数据后做如下查询。 1) 查询选修了课程的学生的学号; 2) 查询全体学生的姓名和出生年份,并将列别名改为XM和CSNF; 3) 查询年龄在18到20(包括18岁和20岁)之间学生的学号、姓名和系。 4) 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。 5) 用LIKE查询课程名为DB_ S的课程号和学分。 6) 查所有有成绩的学生学号和课程号。 7) 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄升序排列 8) 查询选修了课程的学生人数。 9) 计算1号课程的学生平均成绩。 10) 查询有2人以上(含2人)同学选修课程的课程号。 11) 查询1号课程的间接先修课。 12) 查询每个学生的学号、姓名、选修的课程名及成绩。 13) 找出每个学生高于他选修课程平均成绩的课程号。 实验3 数据更新和视图 将学生成绩数据库(XSCJ)附加到SQL SERVER中,完成如下实验任务。 1) 将一个新学生元组(学号:95007;姓名:张娜丽;性别:女;所在系:IS;年龄:18岁)插入到Student表中。 2) 插入一条选课记录,插入一条选课记录( '95007','1 ')。 3) 对每一个系,求学生的平均成绩,并把结果存入数据库。 (建立一张表,然后通过子查询将结果插入表中。) 4)将全体学生的年龄增加一岁。 5)将信息系全体学生的成绩置零。 6)删除95001学生的记录。 7)删除信息系所有学生的选课记录。 8)建立计算机学生的视图CS_S。(视图中包括学号,姓名,年龄,系),并要求进行修改和插入操作时仍需保证该视图只有计算机系的学生。(视图中包含的属性名称自拟) 9)向CS_S视图中插入分别插入两条信息,如果不能插入说明原因。 (学号:95002;姓名:李华华;所在系:IS;年龄:18岁) (学号:95003;姓名:王冬冬;所在系:CS;年龄:20岁) 10)利用CS_S视图完成以下查询。 查询计算机学生年龄小于20岁的学生(学号、年龄) 查询计算机系选修了2号课程的学生(学号、姓名)。 实验4 数据库的安全性 实验内容 将学生成绩数据库(XSCJ)附加到SQL SERVER中,完成如下实验任务。 (1)在SQL Server Management Studio中创建三个登录帐户:log1、log2、log3。 (2)利用前面建立的XSCJ数据库,用log1登录,能否操作XSCJ数据库?为什么? (3)将log1、log2、log3映射为XSCJ数据库中的用户。 注意:此映射步骤会为登陆名log1在XSCJ中自动建立同名数据库用户log1。log2和log3同理。 (4)用log1登录,能否访问XSCJ数据库?为什么? (5)授予log1、log2、log3具有对Student、Course、SC三张表的查询权。并且log1有权将查询SC表的权限授予其他用户。 (6)分别用log1、log2、log3登录,对上述三张表执行查询。 (7)分别用log1、log2登陆,在查询分析器中执行以下语句,用来授予log3 对SC表的访问权限,会出现什么情况? 实验5 数据库的完整性 将学生成绩数据库(XSCJ)附加到SQL SERVER中,完成如下实验任务。 (1)录入或变更数据,验证所建立的实体完整性规则及其违约处理。 (2)录入或变更数据,验证所建立的参照完整性规则及其违约处理。 (3)自行设定某些列,使得其不允许取空值。 (4)自行设定某些列,使得该列值不允许重复。 (5)自行设定某些列的默认值。 (6)用Check短语限定考试成绩的取值范围在0到100之间。 (7)为Student表设计一个触发器,使得新增一个学生时,自动为其分配一个学号。 实验6 数据库编程
数据库原理应用实验是在数据库原理应用课程中的实践环节,通过实验来加深学生对数据库原理应用的理解和掌握。在实验中,学生可以通过设计数据库、编写SQL语句、实现数据库的操作等方式来应用所学理论知识,同时也可以了解数据库管理系统的使用和数据库应用的实际情况。 以下是数据库原理应用实验的一些分析: 1. 实验目的 数据库原理应用实验的主要目的是让学生通过实践来加深对数据库原理应用的理解和掌握,同时也能够了解数据库管理系统的使用和数据库应用的实际情况。 2. 实验内容 数据库原理应用实验的内容包括数据库设计、SQL语句编写、数据库的操作实现等方面。通过实验,学生可以学习到关系模型、E-R图、范式等数据库设计原理,以及SQL语句的基本语法、查询、插入、删除、更新等操作。 3. 实验过程 数据库原理应用实验的过程一般包括以下几个步骤: (1)数据库设计:学生需要根据实际需求设计一个数据库,包括数据表的设计、数据类型的选择、关系建立等方面。 (2)SQL语句编写:学生需要编写SQL语句来实现数据库的各种操作,如查询、插入、删除、更新等。 (3)数据库的操作实现:学生需要在数据库管理系统中实现数据库的各种操作,包括创建数据表、插入数据、查询数据、删除数据等。 4. 实验结果 通过数据库原理应用实验,学生可以获得以下几个方面的结果: (1)对数据库原理应用的理解和掌握更加深入。 (2)对SQL语句的编写和数据库的操作实现更加熟练。 (3)对数据库管理系统的使用和数据库应用的实际情况有了更加深入的了解。 总之,数据库原理应用实验数据库原理应用课程中的重要实践环节,通过实验可以加深学生对数据库原理应用的理解和掌握,同时也可以了解数据库管理系统的使用和数据库应用的实际情况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值