数据更新操作有三种:向表中添加若干行数据、修改表中的数据、删除表中的若干行数据。
插入数据:
SQL 的数据插入语句 INSERT 通常有两种形式,一种是插入一个元组,另一种是插入查询结果。后者可以一次插入多个元组。
1.插入元组:
插入元组的 INSERT 语句格式为:
INSERT
INTO <表名> [(<属性列1> [,<属性列2>]...)]
VALUES (<常量1> [,<常量2>]...);
其功能是将新元组插入指定的表中。其中新元组的属性列 1 的值为常量 1,属性列 2 的值为常量 2,…。INTO 子句中没有出现的属性列,新元组在这些列上将取空值。但必须注意的是,在表定义时说明了 NOT NULL 的属性列不能取空值,否则会出错。
如果 INTO 子句中没有指定任何属性列名,则新插入的元组必须在每个属性列上都有值。
例题:将一个新学生元组(学号:201215128,姓名:陈冬,性别:男,所在系:IS,年龄:18 岁 )插入到 Student 表中。
INSERT
INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES('201215128','陈冬','男','IS',18);
在 INTO 子句中指出了表名 Student,并指出了新增加的元组在哪些属性列上要赋值,属性的顺序可以与 CREATE TABLE 中的顺序不一样。VALUES 子句对新元组的各属性赋值,字符串常数要用英文单引号括起来。
例题:将学生“张成民”的信息插入到 Student 表中。
INSERT
INTO Student
VALUES('201215126','张成民','男',18,'CS');
本例题中没有指出属性名,这表示新元组要在表的所有属性列上都指定值,且属性的顺序与 CREATE TABLE 中的顺序相同。VALUES 子句对新元组的各属性列赋值,一定要注意值与属性列要一一对应,否则会由于数据类型不匹配而出错。
例题:插入一条选课记录('201215128','1')。
INSERT
INTO SC(Sno,Cno)
VALUES('201215128','1');
关系数据库的管理系统将在新插入记录的 Grade 列上自动地赋值为空。
或者:
INSERT
INTO SC
VALUES('201215128','1',NULL);
因为没有指出 SC 的属性名,所以在 Grade 列上要明确给出空值。
2.插入子查询结果:
子查询不仅仅可以嵌套在 SELECT 子句中用以构造父查询的条件,也可以嵌套在 INSERT 子句中用以生成要插入的批量数据。
插入子查询结果的 INSERT 语句格式为:
INSERT
INTO <表名> [<属性列1>[,<属性列2>...])
子查询;
例题:对每一个系,求学生的平均年龄,并把结果存入数据库。
首先在数据库中建立一个新表,其中一列存放系名,另一列存放相应的学生平均年龄。
CREAT TABLE Dept_age
(Sdept CHAR(15)
Avg_age SMALLINT);
然后对 Student 表按系分组求平均年龄,再把系名和平均年龄存入新表中。
INSERT
INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;
修改数据:
修改数据又称为更新操作,其语句一般格式为:
UPDATE<表名>
SET<列名>=<表达式> [,<列名>=<表达式>]...
[WHERE<条件>];
功能是修改指定表中满足 WHERE 子句条件的元组。其中 SET 子句给出 <表达式> 的值用于取代相应的属性列值。如果省略 WHERE 子句,则表示要修改表中所有的元组。
1.修改某一个元组的值:
例题:将学生 201215121 的年龄改为 22 岁。
UPDATE Student
SET Sage=22
WHERE Sno='201215121';
2.修改多个元组的值:
例题:将所有学生的年龄增加 1 岁。
UPDATE Student
SET Sage=Sage+1;
3.带子查询的修改语句:<