有如下一张表:
t_user 有code name 连个字段
-- 删除t_user表中name相同的数据,并保留code最大的数据
方法一:
SELECT NAME,max(CODE) nodel FROM t_user GROUP BY NAME HAVING count(1) > 1
) b ON a. NAME = b. NAME
WHERE a. CODE NOT IN (nodel);
方法二:
delete a from t_user a ,
(
select name,max(code) nodel from t_user group by name having count(1)>1
) b
where a.name = b.name and a.code not in(nodel);
上面用到数据库常用的分组查询,子查询,关联删除
(注意) 在关联删除时,delete from a left join b on a.xxx=b.xxx where a.xxx=xxxx 语法错误,因为数据库中不存在b表对应的查询临时表,所以用到联合删除、联合修改、联合插入时必须指明数据库中真实存在的表
delete a(数据库真实存在的表) from tb_xxx a left(inner ........其他关联表)
---- ------ ------- ----- ------- ------- ------ ---- ------ ------- ----- ------- -------美丽的分割线长期更新 ------ ---- ------ ------- ----- ------- ------- ------ ---- ------ ------- ----- ------- ------- ------
第二:
有一张user表,里面有id ,name,wage(工资)字段
查询工资最小的十位,并给他们增加1000元
select name,wage+1000 from test1 order by wage limit 0,9
---- ------ ------- ----- ------- ------- ------ ---- ------ ------- ----- ------- -------美丽的分割线长期更新 ------ ---- ------ ------- ----- ------- ------- ------ ---- ------ ------- ----- ------- ------- ------
第三:
有两张表,1)user表-------》字段有user_id,user_name
2)payment表--------》字段有payment_id,user_id(关联用户表),month,money
查询所有用户最近一个月的缴费情况:
select u.name,p.money from user u inner join payment p on u.user_id = p.user_id inner join (
select user_id,max(month) from payment grounp by user_id having count(1)>1) t
on p.user_id = t.user_id
where p.month = max(month);
---- ------ ------- ----- ------- ------- ------ ---- ------ ------- ----- ------- -------美丽的分割线长期更新 ------ ---- ------ ------- ----- ------- ------- ------ ---- ------ ------- ----- ------- ------- ------