使用的数据库为MySQL
3.5 数据更新
数据更新的操作有三种:
- 插入
- 修改
- 删除
3.5.1 插入数据
SQL的数据插入语句INSERT有两种形式:
- 插入一个元组
- 插入子查询结果(一次插入多个元组)
1. 插入元组
插入元组的INSERT语句的格式:
INSERT INTO 表名 [ 属性列1[, 属性列2]... ] VALUES ( 常量1[, 常量2]... ) [, ( 常量1[, 常量2]... )];
- 其功能是将新元组插入指定表中。
- 其中新元组的属性列1的值为常量1,属性列2的值为常量2,…。
INTO子句中没有出现的属性列,新元组在这些列上将取空值。但必须注意的是,在表定义时说明了NOT NULL的属性列不能取空值,否则会出错。
如果 INTO子句中没有指明任何属性列名,则新插入的元组必须在每个属性列上均有值。
例:将一个新学生元组(学号:201215128,姓名:陈冬,性别:男,所在系:IS,年龄:18岁)插入到 Student表中。
INSERT INTO Student(Sno, Sname, Ssex, Sage, Sdept) VALUES ('201215128', '陈东', '男', 18, 'IS'); SELECT * FROM Student;
在 INTO子句中指出了表名Student,并指出了新增加的元组在哪些属性上要赋值,属性的顺序可以与CREATE TABLE中的顺序不一样。
VALUES子句对新元组的各属性赋值,字符串常数要用单引号(英文符号)括起来。
注意:
- VALUES字句提供的值必须与INTO字句相匹配
- 值的个数要与INTO字句相同
- 值的类型要与INTO中对应的属性列相同
2. 插入子查询的结果
子查询不仅可以嵌套在SELECT语句中用以构造父查询的条件,也可以嵌套在 INSERT 语句中用以生成要插入的批量数据。
插入子查询结果的INSERT语句格式为:
INSERT INTO 表名 [ 属性列1[, 属性列2]... ] 子查询;
注意,子查询的目标列必须与INTO字句相匹配( 值的个数,值的类型 )
例:对每一个系,求学生的平均年龄,并把结果存入数据库。
首先在数据库中建立一个新表,其中一列存放系名,另一列存放相应的学生平均年龄。
CREATE 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; SELECT * FROM Dept_age;
3.5.2 修改数据
修改操作又称为更新操作,其语句的一般格式为:
UPDATE 表名 SET 列名 = 表达式 [,列名 = 表达式] ... [WHERE 条件];
- 其功能是修改指定表中满足WHERE子句条件的元组。
- 其中 SET子句给出 表达式 的值用于取代相应的属性列值。
- 如果省略WHERE子句,则表示要修改表中的所有元组。
1. 修改某一个元组的值
[例3.73] 将学生201215121的年龄改为22岁。
UPDATE Student SET Sage = 22 WHERE Sno = '201215121'; SELECT Sno, Sage FROM Student WHERE Sno = '201215121';
2. 修改多个元组的值
[例3.74] 将所有学生的年龄增加1岁。
UPDATE Student SET Sage = Sage+1; SELECT Sno, Sage FROM Student;
3. 带子查询的修改语句
子查询也可以嵌套在UPDATE语句中,用以构造修改的条件。
[例3.75] 将计算机科学系全体学生的成绩置零。
UPDATE SC SET Grade = 0 WHERE Sno IN ( SELECT Sno FROM Student WHERE Sdept = 'CS' ); SELECT SC.Sno, Sdept, Grade FROM SC,Student WHERE SC.Sno = Student.Sno;
3.5.3 删除数据
删除语句的一般格式为:
DELETE FROM 表名 [WHERE 条件];
- DELETE语句的功能是从指定表中删除满足WHERE子句条件的所有元组。
- 如果省略WHERE子句则表示删除表中全部元组,但表的定义仍在字典中。
- DELETE语句删除的是表中的数据,而不是关于表的定义。
1. 删除某一个元组的值
[例3.76]删除学号为201215128的学生记录。
DELETE FROM Student WHERE Sno = '201215128'; SELECT * FROM Student;
2. 删除多个元组的值
[例3.77] 删除所有的学生选课记录。
DELETE FROM SC; SELECT * FROM SC;
- 这条DELETE 语句将使SC 成为空表,它删除了SC的所有元组。