【数据库原理】(12)SQL数据操纵功能

SQL 中,对基本表的数据操纵功能是指对基本表中数据的插入、修改和删除。

一.插入数据

SQL 的数据插人语句INSERT 有两种形式:一种是插入一个元组,另一种是插人子查询结果。

1.插入单个元组

插入单个元组(或记录)的 INSERT 语句用于向表中添加一行数据。可以指定要插入数据的列,如果某些列在语句中未指定,则这些列将采用默认值(如果有设置)或空值(如果列允许空值)。

INSERT 语句的格式为:

SQL 复制代码
INSERT
INTO <表名>[(<列名>,[<列名>... ])]
VALUES (<常量>[,<常量>]... );

示例 :向课程表 C 中插入一个新的课程记录。

SQL 复制代码
INSERT
INTO C
VALUES ('09','计算机图形学',3);

示例 : 只向选课表 SC 的特定列插入数据。

SQL 复制代码
INSERT
INTO SC(Sno,Cno)
VALUES ('2007111001','09');

2.插入子查询结果

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

插入子查询结果的INSERT 语句的格式为:

SQL 复制代码
INSERT
INTO <表名>[(<列名>,[<列名>...])]
子查询;

示例 :计算每个班级的平均年龄,并将结果存储到一个新表 Classage

先建立一新表 Classage;

SQL 复制代码
CREATE TABLE Classage(
Sclass CHAR(15),
Avgage SMALLINT
);

然后,使用子查询将每个班级的平均年龄计算出来并插入到 Classage 表中。

SQL 复制代码
INSERT INTO Classage (Sclass,Avgage)
SELECT Sclass,AVG(Sage) FROM S
GROUP BY Sclass;

这将计算每个班级的平均年龄,并将班级名和相应的平均年龄插入到 Classage 表中。

在插入数据时,重要的是确保数据的类型和格式与表中定义的列兼容,以及遵守任何完整性约束(例如,不插入 NULL 到不允许 NULL 值的列中)。

二.修改数据

SQL 的 UPDATE 语句用于修改表中已存在的数据。

修改数据语句的一般格式为:

SQL 复制代码
UPDATE 表名
SET <列名>=<表达式>[,<列名>= <表达式>] ...
[WHERE 条件];

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

1.修改某一个元组的值

示例: 将学生 2007111001 的年龄改为 21 岁

SQL 复制代码
UPDATE S
SET Sage = 21
WHERE Sno='2007111001';

2.修改多个元组的值

当需要对表中的多个行进行同样的修改时,可以省略 WHERE 子句,从而对整个表中的所有行进行更新。

示例:将所有学生的年龄增加 1 岁。

SQL 复制代码
UPDATE S
SET Sage = Sage + 1;

3.带子查询的修改语句

在更复杂的情况下,更新操作的条件可能需要基于另一个查询的结果。这时,可以在 UPDATE 语句中嵌套一个子查询。

示例 :将计算机科学专业(CS0701)班级的所有学生的成绩置为 0。

SQL 复制代码
UPDATE SC
SET Grade = 0
WHERE Sno in (
	Select SC.Sno from SC,S WHERE SC.Sno = S.Sno AND Sclass = 'CS0701'
	);

在使用 UPDATE 语句时,特别需要注意的是,没有正确使用 WHERE 子句可能会导致更多行被更新,甚至是整个表的数据被意外地修改。因此,在对生产数据库执行更新操作之前进行彻底的测试是非常重要的。

三.删除数据

SQL 的 DELETE 语句用于从数据库表中删除行。

删除数据语句的一般格式为:

SQL 复制代码
DELETE
FROM <表名>
[WHERE <条件>];

其功能为从指定表中删除满足 WHERE 子句条件的所有元组。如果省略 WHERE 子句,则表示删除表中全部元组。

1.删除某个元组的值

这种类型的删除用于移除表中特定行的数据。通常通过 WHERE 子句指定特定的条件来定位要删除的行。

示例: 删除课程号为'02'的课程记录。

SQL 复制代码
DELETE
FROM C
WHERE Cno ='02'

2.删除多个元组的值

当需要从表中删除多个行时,可以省略 WHERE 子句,从而删除表中的所有行。

示例:删除所有选课记录。

SQL 复制代码
DELETE
FROM SC;

3.带子查询的删除语句

在更复杂的情况下,删除操作的条件可能需要基于另一个查询的结果。这时,可以在 DELETE 语句中嵌套一个子查询。

示例:删除所有课程名称为"计算机图形学"的选课记录。

SQL 复制代码
DELETE FROM SC
WHERE Cno IN (
    SELECT Cno
    FROM C
    WHERE Cname = '计算机图形学'
);

4.更新操作与数据库的一致性

在实际应用中,数据库的一致性非常重要。这意味着当您在一个表中进行删除操作时,可能需要在相关联的表中进行相应的删除,以保持数据的完整性。

示例 :删除学生 2007111001 及其所有选课记录。

删除学生 2007111001:

SQL 复制代码
DELETE
FROM S
WHERE Sno ='2007111001';

删除学生 2007111001 的选课记录:

SQL 复制代码
DELETE
FROM SC
WHERE Sno ='2007111001';

在实际的数据库设计中,通常会利用外键约束和级联删除来自动管理这种一致性,以减少手动维护的负担。

相关推荐
你的微笑,乱了夏天20 分钟前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺31 分钟前
分布式系统架构:服务容错
数据库·架构
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain2 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship2 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站2 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
装不满的克莱因瓶2 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
梦想平凡4 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
TianyaOAO4 小时前
mysql的事务控制和数据库的备份和恢复
数据库·mysql
Ewen Seong4 小时前
mysql系列5—Innodb的缓存
数据库·mysql·缓存