高级的DELETE语句

更高级的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语句。子查询在这种情况下不仅十分有用,而且也是必须使用的。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值