mysql sql技巧: 子查询改为连接查询&&涉及多个表的删除和更新

一、把子查询改为联结查询

改写匹配值的子查询 --容易

改写非匹配值的子查询

原语句:

select *

  from student

 where student_id not in

(select student_id

           from absence);

改写为:

select student.*

  from student left join absence

 where student.id=abasence.id

   and abasence.id is null;

二、涉及多个表的删除和更新

场景1

某个数据表里数据行是否在另一个数据表里有匹配来删除它们

 delete t1 from t1 inner join t2 on t1.td=t2.id;


场景2

用一个数据表的内容去更新另外一个数据表

update t1,t2 set t2.a=t1.a where t2.id=t1.id;


场景3

把两个表匹配的值都删除掉

delete t1,t2 from t1 inner join t2 on t1.id=t2.id;

 

场景4

删除不匹配另外一个表的数据行

仿照

select *

  from student

 where id not in

(select id

           from absence);

或者:

select student.*

  from student left join absence

 where student.id=abasence.id

   and abasence.id is null;

得到删除语句

delete t1.* from t1 left join t2 on t1.id=t2.id where t2.id is null;

 

场景5

涉及多个表的delete语句 可以使用select语句中的任意一个联结操作

语法,from字句列出删除的表,using用来联结表

 

delete from t1 using t1 inner join t2 on t1.id=t2.id;

delete from t1,t2 using t1 inner join t2 on t1.id=t2.id;

**************************************************************
** 欢迎转发,注明原文:blog.csdn.net/clark_xu   徐长亮的专栏
** 谢谢您的支持,欢迎关注微信公众号:clark_blog 
**************************************************************



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值