Mysql查询场景
一、数据库设置了自增主键,如何重置?
truncate table 表名
或者
删除主键再新增主键设置为自增
二、如何将查询的多个字段中按某个字段去重,其余字段保留最新数据
SELECT distinct id,name,age,createTime,updateTime FROM USER
想要查询用户最新的访问记录,按名字去除重复。distinct 只能写在最前面,去除重复的也是按照全部要查询的字段全相等才去重。现在想查询张三、李四,时间最新的记录
经过查询相关博客,使用 group by 可以实现去重
SELECT id,name,age,createTime,updateTime FROM USER group by name order by createTime desc
虽然实现了去除重复,但是显示的记录其它字段并不正确,张三记录的最新时间应该是 2020-10-07
解析:group by 的过程是得到结果集的第一行,第一行是按照物理存储顺序的第一行,是随机不可预测的。group by 后上下文会切换到组,而不是行,因此按照标准SQL ,
select 字段列表无法使用非分组字段。在MySQL 中对标准的 group by 进行了扩展,可以使用非分组字段
SELECT id,name,age,max(createTime) createTime from user group by name
这样查询的数据是相对正确的(事实上数据是伪造的一条记录,通过聚合函数。因为 id = 1 的记录时间实际是2020-10-5 ),因此使用了分组就不应该在 select 后使用非分组字段,不符合规范
正确的写法:(个人觉得网上很对对这里讲解的博客都是有很大的误差)
SELECT name,age,max(createTime) createTime from user group by name,age
三 插入重复即更新
将需要插入的数据设定为 unique key
insert into t_user(name,age) value('zhangsan',20) on DUPLICATE key update age = (10)