实验2《数据表查询与更新》

一、实验目的

  1. 熟悉和掌握对数据表中数据的查询操作和SQL命令的使用,学会灵活熟练的使用SQL 语句的各种形式,加深理解关系运算的各种操作(尤其是关系的选择,投影,连接和除运算);
  2. 熟悉和掌握数据表中数据的插入、修改、删除操作和命令的使用(熟悉使用UPDATE/INSERT/DELETE语句进行表操作);加深理解表的定义对数据更新的作用。

二、实验内容

(一)在表S,C,SC上完成以下查询:
1. 查询学生的基本信息;
2. 查询“CS”系学生的基本信息;
3. 查询“CS”系学生年龄不在19到21之间的学生的学号、姓名;
4. 找出“CS”系年龄最大的学生,显示其学号、姓名;
5. 找出各系年龄最大的学生,显示其学号、姓名;
6. 统计“CS”系学生的人数;
7. 统计各系学生的人数,结果按升序排列;
8. 按系统计各系学生的平均年龄,结果按降序排列;
9. 查询无先修课的课程的课程名和学分数;
10.统计每位学生选修课程的门数、学分及其平均成绩;
11.统计选修每门课程的学生人数及各门课程的平均成绩;
12.找出平均成绩在85分以上的学生,结果按系分组,并按平均成绩的升序排列;
13.查询选修了“1”或“2”号课程的学生学号和姓名;
14.查询选修了课程名为“数据库系统”且成绩在60分以下的学生的学号、姓名和成绩;
15.查询每位学生选修了课程的学生信息(显示:学号,姓名,课程号,课程名,成绩);
16.查询没有选修课程的学生的基本信息;
17.查询选修了3门以上课程的学生学号;
18.查询选修课程成绩至少有一门在80分以上的学生学号;
19.查询选修课程成绩均在80分以上的学生学号;

(二)在表S、C、SC中完成下列更新:
1. 将数据分别插入表S、C、SC;
2. 将表S、C、SC中的数据保存在磁盘上。
3. 在表S、C、SC上练习数据的插入、修改、删除操作。(比较在表上定义/未定义主码(Primary Key)或外码(Foreign Key)时的情况)
4. 将表S、C、SC中的数据全部删除,再利用磁盘上备份的数据来恢复数据。
5. 如果要在表SC中插入某个学生的选课信息(如:学号为“2007001005”,课程号为“c123”,成绩待定),应如何进行?
6. 求各系学生的平均成绩,并把结果存入数据库;
7. 将“CS”系全体学生的成绩置零;
8. 删除“CS”系全体学生的选课记录;
9. 删除学号为“S1”的相关信息;
10.将学号为“S1”的学生的学号修改为“S001”;
11.把平均成绩大于80分的男同学的学号和平均成绩存入另一个表S——GRADE(SNO,AVG_GRADE);
12. 把选修了课程名为“数据结构”的学生的成绩提高10%;
13. 把选修了“C2”号课程,且成绩低于该门课程的平均成绩的学生成绩删除掉。

三、实验方法与实验步骤

(1)实验方法:
利用SQL server的对象资源管理器和SQL语句连接到学生-课程数据库,对表中数据进行插入、修改和删除命令操作。
(2)实验步骤:
1)阅读实验内容,复习对表中数据查询SQL语言命令,复习对表中数据的插入、修改和删除的SQL语言命令,了解这些更新语句的基本语法和用法;
2)连接到学生-课程数据库
3)完成对数据表S,C,SC的查询工作;
4)在表S、C、SC中完成实验内容要求的更新工作;
5)总结实验过程,编写实验报告。

四、实验结果

(一)在表S,C,SC上完成以下查询:
1. 查询学生的基本信息;

select * from S;

2. 查询“CS”系学生的基本信息;

	select * from S where sdept='计算机系';

3. 查询“CS”系学生年龄不在19到21之间的学生的学号、姓名;

select Sno,Sname from S where sdept='计算机系' AND Sage not between 19 and 21;

4. 找出“CS”系年龄最大的学生,显示其学号、姓名;

select s1.Sno,s1.Sname 
from S s1
where s1.sdept='计算机系' and s1.Sage=
(select max(s2.Sage) from S s2 where s2.sdept='计算机系');

5. 找出各系年龄最大的学生,显示其学号、姓名;
select s1.Sno,s1.Sname
from S s1

where s1.Sage=(select max(s2.Sage) Sage from S s2  where s1.sdept=s2.sdept);

6. 统计“CS”系学生的人数;

select count(*) 人数 from S where sdept='计算机系';

7. 统计各系学生的人数,结果按升序排列;

select  sdept,count(*) from S group by sdept order by count(*) asc;

8. 按系统计各系学生的平均年龄,结果按降序排列;

select avg(Sage) Sage from S group by sdept order by avg(Sage) desc;

9. 查询无先修课的课程的课程名和学分数;

select Cname,ccredit from C where Cpno=null;

10.统计每位学生选修课程的门数、学分及其平均成绩;

select count(*) numbers,sum(c.ccredit) ccredits,avg(sc.grade) grades  from SC sc inner join C c on sc.Cno=c.Cno group by sc.Sno;

11.统计选修每门课程的学生人数及各门课程的平均成绩;

select count(*) stu_numbers,avg(sc.grade) avg_grade from SC sc inner join C c on sc.Cno=c.Cno group by sc.Cno;

12.找出平均成绩在85分以上的学生,结果按系分组,并按平均成绩的升序排列;

