SQL 数据更新

本文最后更新于:2024年3月18日 凌晨

SQL 数据更新

插入数据

插入元组

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

注意:

  • 其功能是将元组插入指定表中,其中新元组的属性列1的值为常量1,属性列2的值为常量2,…INTO子句中没有出现的属性列,新元组在这些列上将取空值,但必须注意的是,在定义时说明了NOT NULL的属性列不能取空值,否则会出错。

  • 如果INTO子句中没有指明任何属性列名,则新插入的元组必须在每个属性列上均有值。

[例3.69]:将一个新元组(学号:201215128,姓名:陈东,性别:男。所在系:IS,年龄:18岁)插入到Student表中。

1
2
3
INSERT
INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES('201215128','陈东','男',IS',18);

在INTO子句中指定了表名Student,并指出了新增加的元组在哪些属性上要赋值,属性的顺序可以与CREATE TABLE中额顺序不一样,VALUES子句对新元组的各属性赋值,字符串常数要用单引号(英文符号)括起来。

[例3.70]:将学生张成名的信息插入到Student表中。

1
2
3
INSERT
INTO Student
VALUES('201215126','张成民','男',18,'CS');

与例3.69的不同是在INTO子句中只指出了表名,没有指出属性名,这表示新元组要在表的所有属性列上都指定值,属性列的次序与CREATE TABLE中的次序相同,VALUES子句对新元组的各属性列赋值,一定要注意值与属性列要一一对应,如果像例3.69那样,成为(‘201215126’,‘张成民’,‘男’,‘CS’,18),则含义是将’CS"赋予了列Sage,而18赋予了列Sdept,这样则会因为数据类型不匹配出错。

[例3.71]:插入一条选课记录(‘201215128’,‘1’)

1
2
3
INSERT
INTO SC(Sno,Cno)
VALUES('201215128','1');
  • 关系数据库管理系统将在新插入的Grade列上自动地赋空值。
  • 或者:
1
2
3
INSERT
INTO SC
VALUES('201215128','1',NULL);

因为没有指出SC的属性名,在Grade列上要明确给出空值。

插入子查询结果

子查询不仅可以嵌套在SELECT语句中用以构造父查询的条件,也可以嵌套在INSERT语句中用以生成要插入的批量数据。

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

[例3.72]:对每一个系,求学生的平均年龄,并把结果存入数据库。

首先在数据库中建立一个新表,其中一列存放系名,另一列存放相应的学生平均年龄。

1
2
3
4
CREATE TABLE Dept_age
(Sdept CHAR(15),
Avg_age SMALLINT
);

然后对Student表按系分组求平均年龄,再把系名和平均年龄存入新表中。

1
2
3
4
5
INSERT
INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;

修改数据

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

其功能是修改指定表中满足WHERE子句条件的元组,其中SET子句给出<表达式>的值用于取代相应的属性列值,如果省略WHERE子句,则表示要修改表中的所有元组。

修改一个元组的值

[例3.73]:将学生201215121的年龄改为22岁。

1
2
3
UPDATE Student
SET Sage=22;
WHERE Sno='201215121';

修改多个元组的值

[例3.74]:将所有学生的年龄增加1岁。

1
2
UPDATE Student
SET Sage=Sage+1;

## 带子查询的修改语句

子查询也可以嵌套在UPDATE语句中,用于构造修改的条件。

[例3.75]:将计算机科学系全体学生的成绩置零。

1
2
3
4
5
6
7
UPDATE SC
SET Grade=0;
WHERE Sno IN
(SELETE Sno
FROM Student
WHERE Sdept='CS';
);

删除数据

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

注意:

DELETE语句的功能是从指定表中删除满足WHERE子句条件的所有元组。如果省略WHERE子句则表示删除表中全部元组,但表的定义仍在字典中,也就是说,DELETE语句删除的是表中的数据,而不是关于表的定义。

删除某一个元组的值

[例3.76]:删除学号为201215128的学生记录。

1
2
3
DELETE
FROM Student
WHERE Sno='201215128';

删除多个元组的值

[例3.77]:删除所有的学生选课记录。

1
2
DELETE
FROM SC;

这条DELETE语句将使SC成为空表,它删除了SC的所有元组。

带子查询的删除语句

子查询同样也可以嵌套在DELETE语句中,用以构造执行删除操作的条件。

[例3.78]:删除计算机科学系所有学生的选课记录。

1
2
3
4
5
6
7
DELETE
FROM SC
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Sdept='CS'
);

对于某个基本表中数据的增,删,改操作有可能会破坏参照完整性。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!