数据库中的数据更新操作有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语句,该语句会将你的修改操作提交,这样才会达到真正对数据进行修改的目的。
接下来我们来介绍一个从基本表中衍生出来的新概念———
视图是从一个或几个基本表(或视图)导出的表,它与基本表不同,是一个<虚表>。
数据库中只存放视图的定义,而不存放视图的数据,这些数据仍存放在原来的基本表中。一旦基本表中的数据发生改变,从视图中查询出的数据也会随之改变。从这个意义上讲,视图就像是一个窗口,透过它可以选择性的看到数据库中自己感兴趣的数据及其变化。
视图一经定义,就可以和基本表一样被查询、删除。也可已在一个视图上再定义一个新的视图,但对视图的(增、删、改)有一定限制,本文不做过多讲解,重点讨论视图的建立与查询。
①定义视图
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'; #省略组成视图的所有列名