2.4 DELETE语句
本章中要讲述的DELETE语句的形式或许是它们中最容易的一种。这里没有列的列表——只有一个表名,通常还有一个WHERE子句。其语法简单得不能再简单:
DELETE [TOP (<表达式>) [PERCENT]
[FROM ] <表名>
[FROM ] <表的列表/JOIN条件>
[WHERE <搜索条件>]
此处要小心对待的是两个FROM子句(不,这可不是印刷错误)。可以把这想成是类似于UPDATE的语句,其一用于说明要从中进行删除的表,第二个更像是一个真正的包含JOIN的FROM子句(如果你愿意),表面上看来是用于帮助决定要删除的行。
WHERE子句的作用与前面遇到的所有WHERE子句一样。这里不需要提供列的列表,因为删除的是整个行(也不可能删除半个行)。
由于第一个DELETE的形式非常简单,因此我们只演示一个简单的例子。这里要利用本章前面为联结所构建的样例。万一跳过了前面的例子,这里有构建那些表的代码。
如果在本章的前面已经构建了FULL JOIN的样例,则可以忽略这里的构建脚本,因为它们是完全一样的。


首先,选出Film表中的行,看看都有什么:
![]()
返回的结果正是在前面的构建脚本中插入的两个行:

从Film表中删除Unforgiven名称:
![]()
再执行SELECT语句:

可以看到确实删除了记录。
接下来进入到略为复杂的JOIN场景。现在,要从Actors表中删除所有在Film表中没有匹配行的那些行。该查询要涉及两个表(因此需要JOIN)。另外,它需要了解,在联结的一端没有相应的匹配(Film中没有一条记录能匹配那个演员)。
回想一下,OUTER联结将在没有匹配的一端返回NULL。这里将利用这一点,通过实际对NULL进行测试来找出没有匹配的行。
此处进度很快。如果你尚无多少基础知识,不妨放慢速度,在阅读本节前,先做些复习。相比前一个版本,本书假定读者具有更多的知识和经验,因此讲述速度很快。别着急,仔细阅读这些例子。

我们稍微跳过一点前面的语句,来看第二个FROM子句,可以看到这里使用了LEFT JOIN。该语句意味着将返回所有的演员。若有匹配的FilmID,返回电影;若不存在匹配,则电影一端的列将是NULL。在本例的DELETE语句中,用到了这些知识,并对NULL值进行测试——如果发现FilmID是空值时,则说明此处没有匹配(因此需要删除该演员)。