复杂条件查询,更新

连接查询

在日常工作中,经常碰到需要提取特定数据的情况,常常需要用到多表连接查询,条件分组group by,排序等。常用的几种连接方式有左连接,右连接,内连接。在mysql中没有outer join,可以通过union left join  and right join来实现outer join的功能。left join以左边的表为准,right join以右边的表为准,join(inner join)已两张表的交集为准。两张表多条件连接的时候,直接join on xxx=xxx and yyyy=yyyy.....即可。

union

将两个结果集合并成一个结果集。将要合并的两个结果集的列名相同。

exists

尽量使用exists,not exists来代替in,not

select * from join1 where id in(select id from join2);

select * from join1 where exists(select * from join2 where join2.id=join1.id);

笛卡尔积

笛卡尔积其本质就是内连接

select * from join1,join2;与select * from join1 join join2 on 1=1;是等同的

update join1,join2 set join1.address='xxx' where join1.id=join2.id;与

update join1 join join2 on join1.id=join2.id set join1.address='xxx';是等同的


多列子查询

select * from join1 where (id,name) in(select id,name2 from join2);

等价于:select * from join1 join join2 on join1.id=join2.id and join1.name=join2.name2;

group by在mysql中的特殊用法

众所周知,查询中出现的列,未使用聚合函数的都需要出现在group by之后,否则会报错。但是在mysql中,如果出现列未使用聚合函数是不会报错的,而是从分组的多条记录中抽取一条(抽取哪一条并不确定)。

如:select id,name2,t_id from join2 group by id;

复杂的数据订正

 update sdb_b2c_products a join
(select product_id, sum(nums-sendnum) freez from sdb_b2c_order_items where order_id in(
select order_id from sdb_b2c_orders where pay_status = '0' and ship_status='0' and status='active' and createtime >1388170800
) group by product_id)b on a.product_id=b.product_id
set a.freez=b.freez


心得:

在做多表关联更新的时候曾出现过这样的问题,如果跟新表与关联表不是一一对应的关系,就会出现按照关联表第一条的关联信息来修改更新表。所以在

update table1,table2的时候需要检验这两张表的记录是否存在一对多的关系。如果存在,请先核实。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值