摘要:在上一个章节数据库管理系统——SQL(数据查询)-CSDN博客中,我们学习了SQL的数据查询,本篇博客将继续讲述SQL的数据更新和视图
目录
一、数据更新
数据更新即在创建表完成以后,对表中内容的更新操作,主要包括:插入数据、修改数据和删除数据
1.1插入数据
插入一个新的元组
语法:INSERT INTO <表名> [(<属性列1>[,<属性列2 > ] …)]
VALUES (<常量1> [,<常量2>]… );
其中:
每个属性都需给出指定值
没有指定值的属性会为NULL
当属性字段的约束为NOT NULL,此时指定属性为NULL会报错
例1:将一个新学生元组(学号:20180009,姓名:陈冬,性别:男,出生日期:2000-5-22,主修专业:信息管理与信息系统)插入到Student表中。
语法:INSERT INTO Student (Sno,Sname,Ssex,Smajor,Sbirthdate)
VALUES ('20180009', '陈冬', '男','信息管理与信息系统', '2000-5-22’);
例2:将学生张成民的信息插入到Student表中
语法:INSERT INTO Student
VALUES ('20180008', '张成民', '男','2000-4-15','计算机科学与技术');
插入子查询结果
语法:INSERT INTO <表名> [(<属性列1> [,<属性列2>… )]
子查询;
例1:对每一个专业,求学生表Student学生的平均年龄,并把结果存入数据库表Smajor_age
语法:INSERT INTO Smajor_age(Smajor, Avg_age)
SELECT Smajor,AVG(extract(year from current_date)-extract(year from Sbirthdate))
FROM Student
GROUP BY Smajor;
1.2修改数据
语法:UPDATE <表名>
SET <列名>=<表达式> [ ,<列名>=<表达式> ] …
[WHERE <条件> ] ;
修改某一个元组的值
例1:将学生20180001的出生日期改为2001年3月18日
语法:UPDATE Student
SET Sbirthdate='2001-3-18'
WHERE Sno='20180001';
修改多个元组的值
例1:将2020年第1学期选修81002课程所有学生的成绩减少5分
语法:UPDATE SC
SET Grade= Grade-5
WHERE Semester='20201' AND Cno='81002';
带子查询的修改语句
例1:将计算机科学与技术专业学生成绩置零
语法:UPDATE SC
SET Grade=0
WHERE Sno IN ( SELECT Sno
FROM Student
WHERE Smajor= '计算机科学与技术');
1.3删除数据
语法:DELETE FROM <表名>
[WHERE <条件>];
删除某一个元组的值
例1:删除学号为20180007的学生记录。
语法:DELETE FROM Student
WHERE Sno='20180007';
删除多个元组的值
例1:删除所有的学生选课记录。
语法:DELETE FROM SC;
删除带子查询的语句
例1:删除计算机科学与技术专业所有学生的选课记录
语法:DELETE FROM SC
WHERE Sno IN ( SELECT Sno
FROM Student
WHERE Smajor= '计算机科学与技术' );
二、视图
视图的特点
- 虚表,是从一个或几个基本表(或视图)导出的表
- 只存放视图的定义,而不存放视图对应的数据
- 基本表中的数据发生变化,从视图中查询出的数据也随之改变
视图的作用
1.视图能够对机密数据提供安全保护
例如:Student表涉及全校30个院系的学生数据
可以在其上定义30个视图
每个视图只包含一个院系的学生数据
只允许每个院系的主任查询和修改本院系的学生视图
2.视图对重构数据库提供了一定程度的逻辑独立性
例如:学生关系Student(Sno,Sname,Ssex,Sbirthdate,Smajor) “垂直”地分成两个基本表:
SX(Sno,Sname,Sbirthdate)
SY(Sno,Ssex,Smajor)
3.视图能够简化用户的操作
4.视图使用户能以多种角度看待同一数据
2.1定义视图
建立视图语法:
CREATE VIEW <视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
例:建立信息管理与信息系统专业学生的视图
语法:CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Ssex,Sbirthdate, Smajor
FROM Student
WHERE Smajor='信息管理与信息系统’;
删除视图语法:
DROP VIEW <视图名>[CASCADE];
例:删除视图S_AGE:
语法:DROP VIEW S_AGE;
2.2查询视图
例:在信息管理与信息系统专业学生的视图中,找出年龄小于等于20岁的学生(包括学生的学号和出生日期)
语法:SELECT Sno, Sbirthdate
FROM IS_Student #视图名
WHERE (extract(year from current_date)-extract(year from Sbirthdate) )<=20;
2.3更新视图
通过视图来插入(INSERT)、删除(DELETE)和修改(UPDATE)数据。
例1:将信息管理与信息系统专业学生视图IS_Student中学号为“20180005”的学生姓名改为“刘新奇”
语法:UPDATE IS_Student
SET Sname=‘刘新奇'
WHERE Sno='20180005';
例2:删除信息管理与信息系统专业学生视图IS_Student中学号为“20180207”的记录
语法:DELETE FROM IS_Student
WHERE Sno='20180207’;
三、空值的处理
空值是一个很特殊的值,含有不确定性。对关系运算带来特殊的问题,需要做特殊的处理。
一般有以下几种情况:
①该属性应该有一个值,但目前不知道它的具体值
②该属性不应该有值
③由于某种原因不便于填写
空值的判断(IS NULL/IS NOT NULL)
例:从Student表中找出漏填了数据的学生信息。
语法:SELECT *
FROM Student
WHERE Sname IS NULL OR Ssex IS NULL
OR Sbirthdate IS NULL
OR Smajor IS NULL;
空值的约束
在创建基本表时,如果属性定义(或者域定义)为 NOT NULL 约束,则该属性不能取空值。主码的属性不能取空值如:SC表的主码是( Sno,Cno ) , Sno 和 Cno 都不能取空值。Student表的主码是Sno,不能取空值
空值的算术运算、比较运算和逻辑运算
空值与另一个值(包括另一个空值)的算术运算的结果为空值
空值与另一个值(包括另一个空值)的比较运算的结果为UNKNOWN
有UNKNOWN后,传统的逻辑运算中二值(TRUE,FALSE)逻辑就扩展成了三值逻辑(TRUE、FALSE、UNKNOWN)
小结
在本节内容中,我们学习了SQL的数据更新和视图,最后还讲解了一些关于空值NULL的处理,下一节我们将讲述SQL的存储过程和触发器。