转:MAX函数和GROUP BY 语句一起使用的一个误区
使用MAX 函数和 GROUP 的时候会有不可预料的数据被SELECT 出来。
下面举个简单的例子:
想知道每个SCOREID 的 数学成绩最高的分数。
表信息:
/*DDL Information For - test.lkscore*/
--------------------------------------
Table Create Table
------- -----------------------------------------------------------------------------
lkscore CREATE TABLE `lkscore` (
`scoreid` int(11) DEFAULT NULL,
`chinese` int(11) DEFAULT '0',
`math` int(11) DEFAULT '0',
KEY `fk_class` (`scoreid`),
CONSTRAINT `fk_class` FOREIGN KEY (`scoreid`) REFERENCES `lkclass` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
select * from lkscore;
|
query result(12 records)
scoreid | chinese | math |
1 | 90 | 80 |
2 | 100 | 99 |
3 | 29 | 98 |
4 | 87 | 79 |
5 | 89 | 99 |
1 | 49 | 98 |
3 | 98 | 56 |
2 | 76 | 88 |
2 | 80 | 90 |
3 | 90 | 70 |
1 | 90 | 90 |
1 | 67 | 90 |
错误的SELECT
select scoreid,chinese,max(math) max_math from lkscore group by scoreid;
|
query result(5 records)
scoreid | chinese | max_math |
1 | 90 | 98 |
2 | 100 | 99 |
3 | 29 | 98 |
4 | 87 | 79 |
5 | 89 | 99 |
上面的90明显不对。
方法一:
select scoreid,chinese,math max_math from
(
select * from lkscore order by math desc
) T
group by scoreid;
|
query result(5 records)
scoreid | chinese | max_math |
1 | 49 | 98 |
2 | 100 | 99 |
3 | 29 | 98 |
4 | 87 | 79 |
5 | 89 | 99 |
方法二:
select * from lkscore a where a.math = (select max(math) from lkscore where scoreid = a.scoreid) order by scoreid asc;
|
query result(5 records)
scoreid | chinese | max_math |
1 | 49 | 98 |
2 | 100 | 99 |
3 | 29 | 98 |
4 | 87 | 79 |
5 | 89 | 99 |
这个也是用MAX函数,而且还用到了相关子查询。
我们来看一下这两个的效率如何:
explain
|
query result(2 records)
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
1 | PRIMARY | <derived2> | ALL | (NULL) | (NULL) | (NULL) | (NULL) | 12 | Using temporary; Using filesort |
2 | DERIVED | lkscore | ALL | (NULL) | (NULL) | (NULL) | (NULL) | 12 | Using filesort |
很明显,有两个FULL TABLE SCAN。
|
query result(2 records)
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
1 | PRIMARY | a | index | (NULL) | fk_class | 5 | (NULL) | 12 | Using where |
2 | DEPENDENT SUBQUERY | lkscore | ref | fk_class | fk_class | 5 | a.scoreid | 1 | Using where |
第二个就用了KEY,子查询里只扫描了一跳记录。
很明显。在这种情况下第二个比第一个效率高点。
转:MAX函数和GROUP BY 语句一起使用的一个误区相关推荐
- 转:MySQL中MAX函数与Group By一起使用的注意事项
MySQL中MAX函数与Group By一起使用的注意事项 mysql> select * from test; +----+-------+------+-------+ | id | ...
- Hive第六天——Hive函数(GROUP BY语句、HAVING语句、ORDER BY语句)
本文部分参考自:https://blog.csdn.net/qq_23897391/article/details/90897373 Hive第六天--Hive函数 自己的话:千里之行,始于足下. 每 ...
- MySQL max()函数
转载自 MySQL max()函数 MySQL MAX函数介绍 MySQL MAX()函数返回一组值中的最大值.MAX()函数在许多查询中非常方便,例如查找最大数量,最昂贵的产品以及客户的最大付款. ...
- max等聚合函数和group by搭配使用的注意事项
1 group by的特点 1.1 定义 group_by的意思是根据by对数据按照哪个字段进行分组,或者是哪几个字段进行分组. 如果不在group by 后的分组中使用聚合函数,一般只会返回各个分组 ...
- SELECT执行过程,MySQL聚合函数,多行分组函数,GROUP BY HAVING,详细完整可收藏
文章目录 1.聚合函数介绍 2.五个常用聚合函数 3.GROUP BY 4.HAVING 5.SELECT的执行过程 1.聚合函数介绍 聚合函数作用于一组数据,并对一组数据返回一个值.聚合函数不能嵌套 ...
- 第53章 SQL GROUP BY 语句教程
GROUP BY 语句可结合一些聚合函数来使用 GROUP BY 语句 GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 SELECT col ...
- alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组)
alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组) 1. SQL语句 1.1 sql语言类型 sql是一门独立的 ...
- MySQL——聚合函数和group by分组的使用
文章目录 MySQL--聚合函数和group by分组的使用 1.聚合函数介绍 2.GROUP BY 分组 3.常见的聚合函数 4.SQL执行顺序 MySQL--聚合函数和group by分组的使用 ...
- 【mysql】哦买噶!多么强大的group by语句
GROUP BY 语句 group by语句介绍 工具: 实例 建表 user表 (1)基本用法 (2)`GROUP BY`语句中的`GROUP_CONCAT`函数() (3)利用 `count`函数 ...
最新文章
- Unity中创建本地多人游戏完整案例视频教程 Learn To Create A Local Multiplayer Game In Unity
- 数据不平衡(class_weight、评估方法、上采样、下采样)、详解及实战
- 查询存储过程所需参数
- Server 2012 Hyper-v新功能之一:客户端 Hyper-V
- 01-利用思维导图梳理JavaSE-Java语言基础
- 关于移动端meta设置(未完待续)
- windows下共享文件夹在Linux下打开
- Azure认知服务之使用墨迹识别功能识别手写汉字
- 5, Data Augmentation
- Linux Kernel ‘CLONE_NEWUSER|CLONE_FS’本地权限提升漏洞
- 剑指offer面试题[26]-复杂链表的复制
- 昨天我上午下单买的电池,已经到了长沙
- sql统计各科成绩大于平均分的人_SQL第三关:汇总分析
- 从原子结构--PN结原理--光伏发电
- 新手建站之【域名解析】⑦
- Qt 界面获取键盘Enter键
- 苹果8黑屏无法强制开机_【维修案例】苹果xsmax黑屏死机不开机,如何解决?!...
- ios swiftui_ios swiftui中的本地化
- 使用selenium实现前程无忧简历自动刷新
- 微信小程序开发之.js文件