实验三 数据更新实验

/*********************实验三 数据更新实验*************************/
-- 1.  将数据分别插入表S、C、SC;
-- 2.  将表S、C、SC中的数据分别以.SQL文件和.txt文件的形式保存在磁盘上。
-- 3.  在表S、C、SC上练习数据的插入、修改、删除操作。(比较在表上定义/未定义主码(Primary Key)或外码(Foreign Key)时的情况)
-- 4.  将表S、C、SC中的数据全部删除,再利用磁盘上备份的数据来恢复数据。
-- 5.  如果要在表SC中插入某个学生的选课信息(如:学号为“200215121”,课程号为“6”,成绩待定),应如何进行?
insert into SC values('200215121','6',null) ;
-- 6.  求各系学生的平均成绩,并把结果存入数据库;
drop table stu_avg ;
create table stu_avg (
deptname varchar(50) primary key,
score float
); -- 注意在MSSQL中并没有double类型
/* -- 法一
insert into stu_avg 
	select sdept 系名,avg(grade) 平均成绩 from Student,SC
	where student.Sno=SC.Sno
	group by Sdept;
*/
-- 法二
insert into stu_avg 
	select sdept 系名,avg(grade) 平均成绩 
    from student inner join SC
    using (Sno)
	group by Sdept;
select deptname 系名,score 平均分数 from stu_avg;
-- 7.  将“CS”系全体学生的成绩置零;
update SC set grade=0 
where Sno in (
    select distinct Sno from Student,Course 
    where Sdept='CS' 
    );
select  distinct SC.* from Student,SC
where Sdept='CS';

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

DELETE from SC
where Sno in(
	select distinct Sno from Student
	where Sdept='CS'
	);
select *from SC
where Sno in(
	select distinct Sno from Student
	where Sdept='CS'
);

-- 9.  删除学号为“200215121”的相关信息;**************
alter table SC drop   foreign key fk2 ;
-- 此句在MSSQL中要将foreign key改为constraint 
alter table SC add constraint fk2 foreign key(Sno) references Student(Sno) on delete cascade ;
delete from Student where Sno='200215121';
select *from SC ;
select *from Student ;
-- 10.  将学号为“200215121”的学生的学号修改为“S001”;***********
-- http://www.cppblog.com/wolf/articles/69089.html 外键的使用
alter table SC drop  foreign key fk2 ;
alter table SC add constraint fk2 foreign key(Sno) references Student(Sno) on update cascade;
update  Student set Sno='S001' where Sno='200215121';
select *from student;
select *from SC ;
-- 11.  把平均成绩大于80分的男同学的学号和平均成绩存入另一个表S——GRADE(SNO,AVG——GRADE);
drop table S_Grade;
create table S_Grade(
Sno char(10),
avg_grade float);
insert into S_Grade
    select SC.Sno,avg(Grade)
    from SC,Student
    where Ssex='男' and Student.Sno=SC.Sno
    group by SC.Sno
    having avg(Grade) >80;
select Sno 学号,avg_grade 平均成绩 from S_Grade;
-- 12.  把选修了课程名为“数据结构”的学生的成绩提高10%;
select *from SC;
-- 这句仅适合于MYSQL
update SC,Course set grade=1.1*grade
where SC.Cno=Course.Cno and Course.Cname='数据结构';
/* -- 这句仅适合于MSSQL
update SC set grade=grade*1.1
where   Sno in (
    select Sno from SC,Course
    where SC.Cno=Course.Cno and Course.Cname='数据结构' );
*/
select *from SC;

-- 13.  把选修了“2”号课程,且成绩低于该门课程的平均成绩的学生的成绩提高5%;

