当前位置:首页 » 其他

高级的DELETE语句

2006-12-23 16:57 本站整理 浏览(13)

更高级的DELETE和UPDATE语句

对于delete ,我知道的仅仅是delete from table1....其实delele也是可以进行连接删除的。

使用D E L E T E和U P D AT E的简单方式是:根据某一列值来删除和更新一行。当估计出应该

删除或更新什么数据时,就像S E L E C T语句那样,D E L E T E和U P D AT E能够使用联结和子查询,

这是一种不常用的方式,但在修改或删除数据时有一些很强大的功能。

提示在练习使用D E L E T E和U P D AT E时,要确保将D E L E T E和U P D AT E语句放在

BEGIN TRAN和ROLLBACK TRAN之间;以便所作的改变不是永久性的。

考虑如下简单的D E L E T E语句:使用所提供的t i t l e _ i d将相应行从s a l e s表中删除(见程序清单2 - 2 7 )。

程序清单2-27 从s a l e s表中删除行

DELETE sales

WHERE title_id = ‘BU1032'

该语句根据值为“ B U 1 0 3 2”的t i t l e _ i d将相应两行从s a l e s表中删去。但如果用户想要删除

某一特定出版商的所有s a l e s时怎么办呢?用户就应该先找到与该特定出版商相关的所有书名,

而后将它们从s a l e s表中删去。利用联结就可以实现用户可以在t i t l e s和s a l e s表之间执行联结运

算。从而找到与出版商相关联的那些书名。

程序清单2-28 通过i d删除某个出版商的s a l e s

DELETE sales

FROM sales

JOIN titles t ON sales.title_id = t.title_id

WHERE t.pub_id = '1389'

另外,如果用户希望根据出版商姓名进行删除时,可以使用程序清单2 - 2 9。

程序清单2-29 通过姓名来删除某个出版商的s a l e s

DELETE sales

FROM sales

JOIN titles t ON sales.title_id = t.title_id

JOIN publishers p ON t.pub_id = p.pub_id

WHERE p.pub_name = 'Algodata Infosystems'

可见,在D E L E T E语句中执行联结操作可以找到并删除那些与其他表中的数据相匹配的

行。联结需要进行比较操作并且限制了在s a l e s表中将要删除的行数,也就是说,只有当找到

一个匹配的书名(根据某个出版商的已知信息)时,才删除s a l e s。

用户也可以使用子查询来限制表中要删除的行。程序清单2 - 2 9中的示例和程序清单2 - 3 0有

相同的执行结果,只不过是用子查询代替联结而已。

程序清单2-30 使用子查询删除某出版商的s a l e s

DELETE sales

WHERE title_id IN

(SELECT title_id from titles

WHERE pub_id = '1389')

注意尽管该查询效率较低,但可读性好。通常情况下,用户应该尽可能地使用联结。

但也有例外的情况,如程序清单2 - 3 1所示。

程序清单2-31 根据s a l e s的平均数量删除s a l e s

DELETE sales

WHERE qty <

(SELECT AVG(qty) from sales)

该查询删除所有销售量小于s a l e s表中的平均数量的s a l e s。不存在使用联结完成同样任务

的合理的D E L E T E语句。子查询在这种情况下不仅十分有用,而且也是必须使用的。