Delete语句的特殊用法

来源:互联网 发布:淘宝网如何开直通车 编辑:程序博客网 时间:2024/06/06 21:38
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是空值时,则说明此处没有匹配(因此需要删除该演员)。
 
 
 =====================================================================
示例1
A. 不带参数使用 DELETE

下例从 authors表中删除所有行。

USE pubsDELETE authors
B. 在行集上使用 DELETE

因为 au_lname 可能不是唯一的,下例删除其中的 au_lname 是 McBadden 的所有行。

USE pubsDELETE FROM authorsWHERE au_lname = 'McBadden'
C. 在游标的当前行上使用 DELETE

下例显示在名为 complex_join_cursor 的游标上所做的删除。它只影响当前从游标提取的单行。

USE pubsDELETE FROM authorsWHERE CURRENT OF complex_join_cursor
D. 基于子查询使用 DELETE 或使用 Transact-SQL 扩展

下例显示基于联接或相关子查询从基表中删除记录的 Transact-SQL 扩展。第一个 DELETE 显示与 SQL-92 兼容的子查询解决方法,第二个 DELETE 显示 Transact-SQL 扩展。两个查询都基于存储在 titles 表中的标题从 titleauthors 表中删除行。

/* SQL-92-Standard subquery */USE pubsDELETE FROM titleauthorWHERE title_id IN    (SELECT title_id    FROM titles   WHERE title LIKE '%computers%')/* Transact-SQL extension */USE pubsDELETE titleauthorFROM titleauthor INNER JOIN titles    ON titleauthor.title_id = titles.title_idWHERE titles.title LIKE '%computers%'
E. 在 DELETE 和 SELECT 中使用 TOP 子句

由于可以在 DELETE 语句中指定 SELECT 语句,因此还可以在 SELECT 语句中使用 TOP 子句。例如,下例从 authors 表中删除前 10 个作者。

DELETE authors FROM (SELECT TOP 10 * FROM authors) AS t1WHERE authors.au_id = t1.au_id
示例2
   1、从数据表t1中把那些id值在数据表t2里有匹配的记录全删除掉   DELETE t1 FROM t1,t2 WHERE t1.id=t2.id  2、从数据表t1里在数据表t2里没有匹配的记录查找出来并删除掉   DELETE t1 FROM t1 LEFT JOIN T2 ON t1.id=t2.id WHERE t2.id IS NULL  3、从两个表中找出相同记录的数据并把两个表中的那些相同数据都删除掉   DELETE t1,t2 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t1.id=25  注意此处的delete t1,t2 from 中的t1,t2不能是别名  如:   delete t1,t2 from table_name as t1 left join table2_name as t2 on t1.id=t2.id where table_name.id=25  在数据里面执行是错误的(MYSQL 版本不小于5.0在5.0中是可以的)  上述语句改写成   delete table_name,table2_name from table_name as t1 left join table2_name as t2 on t1.id=t2.id where table_name.id=25
原创粉丝点击