数据更新
数据库中的数据更新操作有3种:1)向表中添加若干行数据(增);2)删除表中的若干行数据(删);3)修改表中的数据(改)。对于这3种操作,SQL语言中有3种相应的语句与之对应。接下来让我们逐一详细地了解一下。
本文我们依然使用以下三个表来进行数据更新操作:
TABLE1:
S(学生基本信息表)
TABLE2:
C(课程表)
TABLE3:
SC(学生选修课程信息表)
①插入数据:
***SQL的数据插入语句INSERT
通常有两种形式:一种是插入一个元组;另一种是插入子查询结果(即一次插入多个元组)。两种形式在语法格式上稍有有差别: ***
1)插入元组:
INSERT INTO 表名 (你所指定的属性列名) VALUES(写入属性列中的值)
<注意:>如果在INTO
子句后没有显式地指定属性列名,那么在VALUES
后写入属性列中的值时,必须依据你正在操作的表的所有属性列的排列顺序及数据类型,依次写入。特别地,如果在某一属性列中没有写入任何值,那也必须显式的写入NULL
。如果在INTO
子句后显式地指定属性列名,那么在VALUES
后写入属性列中的值时 ,则只需依据你指定的列名顺序,依次写入值即可。此时,如果在某一属性列中没有写入任何值,则无需显式的写入NULL
,系统会自动填写。
例1:
将一个新学生元组(学号:21670166,姓名:小米,性别:女,系别:CS, 年龄:23)插入到S表中。
INSERT INTO S (SNO,SNAME,SSEX,SDEPT,SAGE)
VAALUES('21670166','小米','女','CS',23);
#等价写法(省略列名):
INSERT INTO S
VALUES('21670166','小米','女','CS',23);
#注意,VALUES 子句对新元组的各属性赋值,字符串常数要用单引号括起来。
插入数据前后对比:
2)插入子查询结果:
子查询不仅可以嵌套在SELECT
语句中用于构建父查询条件,也可以嵌套在INSERT
语句中用以生成要插入的批量数据。
插入子查询的语法格式:
INSERT INTO 表名(属性列)
子查询;
说明:与一次插入一个元组的格式相比,没有了VALUES
子句。
例1:
对于每一个系,求学生的平均年龄,并把结果存入数据库。
#建立一个新表,存放系名和平均年龄
CREATE TABLE DEPT_AGE(
SDEPT CHAR(10),
AVG_AGE NUMBER(3,1));
#往新表中批量插入子查询结果
INSERT
INTO DEPT_AGE
SELECT SDEPT,AVG(SAGE)
FROM S
GROUP BY SDEPT;
运行结果如下:
②修改数据:
修改操作又称为更新操作,其语句的一般格式如下为:
UPDATE 表名
SET 列名1 = 表达式1,列名2 = 表达式2···
WHERE (条件);
说明:UPDATE
语句的功能是修改,指定表中满足 WHERE
子句条件的元组,其中SET
子句用列名后的表达式的值取代相应的属性列的原有值,如果缺省WHERE
子句条件约束,则会修改表中的所有元组。
1)修改一个元组的值:
例1:
将学号为21670166的学生的年龄改为23岁。
UPDATE S
SET SAGE = 23
WHERE SNO = '21670166';
#显示修改后的表
SELECT *FROM S;
运行结果如下;
2)修改多个元组的值:
例2:
所有男生的年龄增加一岁。
UPDATE S
SET SAGE = SAGE =1
WHERE SSEX = '男';
运行结果如下;
3)带子查询的修改语句:
子查询也可以嵌套在UPDATE
语句中,用以构造修改的条件。
例1:
将计算机系的学生的成绩置为0。
UPDATE SC
SET GRADE=0
WHERE SNO IN (
SELECT SNO FROM S
WHERE SDEPT = 'CS');
运行结果如下:
③删除数据
***删除数据可以用DELETE
或DROP
语句,但二者具有本质上的区别,DELETE
语句的功能是删除指定表中的满足WHERE
子句条件的元组(如果WHRER
缺省,则删除表中的所有元组,但表的定义任然存在于字典中。换句话说,就是将表中的内容清空);而DROP
语句则会将表中的内容和表的定义一并删除,(换句话说,就是彻底地删除,表不复存在)。
删除语句的一般格式:
DELETE
FROM 表名
WHERE 条件;
1)删除一个元组:
#删除学号为21670166的学生元组
DELETE
FROM S
WHERE SNO LIKE '21670166';
2)删除多个元组:
#删除女学生元组
DELETE
FROM S
WHERE SSEX = '女';
3)带子查询的删除语句:
#删除计算机系所有男学生的选课记录
DELETE
FROM SC
WHERE SNO IN (SELECT SNO FROM S
WHERE SDEPT = 'CS' AND SSEX = '男');
提示:
在命令行界面使用SQL语句更新数据库中的表的相关数据时,一定不要忘记在修改操作做完后,时常添加COMMIT
语句,该语句会将你的修改操作提交,这样才会达到真正对数据进行修改的目的。
接下来我们来介绍一个从基本表中衍生出来的新概念———
视图(view)
视图是从一个或几个基本表(或视图)导出的表,它与基本表不同,是一个<虚表>。
数据库中只存放视图的定义,而不存放视图的数据,这些数据仍存放在原来的基本表中。一旦基本表中的数据发生改变,从视图中查询出的数据也会随之改变。从这个意义上讲,视图就像是一个窗口,透过它可以选择性的看到数据库中自己感兴趣的数据及其变化。
视图一经定义,就可以和基本表一样被查询、删除。也可已在一个视图上再定义一个新的视图,但对视图的(增、删、改)有一定限制,本文不做过多讲解,重点讨论视图的建立与查询。
①定义视图
1)建立视图:
SQL语言使用CREATE VIEW
命令创建视图,一般格式如下:
CREATE VIEW 视图名(列名1,列名2,···)
AS 子查询
WITH CHECK OPTION;
说明:AS
后的子查询可以是任意的 SELECT
语句,是否可以含有ORDER BY
子句和DISTINCT
短语,则取决于具体的系统实现。WITH CHCK OPTION
表示对视图进行UPDATE
、INSERT
、DELETE
操作时要满足视图定义中的谓词条件(即子查询中WHERE
子句后的条件表达式)。
例1:
建立计算机系学生的视图.
CREATE VIEW CS_SUTDENT
AS
SELECT SNO,SNAME,SAGE
FROM S
WHERE SDEPT = 'CS';
运行结果如下:
上例中省略了视图CS_STUDENT的列名,隐含了由子查询SELECT
语句中的三个列名组成。值得高度注意的是,在以下三种情况下,需明确指定组成视图的所有列名:
1.某个目标列不是单纯的属性名,而是聚集函数或列表达式;(注意:此种情况仍可省略视图的列名,只需在子查询中对该聚集函数表达式取别名即可)
2.多表连接时出现了几个同名的列作为视图的字段;
3.明确规定需要在视图中为某个列取指定的名字;
举个栗子:
建立计算机系选修了2号课程的学生的视图,包括(学号、姓名、年龄、成绩)。
#明确指定组成视图的所有列名
CREATE VIEW CS_S2
(SNO,SNAME,SAGE)
AS
SELECT DISTINCT S.SNO,SNAME,SAGE
FROM S,SC
WHERE SDEPT = 'CS' AND CNO = '2';
#省略组成视图的所有列名