SELECT S.Sno,S.sdept,AVG(SC.grade) 平均成绩 FROM SC,S WHERE SC.Sno = S.Sno GROUP BY S.Sno,S.sdept HAVING AVG(SC.grade) > 85 ORDER BY AVG(SC.grade)ASC;

13.查询选修了“1”或“2”号课程的学生学号和姓名;

select S.Sno,S.Sname from S,SC where S.Sno=SC.Sno and (SC.Cno='1' or SC.Cno='2');

14.查询选修了课程名为“数据库系统”且成绩在60分以下的学生的学号、姓名和成绩;

select S.Sno,S.Sname,SC.grade from S,SC,C where S.Sno=SC.Sno and SC.Cno=C.Cno and C.Cname='数据库系统'and SC.grade<60;

15.查询每位学生选修了课程的学生信息(显示:学号,姓名,课程号,课程名,成绩);

SELECT SC.Sno ,Sname,C.Cno,Cname,grade FROM SC,S,C WHERE SC.Sno = S.Sno AND SC.Cno = C.Cno;

16.查询没有选修课程的学生的基本信息;

SELECT *	FROM S WHERE S.Sno NOT IN(SELECT SC.Sno FROM S,SC WHERE SC.Sno = S.Sno) ;

17.查询选修了3门以上课程的学生学号;

SELECT Sno	FROM SC	GROUP BY Sno HAVING COUNT(Cno) > 3;

18.查询选修课程成绩至少有一门在80分以上的学生学号;

SELECT DISTINCT Sno FROM SC WHERE grade > 80;

19.查询选修课程成绩均在80分以上的学生学号;

SELECT SC.Sno FROM SC WHERE SC.grade > 80;

(二)在表S、C、SC中完成下列更新:
1. 将数据分别插入表S、C、SC;

insert into S
values(8209190312,'李大钊','男',15,'医学系',null);

insert into SC
values(8209190312,'3-3',96);

insert into C
values('1-2','计算机组成原理','数字电路',3);

2. 将表S、C、SC中的数据保存在磁盘上。
参考 实验1《数据库与表的基本操作》

3. 在表S、C、SC上练习数据的插入、修改、删除操作。(比较在表上定义/未定义主码(Primary Key)或外码(Foreign Key)时的情况)

/*插入数据*/
insert into S
values(8209190312,'李大钊','男',15,'医学系',null);

insert into SC
values(8209190312,'3-3',96);

insert into C
values('1-2','计算机组成原理','数字电路',3);

/*修改数据*/
update S set Sname='陈独秀' where Sname = '李大钊';

update SC set grade='80' where grade = '98';

update C set Cname = '软件架构' where Cname='操作系统' ;

/*删除数据*/
delete from S where Sno='8209190312';

delete from SC where Sno='8209190312';

delete from C where Cname='软件架构';

4. 将表S、C、SC中的数据全部删除,再利用磁盘上备份的数据来恢复数据。
参考实验1《数据库与表的基本操作》

5. 如果要在表SC中插入某个学生的选课信息(如:学号为“2007001005”,课程号为“c123”,成绩待定),应如何进行?

insert into SC
values(2007007005,'c123',null);

6. 求各系学生的平均成绩,并把结果存入数据库;

select S.sdept,avg(grade) 系平均成绩 from S,SC where S.Sno=SC.Sno group by S.sdept;

7. 将“CS”系全体学生的成绩置零;

update SC set grade=0 where Sno=(select S.Sno from S where SC.Sno=S.Sno and S.sdept='计算机系');

8. 删除“CS”系全体学生的选课记录;

delete from SC where SC.Sno IN (select S.Sno from S where S.Sno=SC.Sno and S.sdept='计算机系');

9. 删除学号为“S1”的相关信息;

delete from S where Sno='S1';

10.将学号为“S1”的学生的学号修改为“S001”;

update S set Sno='S001' where Sno='S1';

11.把平均成绩大于80分的男同学的学号和平均成绩存入另一个表S——GRADE(SNO,AVG_GRADE);

INSERT INTO S(Sno, grade) SELECT SC.Sno, AVG(SC.grade) FROM SC,S  WHERE SC.Sno=S.Sno AND S.Ssex='男' GROUP BY SC.Sno HAVING AVG(SC.grade) > 80;

12. 把选修了课程名为“数据结构”的学生的成绩提高10%;

update SC set grade=grade*1.1 where SC.Cno IN (select C.Cno from C where SC.Cno=C.Cno and Cname='数据结构');

13. 把选修了“C2”号课程,且成绩低于该门课程的平均成绩的学生成绩删除掉。

delete from SC  
where Cno='C2' and grade<(select avg(grade) from SC  where Cno='C2');

五、实验小结

通过本次实验主要是对数据库增删改查的函数操作更加熟练了,能够对基本数据进行按要求处理然后进一步操作用于分析等。
  遇到的问题主要有:
  ①查询无先修课的课程的课程名和学时数时需要判空,当时列名 is null 一直无效;
  解决方式:查阅网络资料,可使用trim(列名)=’’ 进行替代。
  ②在3.4实验中利用group和having一直查询的结果中成绩中只有大于90的结果,而题目要求的平均成绩大于90的学生的所有成绩。
  解决方式:利用in操作完成。
  有待改进:部分操作可以有多种方式,可以进行比较然后选择择优操作。

你可能感兴趣的:(数据库系统SSD7,mysql,sql)