数据更新

数据库中的数据更新操作有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';

#省略组成视图的所有列名

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: