MySQL 开发技巧
1、如何更新使用过过滤条件中的数据,包含自身的表?
数据源如下:
-- 把最终成佛的角色更新为“齐天大圣” (使用join来解决) -- 第一种方法 MySQL 不支持(报错1093 不能更新在from从句的表),只可以使用在SQLsever、oracle完全可以执行 update use1 set over="齐天大圣" where use1.use_name in ( select use2.use_name from use1 inner join use2 on use1.user_name=use2.user_name); -- 第二种方法 使用join链接 update use1 join ( select use2.user_name from use1 inner join use2 on use1.user_name=use2.user_name) as b on use1.user_name= b.user_name set use1.over="齐天大圣";
2、使用 join优化子查询
-- 优化前的语句 使用的是子查询 select use1.user_name ,use1.over , (select over from use2 where use1.user_name=use2.user_name) as over2 from use1; -- 优化后的语句 使用的是left join 优化子查询 select use1.user_name ,use1.over,use2.over as over2 from use1 left join use2 on use1.user_name=use2.user_name;
3、使用Join 优化聚合子查询
添加新表
-- 如果查询出四个组中打怪最多的日期? -- 优化前 使用子查询的方法 select a.user_name,b.timestr,b.kills from use1 a join use3 b on a.id=b.user_id where b.kills=(select max(c.kills) from use3 c where c.user_id=b.user_id); -- 优化后 避免使用子查询 ,使用join链接的方法 select a.user_name,b.timestr,b.kills from use1 a join use3 b on a.id=b.user_id join use3 c on c.user_id=b.user_id group by a.user_name,b.timestr,b.kills having b.kills=max(c.kills);
4、如何查询以及删除重复数据
-- 查询重复数据 select user_name,count(*)from use1 group by user_name having count(*) >1 -- 去除重复的数据 且选择保留id最大的 delete a from use1 a join (select user_name,MAX(ID) as id,count(*)from use1 group by user_name having count(*) >1)b on a.user_name = b. user_name where a.id< b.id