测试目的:
对数据表中的数据进行分组求最大值,针对本测试,主要是求 每个班级中的年龄最大的学生
测试表student:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '姓名',
`age` int(3) NULL DEFAULT 0 COMMENT '年龄',
`class` int(4) NULL DEFAULT 0 COMMENT '班级',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '张三', 22, 1);
INSERT INTO `student` VALUES (2, '李四', 26, 1);
INSERT INTO `student` VALUES (3, '王五', 20, 2);
INSERT INTO `student` VALUES (4, '赵六', 20, 2);
INSERT INTO `student` VALUES (5, '孙七', 22, 3);
INSERT INTO `student` VALUES (6, '李八', 28, 3);
表数据信息:
![](https://img.haomeiwen.com/i14370439/88bd0d3c3c692e93.png)
错误的写法
SELECT
*
FROM
( SELECT * FROM student order by age desc,class asc) AS b
GROUP BY
`class`;
错误的结果:
![](https://img.haomeiwen.com/i14370439/676f442a9ad76918.png)
正确的写法
SELECT
*
FROM
( SELECT * FROM student order by age desc,class asc limit 99999999) AS b
GROUP BY
`class`;
正确的结果:
![](https://img.haomeiwen.com/i14370439/b3eda884beee5a92.png)
注意:
limit 99999999是必须要加的,如果不加的话,数据不会先进行排序,通过 explain 查看执行计划,可以看到没有 limit 的时候,少了一个 DERIVED(得到) 操作。
explain SELECT * FROM
( SELECT * FROM student order by age desc,class asc limit 99999999) AS b
GROUP BY class;
网友评论