数据库技术与应用实验1.定义基本表和结构按照下图分别使用SQL Server 管理控制台和T-SQL语句来创建四张表:系部表、专业表、班级表、学生表;修改学生表,增加一个家庭住址列;alter table 学生表add 家庭住址char(10) nullGo更改列的数据类型:把学生表中的姓名列加宽到10位字符宽度;alter table 学生表alter column 姓名char(10)go删除学生表中的专业代码的约束;重命名列:将班级表的备注更改为其它;alter table 班级表drop column 备注alter table 班级表add 班主任姓名char(10)go创建主键约束;创建外建约束2.数据的添加.删除.修改在上面四张表中分别插入6条记录;(自拟)设置条件修改表中的各项记录;为学生表添加年龄项,分别输入各位学生的年龄;修改年龄为18岁的学生年龄为20;update 学生表set 年龄=20where 年龄=18go修改所有学生的入学时间、班级代码等;update 学生表set 入学时间='2002-9-1'where 入学时间='2001-9-1'goupdate 学生表set 班级代码='01'go设置条件删除表中的无用记录;3.数据的简单查询1)查询学生的全部信息。
select *from 学生表go2)查询全体学生的学号、姓名和年龄。
Select 学号,姓名,年龄From 学生表go3)查询系部代码为“01”的学生号、姓名、年龄。
Select 学号,姓名,年龄From 学生表Where 系部代码=’01’go4)查询年龄高于18的学生的学号、姓名和性别。
Select 学号,姓名,性别From 学生表Where 年龄>18go5)查询选修C1或C2课程且分数大于等于85分学生的的学号、课程号和成绩。
(需先为创建选课成绩表,并添加学号,课程号和成绩)Select 学号,课程号,成绩From 选课成绩Where 课程号=’c1’ and课程号=’c2’ and成绩>=85go6)查询选修C1课程并且成绩在80至90之间的学生的学号、姓名及年龄。
Select 学生表.学号,姓名,年龄From 学生表,选课成绩Where 学生表.学号=选课成绩.学号and成绩between 80 and 90 and课程号=’c1’go7)查询选修C1或C2的学生的学号、课程号和成绩。
select 学号,课程号,成绩from 选课成绩where课程号=’c1’ or 课程号=’c2’go8)查询没有选修C1,也没有选修C2的学生的学号、课程号和成绩。
select 学号,课程号,成绩from 选课成绩选课成绩1where not exists(select 学号,课程号,成绩from 选课成绩选课成绩2where 选课成绩1.学号=选课成绩2.学号and选课成绩2.课程号='c1' and选课成绩2.课程号='c2')go9)查询所有姓张的学生的学号和姓名;select 学号,姓名from 学生表where 姓名like’张%’go10)查询姓名中第二个汉字是“力”的学号和姓名。
(如果没有该项请添加后在查询)select 学号,姓名from 学生表where 姓名like’%力%’go11)查询没有考试成绩的学生的学号和相应的课程号。
(如果没有该项请添加空值后在查询)select 学号,课程号from 选课成绩where 成绩is nullgo4.数据的统计查询和分组1)求所有学生的高考分数总分和平均分。
select sum(高考分数),avg(高考分数)from 学生表go2)求选修C1号课程的最高分、最低分及之间相差的分数。
Select max(成绩)-min(成绩)From 选课成绩Where 课程号=’c1’go3)求“01”系学生的总数、高考平均分、高考总分。
(要求显示时标出列名)Select count(学号),avg(高考分数) 高考平均分,sum(高考分数) 高考总分From 学生表Where 系部代码=’01’go4)显示所有系部代码,并求共有多少个系。
(要求系部代码不能重复,并且使用compute命令)select 系部代码from 系部compute count(系部代码)go5)求每个系各有多少人,并按照人数递增顺序显示各系名称。
(要求使用group by 和orderselect 系部名称,学号from 学生表,系部where 学生表.系部代码=系部.系部代码order by 学号asccompute count(学号)go6)求每个专业方向各有多少人,并按照人数递减顺序显示各专业名称,并计算专业总人数。
Select count(学号),sum(学号)From 学生表Group by 专业代码Order by count(学号) descgo7)显示专业人数大于5人的各个专业方向。
(要求使用having命令)select 学生表.专业代码from 学生表,专业表where 专业表.专业代码=学生表.专业代码group by 学生表.专业代码having count(学生表.专业代码)>5go8)查询选修C2、C3、C4或C5课程的学号、课程号和成绩,查询结果按学号升序排列,学号相同再按成绩降序排列。
(请自己创建选课成绩表)select 学号,选课成绩.课程号,选课成绩.成绩from 学生表,选课成绩where 课程号='c2' or 课程号='c3' or 课程号='c4'or 课程号='c5'order by 学号descgo9)求选课在三门以上且各门课程均及格的学生的学号及其总成绩,查询结果按总成绩降序列出。
Select 学号,sum(成绩)From 选课成绩Where 成绩>=60Group by 学号having count(课程号)>1Order by sum(成绩) descGo注:改成了一门课程5.数据的连接查询1)对学生表和班级表作交叉连接。
Select *From 班级表cross join 学生表go2)把同一个班级的学生表和班级表连接起来。
(要求使用等值连接)From 班级表,学生表where 班级表.班级代码=学生表.班级代码go3)查询所有比刘德华高考分数高的学生姓名、性别、高考分数和刘德华的高考分数。
(要求使用自身连接)select 姓名,性别,高考分数from 学生表where 高考分数>(select 高考分数from 学生表Where 姓名='刘德华') or 学生表.姓名='刘德华'go4)查询所有学生的学号、姓名、选课名称及成绩的左连接、右连接、完整外部连接。
(注:学生表中应该有没有选课的同学,选课表中有没被选的课程)select 学生表.学号,姓名,课程号,成绩from 学生表,选课成绩where 学生表.学号=选课成绩.学号select 学号,姓名,选课名称,成绩from 学生表,选课成绩where 学生表.学号*=选课成绩.学号select 学生表.学号,姓名,课程号,成绩from 学生表,选课成绩where 学生表.学号=*选课成绩.学号go注:无结果5)查询所有学生学号,姓名,性别,班级,专业名称和系部名称。
(要求使用复合连接条件查询)select 学号,姓名,性别,班级名称,专业名称,系部名称from 学生表,班级表,专业表,系部Where 学生表.班级代码=班级表.班级代码and专业表.专业代码=学生表.专业代码and系部.系部代码=学生表.系部代码go6)查询“软件工程1班”和“软件工程2班”的所有学生的生学号,姓名,性别,并分别把结果集制成表class1和class2;使用union语句把class1和class2合并为一个结果集。
6.数据的多表查询和子查询1)查询大于刘德华的出生日期的学生的学号、姓名、出生日期。
select 学号,姓名,出生日期from 学生表where 出生日期>(select 出生日期from 学生表where 姓名='刘德华')go2)查询课程号为c1的所有学生的学号、姓名。
(要求使用子查询和连接查询两种方法。
注意:这里的选课信息和学生信息分别在学生和选课成绩两个表中。
)select 学生表.学号,姓名from 学生表,选课成绩where 学生表.学号=选课成绩.学号and 课程号in(select 课程号from 选课成绩where 课程号='c1')go3)查询其他系中比02系所有学生高考分数都高的学生的姓名、系部代码和高考分数。
select 姓名,系部代码,高考分数from 学生表where 高考分数>all(select 高考分数from 学生表where 系部代码='02') and 系部代码<>'02'go4)查询其他系中比02系某一学生高考分数高的学生的姓名、系部代码和高考分数。
select 姓名,系部代码,高考分数from 学生表where 高考分数>(select 高考分数from 学生表where 姓名='张静') and 系部代码<>'02'go5)查询高考分数大于学号为01,04中任意一个的学生的学号、姓名、高考分数。
select 姓名,系部代码,高考分数from 学生表where 高考分数>any(select 高考分数from 学生表where 学号='01') or高考分数>any(select 高考分数from 学生表where 学号='04') and 学号<>'04'go6)查询高考分数大于学号为01和04的学生的学号、姓名、高考分数。
select 姓名,系部代码,高考分数from 学生表where 高考分数>all(select 高考分数from 学生表where 学号='01'or 学号='04')go7)查询高考分数大于等于学号为01,04中任意一个的学生的学号、姓名、高考分数select 姓名,系部代码,高考分数from 学生表where 高考分数>=any(select 高考分数from 学生表where 学号='01'or 学号='04') and 学号<>'01' and 学号<>'04'go8)查询高考分数大于等于学号为01和04的学生的学号、姓名、高考分数。