数据库中的数据更新

数据更新

数据更新是针对已经建好的表进行的操作
数据更新的三种方式 :

  1. 插入数据
  2. 修改数据
  3. 删除数据

插入数据

插入数据有两种方式:

  • 插入元组
  • 插入子查询结果 (可以一次插入多个元组)

插入元组

语句格式

INSERT
INTO <表名> [(<属性列1> [, <属性列2>...])]
VALUES (<常量1> [, <常量2>]...);

功能: 将新元组插入指定表中

INTO子句:

  • 指定要插入数据的表名及属性列
  • 属性列的顺序可与表定义中的顺序不一致
  • 没有指定属性列: 表示要插入的是一条完整的元组, 且属性列属性与表定义中顺序一致
  • 指定部分属性列: 插入的元组在其余的属性列上取值NULL

例子1-1

1
2
3
4
5
6
#将一个新学生元组(学号:201215123; 姓名:陈冬; 性别:男; 院系:IS; 年龄:18)插入到Student表中.
INSERT
INTO Student (Sno, Sname, Ssex, Sdept, Sage)
VALUES ('201215128', '陈冬'. '男', 'IS'. 18);
#插入一条选课记录('200215128', '1')
INSERT INTO SC VALUES ('200215128', '1', NULL); #不指定属性列时要将所有属性的值写出来, 这里Grade是NULL

插入子查询结果

语句格式

INSERT INTO <表名> [( <属性列1> [,<属性列2>...] )]
子查询;

子查询:

  • SELECT子句目标列必须与INTO子句匹配
    • 值的个数
    • 值的类型

例子1-2

1
2
3
4
5
6
7
8
9
10
11
#对每一个系, 求学生平均年龄, 并把结果存入数据库
# 第一步: 建表
CREATE TABLE Dept_age (
Sdept CHAR(15), #系名
Avg_age SMALLLINT #平均年龄
);
# 第二步: 插入数据
INSERT INTO Dept_age (Sdept, Avg_age)
SELECT Sdept, AVG(age) #子查询语句
FROM Student
GROUP BY Sdept;

检查完整性

在执行插入语句时会检查新元组是否破坏表上已经定义的完整性规则:

  • 实体完整性
  • 参照完整性
  • 用户定义的完整性
    • NOT NULL约束
    • UNIQUE约束
    • 值域约束

修改数据

修改数据的三种方式:

  1. 修改某一个元组的值
  2. 修改多个元组的值
  3. 带子查询的修改语句

语句格式

UPDATE <表名>
SET <列名> = <表达式> [, <列名> = <表达式>]...
[WHERE <条件>];

功能:

  • SET 子句决定要怎么修改 : 给出<表达式>的值用于取代相应的属性列.
  • WHERE 子句决定要修改哪些元组 : 给出条件,只修改满足条件的元组.
    如果不写WHERE子句, 则修改所有元组

修改某一个元组的值

例子2-1

1
2
3
4
#将学生201215121的年龄改为22
UPDATE Student
SET Sage = 22
WHERE Sno = '201215121';

修改多个元组的值

例子2-2

1
2
3
#将所有学生的年龄加1
UPDATE Student
SET Sage = Sage + 1;

带子查询的修改语句

例子2-3

1
2
3
4
5
6
7
8
# 将计算机系全体学生成绩置零
UPDATE SC
SET Grade = 0
WHERE Sno IN (
SELECT Sno
FROM Student
WHERE Sdapt = 'CS'
);

检查完整性规则

在执行修改语句时会检查操作是否破坏表上已经定义的完整性规则:

  • 实体完整性
  • 主键不允许修改
  • 用户定义的完整性
    • NOT NULL约束
    • UNIQUE约束
    • 值域约束

删除数据

删除数据的三种方式 :

  1. 删除某一个元组的值
  2. 删除多个元组的值
  3. 带子查询的删除语句

语句格式

DELETE FROM <表名>
[WHERE <条件>];

功能: : 删除指定表用满足WHERE子句条件的元组
WHERE子句 :

  • 指定要删除的元组
  • 无该子句将会删除表中的全部元组

删除某一个元组的值

例子3-1

1
2
3
#删除学号为201215128的学生记录
DELETE FROM Student
WHERE Sno = 201215128;

删除多个元组的值

例子3-2

1
2
#删除所有学生的选课记录
DELETE FROM SC;

带子查询的删除语句

例子3-3

1
2
3
4
5
6
7
#删除计算机系所有学生的选课记录
DELETE FROM SC
WHERE Sno IN (
SELECT Sno
FROM Student
WHERE Sdept = 'CS'
);