/*
update SC set grade=grade*1.05
where Cno='2' and Sno in
    (select distinct Sno 
     from SC
     where Cno='2' and grade < (
        select avg(grade) from SC
        where Cno='2' ) );

update SC set grade=grade*1.05
where Cno='2' and grade < (
        select avg(grade) from SC
        where Cno='2' ) ;
*/
/* ===========You can't specify target table 'SC' for update in FROM clause.===========
http://blog.163.com/prevBlogPerma.do?host=xiaoqiu_1120&srl=121632322007112411424982&mode=prev
http://www.cnblogs.com/chy1000/archive/2010/03/02/1676282.html
http://zhidao.baidu.com/question/68619324
http://topic.csdn.net/u/20080521/15/542113f1-de7b-4ebf-9e90-3564fdbc25c0.html *********
http://stackoverflow.com/questions/45494/sql-delete-cant-specify-target-table-for-update-in-from-clause **********
*/
select *from SC;
update SC,(select avg(grade) a from SC where Cno='2') b
set grade=grade*1.05
where Cno='2' and grade<b.a;
select *from SC;

-- 14.  把选修了“2”号课程,且成绩低于该门课程的平均成绩的学生成绩删除掉;

/* -- 在mssql中可以用下面这句执行
delete from SC
where Cno='2' and grade<
    (   select avg(grade) from SC where Cno='2' );
*/
select *from SC where Cno='2' ;

/* ======== You can't specify target table for update in FROM clause ======= */
-- In MySQL, you can't modify the same table which you use in the SELECT part.
-- http://www.xaprb.com/blog/2006/06/23/how-to-select-from-an-update-target-in-mysql/
SELECT * FROM  story_category WHERE category_id NOT IN (
SELECT DISTINCT category.id FROM category INNER JOIN story_category ON category_id=category.id);
DELETE FROM  story_category WHERE category_id NOT IN (
SELECT DISTINCT category.id FROM category INNER JOIN story_category ON category_id=category.id);
/*
UPDATE tbl AS a
  INNER JOIN tbl AS b ON ....
  SET a.col = b.col
*/
DELETE FROM  story_category WHERE category_id NOT IN (SELECT DISTINCT
category.id FROM category INNER JOIN
story_category ON
category_id=category.id);
DELETE FROM  story_category WHERE category_id NOT IN (SELECT DISTINCT
category.id FROM category);

UPDATE My_Table
SET Priority=Priority + 1
WHERE Priority >= 1
AND (SELECT TRUE FROM (SELECT * FROM My_Table WHERE Priority=1 LIMIT 1) as t);
-- 通过建立新表,复制数据,修改数据,删除无用表的方法来达到目的
drop table if exists apples;
create table if not exists apples(variety char(10) primary key, price int);

insert into apples values('fuji', 5), ('gala', 6);

drop table if exists apples_new;
create table if not exists apples_new like apples;
insert into apples_new select * from apples;

update apples_new
    set price = (select price from apples where variety = 'gala')
    where variety = 'fuji';
rename table apples to apples_orig;
rename table apples_new to apples;
drop table apples_orig;




