删除重复消息只留下id最新的一条
delete from user_msgs where id in (select t.id from (select * from user_msgs a
where (a.msg_id,a.target_owner) in (select msg_id,target_owner from user_msgs group by msg_id,target_owner having count(*) > 1)
and id not in (select min(id) from user_msgs group by msg_id,target_owner having count(*)>1)) as t)
concat拼接函数的使用
select name,group_concat(concat_ws('_',id,email) order by id) from user group by name
随机函数的使用:
rand()的取值范围为[0,1)
update shop set amount= floor(1 + rand()*200)
update track_examine_records
set end_time=CONCAT(create_date, ' 23:59:59');
case when的使用
SELECT name,(
CASE sex
WHEN 'M' THEN 'male'
WHEN 'F' THEN 'femal'
ELSE 'unlimit' END
) as sex
from ad_group
sql的先保存再插入
数据不存在则插入,存在则无操作
insert IGNORE into `test_tab` (`name`,`age`) values ('zhangsan',24) ;
不存在则插入,存在则更新
1:insert into `test_tab` (`name`,`age`) values ('zhangsan',50)
ON DUPLICATE KEY UPDATE `age`=50 ;
2:replace into `test_tab` (`name`,`age`) values ('zhangsan',30) ;
对于操作结果来说,很像是save or update,但是实现方式与INSERT的“DUPLICATE KEY UPDATE”关键字不同。当使用replace into语句时,对于重复的数据,是直接删除,然后再插入新数据的。所以它的更新其实不是update,而是delete->insert。大多数情况下,使用replace into完成更新操作并无问题,但是有一种场景必须特别注意:
•当被更新的表,存在insert,update,和delete触发器时,使用replace语句必须特别小心。因为按照业务逻辑,更新完数据后,应该触发update触发器,但是使用replace语句的话,会触发delete和insert触发器,如果update触发器有一些特殊操作(比如记录操作日志)的话,使用replace会导致业务逻辑混乱。
所以当被更新表存在触发器的场景时,使用INSERT的“DUPLICATE KEY UPDATE”关键字更合适。
having的使用
查询不及格科目多于一门的学生姓名
select name ,avg(score),sum(score<60) as gk from student group by name having gk>1