實驗名稱:實驗四, 數據更新和視圖
實驗目的
1.熟練掌握SQL的常用數據更新操作。 2.熟練應用INSERT,UPDATE,DELETE語句。 3.掌握更新操作的各種格式。 4.掌握視圖的創建、更新、刪除和查詢。
實驗步驟與調試過程(請用簡單的文字描述)
(1)插入如下學生記錄(學號:95030,姓名:李莉,年齡:18);
(2)插入如下選課記錄(95030,1);
(3)計算機系學生年齡改成20;
(4)數學系所有學生成績改成0;
(5)把低於總平均成績的女同學成績提高5分;
(6)修改2號課程的成績,若成績小於75分提高5%,成績大於75時提高4%(兩個語句實現,注意順序);
(7)刪除95030學生信息;
(8)刪除SC表中無成績的記錄;
(9)刪除張娜的選課記錄;
(10)刪除數學系所有學生選課記錄;
(11)刪除不及格的學生選課記錄;
(12)查詢每一門課程成績都大於等於80分的學生學號、姓名和性別,把值送往另一個已經存在的基本表STU(SNO,SNAME,SSEX)中;
(13)把所有學生學號和課程號連接追加到新表中;
(14)所有學生年齡增1;
(15)統計3門以上課程不及格的學生把相應的學生姓名、系別追加到另外一個表中。
(16)將學生學號、總成績、平均成績定義成一個視圖,以便於查詢。
(17)將Student表中所有女生記錄定義爲一個視圖F_STU,並限制對視圖的更新操作不能超過視圖條件限制。
(18)將上一題建立的F_STU視圖,更改爲給所有男生記錄定義的視圖,屬性包括學號、性別、年齡、所選課程號。
(19)在上一題的視圖中找出選修了3號課程的學生。
(20)刪除視圖F_STU。
實驗結果(上傳實驗結果截圖或者簡單文字描述)
1. 刪除主鍵表數據如果有外鍵約束就會報錯。
2. 插入數據用insert into 表直接+表。
3. 更新用update。
4. 刪除直接用delete 可以直接刪除一行數據。
5.操作視圖的時候要用到create view。
疑難小結
1.修改數據時,如果省略where自子句,則表示要修改表中的所有元組,一開始不知道這個地方,錯了好幾次。
2.帶子查詢的修改語句,因爲有update有where語句,而where子句後面可以跟子查詢,所以子查詢也可以嵌套在update語句中,用以構造執行修改操作的條件。
3.進行視圖操作的時候,一開始不是很熟悉過程,然後看了老師發的課件。課件裏面有講解,然後才做的實驗。
實驗詳細操作過程或程序清單
(1)插入如下學生記錄(學號:95030,姓名:李莉,年齡:18)
insert into student(sno,sname,sage)
values ('95030','李莉',18)
(2)插入如下選課記錄(95030,1)
insert into sc(sno,cno)
values('95030',1)
(3)計算機系學生年齡改成20
update student
set sage=20
where sdept='CS'
(4)把數學系所有學生成績改成0
update sc
set grade=0
where 'MA'=
(select sdept
from student
where student.sno=sc.sno)
(5)把低於總平均成績的女同學成績提高5分
update sc
set grade+=5
where grade<
(select avg(grade)
from sc inner join student
on student.sno=sc.sno
where ssex='女')
(6)修改2號課程的成績,若成績小於75分提高5%,成績大於75時提高4%(兩個語句實現,注意順序)
update sc
set grade=grade*(1+0.05)
where cno='002' and grade<75;
update sc
set grade=grade*(1+0.04)
where cno='002' and grade>75;
(7)刪除95030學生信息
delete
from student
where sno='95030'
(8)刪除SC表中無成績的記錄
delete
from sc
where grade is null;
(9)刪除張娜的選課記錄
delete
from sc
where sno=(select sno from student
where sname='張娜')
(10)刪除數學系所有學生選課記錄
delete
from sc
where sno in (select sno from student where sdept='MA')
(11)刪除不及格的學生選課記錄
delete
from sc
where grade<60
(12)查詢每一門課程成績都大於等於80分的學生學號、姓名和性別,把值送往另一個已經存在的基本表STU(SNO,SNAME,SSEX)中
create table STU
(sno char(8),
sname char(8),
ssex char(2)
)
insert into STU(sno,sname,ssex)
select distinct student.sno,sname,ssex
from student,sc
where student.sno not in
(select sno from sc where grade<80) and student.sno=sc.sno
(13)把所有學生學號和課程號連接追加到新表中
create table stu1
(
sno char(8),
cno char(3)
);
insert into stu1(sno,cno)
select sno,cno
from sc;
(14)所有學生年齡增1
update student
set sage=sage+1;
(15)統計3門以上課程不及格的學生把相應的學生姓名、系別追加到另外一個表中
create table stu2
(
sname char(8),
sdept char(20)
);
insert into stu2(sname,sdept)
select sname,sdept
from student
where sno in
(
select distinct sno
from sc
where grade<60
group by sno
having count(grade)>=3
);
(16)將學生學號、總成績、平均成績定義成一個視圖,以便於查詢。
create view grade_sum_avg
as
select sno,sum(grade) as totalgrade,avg(grade) as avg_grade
from sc
group by sno;
(17)將Student表中所有女生記錄定義爲一個視圖F_STU,並限制對視圖的更新操作不能超過視圖條件限制。
create view F_STU(sno,name,dept,sex,age)
as
select *
from student
where ssex='女';
with check option;
(18)將上一題建立的F_STU視圖,更改爲給所有男生記錄定義的視圖,屬性包括學號、性別、年齡、所選課程號。
alter view F_STU(sno,ssex,sage,cno)
as
select student.sno,ssex,sage,cno from student,sc
where student.sno=sc.sno and ssex='男'
(19)在上一題的視圖中找出選修了3號課程的學生。
select F_STU.sno,sname,cno
from F_STU,sc
where F_STU.sno=sc.sno and
sc.cno='3';
(20)刪除視圖F_STU
drop view F_STU;