数据库原理实验指导书 实验名称:试验一:SQL语言嵌套查询和数据更新操作 所属课程:数据库原理 实验类型:设计型实验 实验类别:基础□ 专业基础√ 专业□ 实验学时:4学时 一、实验目的 1.熟悉和掌握对数据数据的查询操作和SQL命令的使用,学会灵活熟练的使用SQL 语句的各种形式; 2.加深理解关系运算的各种操作(尤其的关系的选择,投影,连接和除运算); 3.熟悉和掌握数据数据插入、修改、删除操作和命令的使用; 4.加深理解的定义对数据更新的作用 二、预习与参考 1.熟悉SQL SERVER 工作环境; 2.连接到学生-课程数据库 3.复习对数据查询的SQL语言命令; 4.复习对数据插入、修改和删除的SQL语言命令。 三、实验要求(设计要求) 针对教材例子,通过SQL SERVER企业管理器和查询分析器两种模式,熟悉数据嵌套查询、更新操作。 四、实验方法及步骤 1.在S、C、SC上进行简单查询; 2.在S、C、SC上进行连接查询; 3.在S、C、SC上进行嵌套查询; 4.使用聚合函数的查询; 5.对数据的分组查询; 6.对数据的排序查询。 7. 将数据插入当前数据库的S、C、SC; A:用SQL命令形式 B:用SQL SERVER提供的企业管理器以交互方式进行 8.将以上插入数据分别以.SQL文件和.txt文件的形式保存磁盘上; 9.修改S、C、SC数据;   A:用SQL命令形式 B:用SQL SERVER提供的企业管理器以交互方式进行 10.删除S、C、SC数据。 A:用SQL命令形式 B:用SQL SERVER提供的企业管理器以交互方式进行 五、实验内容 在S,C,SC上完成以下操作: 1. 查询学生的基本信息; 2. 查询“CS”系学生的基本信息; 3. 查询“CS”系学生年龄不在19到21之间的学生的学号、姓名; 4. 找出最大年龄; 5. 找出“CS”系年龄最大的学生,显示其学号、姓名; 6. 找出各系年龄最大的学生,显示其学号、姓名; 7. 统计“CS”系学生的人数; 8. 统计各系学生的人数,结果按升序排列; 9. 按系统计各系学生的平均年龄,结果按降序排列; 10. 查询每门课程的课程名; 11. 查询无先修课的课程的课程名和学时数; 12. 统计无先修课的课程的学时总数; 13. 统计每位学生选修课程的门数、学分及其平均成绩; 14. 统计选修每门课程的学生人数及各门课程的平均成绩; 15. 找出平均成绩在85分以上的学生,结果按系分组,并按平均成绩的升序排列; 16. 查询选修了“1”或“2”号课程的学生学号和姓名; 17. 查询选修了“1”和“2”号课程的学生学号和姓名; 18. 查询选修了课程名为“数据库系统”且成绩在60分以下的学生的学号、姓名和成绩; 19. 查询每位学生选修了课程的学生信息(显示:学号,姓名,课程号,课程名,成绩); 20. 查询没有选修课程的学生的基本信息; 21. 查询选修了3门以上课程的学生学号; 22. 查询选修课程成绩至少有一门在80分以上的学生学号; 23. 查询选修课程成绩均在80分以上的学生学号; 24. 查询选修课程平均成绩在80分以上的学生学号; 25. 选做:针对SPJ数据的四个S,P,J,SPJ,完成教材P74-75--习题5的查询及教材P127--习题5的查询。 26. 将数据分别插入S、C、SC; 27. 将表S、C、SC数据分别以.SQL文件和.txt文件的形式保存磁盘上。 28. 在S、C、SC上练习数据插入、修改、删除操作。(比较在上定义/未定义主码(Primary Key)或外码(Foreign Key)时的情况) 29. 将表S、C、SC数据全部删除,再利用磁盘上备份的数据来恢复数据。 30. 如果要在SC插入某个学生的选课信息(如:学号为“200215121”,课程号为“c123”,成绩待定),应如何进行? 31. 求各系学生的平均成绩,并把结果存入数据库; 32. 将“CS”系全体学生的成绩置零; 33. 删除“CS”系全体学生的选课记录; 34. 删除学号为“S1”的相关信息; 35. 将学号为“S1”的学生的学号修改为“S001”; 36. 把平均成绩大于80分的男同学的学号和平均成绩存入另一个S——GRADE(SNO,AVG——GRADE); 37. 把选修了课程名为“数据结构”的学生的成绩提高10%; 38. 把选修了“C2”号课程,且成绩低于该门课程的平均成绩的学生的成绩提高5%; 39. 把选修了“C2”号课程,且成绩低于该门课程的平均成绩的学生成绩删除掉; 40. 选做:将数据插入SPJ数据的四个S,P,J,SPJ,并以.SQL文件和.txt文件的形式保存磁盘
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值