数据库系统原理:数据删除
SQL命令包括数据定义、查询、操纵和控制四大类。其中,数据操纵即数据更新包括数据插入、数据删除和数据修改三类。
首先学习数据删除命令的用法。
一、数据删除命令的基本用法
语法:
Delete From 基本表名 [Where 条件表达式]
即从FROM后面的基本表中删除满足Where 条件表达式中的条件的元组。
需要注意:
★Delete语句只能从一个基本表中删除满足Where子句中的条件的元组,即在FROM后面只能有一个基本表名。
★ Delete只删表中的数据,表的定义仍然在数据字典中存在;删除数据后,仍然可以引用该表。
如果语句中没有Where 条件表达式的话,程序会将基本表中的全部数据清空,但是表的定义依然存在。
DELETE命令与数据定义中的删除命令DROP命令的区别:DROP命令不仅删除表中的数据,连带表的定义一起删除。
二、删除一条记录
例1:在基本表S中删除学号是s1的学生。
Delete
From S
Where sno= 's1';
学生的信息是在S表中的,所以FROM后面给出的表名是S,条件是“学号等于s1” ,即删除掉S表中满足“学号是s1”的这行记录。
三、删除多条记录
例2:在基本表SC中删除无成绩的选课记录。
Delete
From SC
Where grade IS NULL
学生的成绩记录是在SC表中的,所以FROM后面给出的表名是SC,条件是“没有成绩”即“成绩为空” 的这些记录,那么SC表中只要是成绩为空的记录都被删除。
四、带子查询的删除
例3:删除所有女学生的选课记录。
学生的选课信息在SC表中,而学生的性别在S表中。
错解:
Delete
From S, SC
WhereS.sno=SC.snoand sex='女';
不能因为删除涉及两张表,就在FROM后面用S和SC表并列、然后给出连接条件、指出选择条件。
因为DELECT命令的用法最需要注意的就是FROM语句中FROM后面只能给出一个表名,也就是说每次删除的时候只能删除一个表中的数据。
若涉及到多表的情况,另一个表的数据可以通过子查询的形式来给出。
正解:
Delete
From SC
Where sno in (Select sno
From S
Where sex='女');
首先通过子查询在S表中查询所有性别为女生的学生的学号信息,子查询的结果就是所有性别为女生的学生的学号信息;然后通过谓词IN,只要学号在女生的学号信息里面,就把该数据在SC表中删除。
五、总结
数据删除命令是用DELECT来实现的,可以使用DELECT命令删除一行记录、多行记录以及在涉及多表数据时使用子查询来做删除操作。需要注意的是,DELECT命令只是删除表中的数据。
DBMS会控制增、删、改等更新操作、做一系列的检查,使之符合完整性约束条件。
例如删除主表S中的数据时,当用户执行:
Delete From S Where sno= 's1'
系统并不立即执行删除命令,而是去检查子表SC,因为在表SC定义的时候创建了外键,其中学号为外键、引用的是S表中的学号这个属性列;当系统检查SC表中存在有学号为s1的学生选课记录时,则系统默认的处理策略是拒绝用户在主表S中的删除命令。