面向考试数据库系列博客以笔者的思维脑图为主线,博文内容为笔者对导图的具体分支所作的详细阐述,本篇博文,主要内容为数据更新与视图其中不足,望读者多加指正。
数据更新知识点
关于数据更新,主要为在已有的数据表的基础上进行一定上的数据的增删改。
插入数据
- 插入子句;
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>] … )
- 插入子查询结果
语句格式
INSERT
INTO <表名> [(<属性列1> [,<属性列2>… )]
子查询;
修改数据
UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]…
[WHERE <条件>];
修改数据时应注意
实体完整性
主码不允许修改
用户定义的完整性
删除数据
DELETE
FROM <表名>
[WHERE <条件>]
视图知识点
关于视图,主要需要围绕以下几点展开。
- 建立视图
- 删除视图
- 对视图进行各项增删减改操作
建立视图
REATE VIEW
<视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
删除视图
DROP VIEW BT_S;
例题
对于本章知识点,大多理念是基于原有的知识点。相关例题脑图如下。
#数据更新
例1] 将一个新学生元组(学号:200215128;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中。
INSERT
INTO Student (Sno,Sname,Ssex,Sdept,Sage)
VALUES ('200215128','陈冬','男','IS',18);
[例2] 将学生张成民的信息插入到Student表中。
INSERT
INTO Student
VALUES ('200215126', '张成民', '男',18,'CS');
[例3] 插入一条选课记录( ‘200215128’,'1 ')。
INSERT
INTO SC(Sno,Cno)//RDBMS将在新插入记录的Grade列上自动地赋空值
VALUES ('200215128','1');
//等价
INSERT
INTO SC
VALUES ('200215128','1',NULL);
#插入子查询结果
[例4] 对每一个系,求学生的平均年龄,并把结果存入数据库。
#建表
CREATE TABLE Dept_age(
Sdept CHAR(15), /* 系名*/
Avg_age SMALLINT /*学生平均年龄*/
);
#插入数据
INSERT INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;
#修改数据
[例5] 将学生200215121的年龄改为22岁
UPDATE Student
SET Sage=22
WHERE Sno='201215121';
[例6] 将所有学生的年龄增加1岁
UPDATE Student
SET Sage= Sage+1;
[例7] 将计算机科学系全体学生的成绩置零。
UPDATE SC
SET Grade=0
WHERE 'CS'=(
SELECT Sdept
FROM Student
WHERE Student.Sno = SC.Sno
);
#删除数据
#删除某个元祖的值;
8、删除学号为200215128的学生记录。
DELETE
FROM Student
WHERE Sno= '200215128';
9、删除所有的学生选课记录。
DELETE
FROM SC;//这个我就不截图了
[例10] 删除计算机科学系所有学生的选课记录。
DELETE
FROM SC
WHERE 'CS'=(
SELECT Sdept
FROM Student
WHERE Student.Sno=SC.Sno
);
删除多个元组的值
删除子查询数据
#视图
#1.定义视图
#1.1建立视图
[例1] 建立信息系学生的视图。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS';
[例2]建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生 。
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS'
WITH CHECK OPTION;
[例3] 建立信息系选修了1号课程的学生视图。
CREATE VIEW IS_S1(Sno,Sname,Grade)
AS
SELECT Student.Sno,Sname,Grade
FROM Student,SC
WHERE Sdept= 'IS'
AND Student.Sno=SC.Sno
AND SC.Cno= '1';
[例4] 建立信息系选修了1号课程且成绩在90分以上的学生的视图。
CREATE VIEW IS_S2
AS
SELECT Sno,Sname,Grade
FROM IS_S1
WHERE Grade>=90;
[例5] 定义一个反映学生出生年份的视图。
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2000-Sage
FROM Student;
[例6] 将学生的学号及他的平均成绩定义为一个视图
假设SC表中“成绩”列Grade为数字型
CREATE VIEW S_G(Sno,Gavg)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno;
[例7]将Student表中所有女生记录定义为一个视图
#1.2删除视图
CREATE VIEW F_Student(F_Sno,name,sex,age,dept)
AS
SELECT *
FROM Student
WHERE Ssex='女';
[例8] 删除视图BT_S: DROP VIEW BT_S
DROP VIEW IS_S1;
#查询视图
9、在信息系学生的视图中找出年龄小于20岁的学生。
SELECT Sno,Sage
FROM IS_Student
WHERE Sage<=20;
[例10] 查询选修了1号课程的信息系学生
SELECT IS_Student.Sno,Sname
FROM IS_Student,SC
WHERE IS_Student.Sno =SC.Sno AND SC.Cno= '1';
[例11]在S_G视图中查询平均成绩在90分以上的学生学号和平均成绩
SELECT *
FROM S_G
WHERE Gavg>=90;
#更新视图
[例12] 将信息系学生视图IS_Student中学号200215122的学生姓名改为“刘辰”
UPDATE IS_Student
SET Sname= '刘辰'
WHERE Sno= '201215125';
转换后的语句: //基本表和视图表同步更新
UPDATE Student
SET Sname= '刘辰'
WHERE Sno= '201215125'
AND Sdept= 'IS';
[例13] 向信息系学生视图IS_S中插入一个新的学生记录:200215129,赵新,20岁
视图IS_Student的定义
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS';
//如果加了WITH CHECK OPTION,则视图不能进行插入数据操作
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept= 'IS'
WITH CHECK OPTION;
//插入数据
INSERT
INTO IS_Student
VALUES('200215111','赵新',20);
//插入后基本表Student字段Sdept为空,视图表IS_Student无数据
转换为对基本表的更新:
INSERT
INTO Student(Sno,Sname,Sage,Sdept)
VALUES('200215129','赵新2',20,'IS');
[例14]删除信息系学生视图IS_Student中学号为200215129的记录
DELETE
FROM IS_Student
WHERE Sno= '200215129';
转换为对基本表的更新:
DELETE
FROM Student
WHERE Sno= '200215129' AND Sdept= 'IS';
小结
关于SQL的学习在于多练熟悉。