注意事项
数据库所有的库名,表名,字段名使用小写
字段类型不同虽然也可以查询,但是会使索引失效(非数字类型)
当索引字段为数字类型,条件为字符类型,查看其执行计划仍然使用到了索引
当索引字段为非数字类型,条件为数字类型,查看其执行计划索引失效
EXPLAIN SELECT
*
FROM
t_user
where id='5'
表字段有创建时间和更新时间,直接设置默认值即可,不必在代码中维护
- 创建时间的默认值
CURRENT_TIMESTAMP
- 跟新时间的默认值
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
创建表
CREATE TABLE `t_user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`uname` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
`money` decimal(32,0) DEFAULT NULL,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
插入数据
INSERT INTO `t_user`(`id`, `uname`, `money`, `update_time`, `create_time`) VALUES (1, '张三', 20, '2020-12-29 17:01:07', '2020-12-28 14:26:01');
INSERT INTO `t_user`(`id`, `uname`, `money`, `update_time`, `create_time`) VALUES (2, '李四', 20, '2020-12-29 17:01:10', '2020-12-28 15:26:01');
INSERT INTO `t_user`(`id`, `uname`, `money`, `update_time`, `create_time`) VALUES (3, '王五', 30, '2020-12-29 17:01:13', '2020-12-27 14:26:01');
INSERT INTO `t_user`(`id`, `uname`, `money`, `update_time`, `create_time`) VALUES (4, '赵六', 30, '2020-12-29 17:01:15', '2020-12-27 09:26:01');
INSERT INTO `t_user`(`id`, `uname`, `money`, `update_time`, `create_time`) VALUES (5, '田七', 10, '2020-12-29 17:01:19', '2020-12-26 14:26:01');
INSERT INTO `t_user`(`id`, `uname`, `money`, `update_time`, `create_time`) VALUES (6, '老八', 10, '2020-12-29 17:01:21', '2020-12-26 08:26:01');
INSERT INTO `t_user`(`id`, `uname`, `money`, `update_time`, `create_time`) VALUES (7, '胡九', 40, '2020-12-29 17:01:23', '2020-12-29 14:26:01');
INSERT INTO `t_user`(`id`, `uname`, `money`, `update_time`, `create_time`) VALUES (8, '刘十', 20, '2020-12-29 17:01:29', '2020-12-29 14:26:01');
INSERT INTO `t_user`(`id`, `uname`, `money`, `update_time`, `create_time`) VALUES (9, '的的', 10, '2020-12-29 17:01:32', '2020-11-29 14:32:44');
表结构如下
GROUP BY
根据创建时间,按天分组,并取每天最后一个
根据年分组使用year是没问题的
根据月分组使用month(不同年的相同月,会当作同一个月)
根据天分组使用day(不同月的相同天,会当作同一天)
根据指定时间格式分组比较靠谱
SELECT
DATE_FORMAT( create_time, "%Y-%m-%d" ),
MAX( create_time ) AS time
FROM
`user`
GROUP BY
DATE_FORMAT( create_time, "%Y-%m-%d" )
HAVING
MAX(
create_time)
结果
如果使用day
SELECT DAY
( create_time ),
MAX( create_time ) AS time
FROM
`user`
GROUP BY
DAY ( create_time )
HAVING
MAX(
create_time)
结果11.29没了
取每组最后一条
先子查询中order by后分组,需要在order by之前加上having 1或者在其之后加上limit 10000000,否则order by失效,且limit也有局限性,当数据超过1000000会丢失部分,所以推荐having 1
order by
根据money倒叙,moeny相同的根据创建时间倒叙
SELECT
*
FROM
t_user
ORDER BY
money DESC,
create_time DESC
结果