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_namecount(*)from use1 
group by user_name 
having count(*) >1

-- 去除重复的数据 且选择保留id最大的
delete a
from use1 a joinselect user_nameMAX(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

 

posted @ 2017-11-29 20:53  JennyYIN  阅读(185)  评论(0编辑  收藏  举报