使用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
select scoreid,chinese,math max_math from (select * from lkscore order by math desc) T group by scoreid;

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。


explain
select scoreid,chinese,math max_math from lkscore a where a.math =
(select max(math) from lkscore where scoreid = a.scoreid) order by scoreid asc;

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 语句一起使用的一个误区相关推荐

  1. 转:MySQL中MAX函数与Group By一起使用的注意事项

     MySQL中MAX函数与Group By一起使用的注意事项 mysql> select * from test; +----+-------+------+-------+ | id |  ...

  2. Hive第六天——Hive函数(GROUP BY语句、HAVING语句、ORDER BY语句)

    本文部分参考自:https://blog.csdn.net/qq_23897391/article/details/90897373 Hive第六天--Hive函数 自己的话:千里之行,始于足下. 每 ...

  3. MySQL max()函数

    转载自  MySQL max()函数 MySQL MAX函数介绍 MySQL MAX()函数返回一组值中的最大值.MAX()函数在许多查询中非常方便,例如查找最大数量,最昂贵的产品以及客户的最大付款. ...

  4. max等聚合函数和group by搭配使用的注意事项

    1 group by的特点 1.1 定义 group_by的意思是根据by对数据按照哪个字段进行分组,或者是哪几个字段进行分组. 如果不在group by 后的分组中使用聚合函数,一般只会返回各个分组 ...

  5. SELECT执行过程,MySQL聚合函数,多行分组函数,GROUP BY HAVING,详细完整可收藏

    文章目录 1.聚合函数介绍 2.五个常用聚合函数 3.GROUP BY 4.HAVING 5.SELECT的执行过程 1.聚合函数介绍 聚合函数作用于一组数据,并对一组数据返回一个值.聚合函数不能嵌套 ...

  6. 第53章 SQL GROUP BY 语句教程

    GROUP BY 语句可结合一些聚合函数来使用 GROUP BY 语句 GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 SELECT col ...

  7. alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组)

    alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组) 1. SQL语句 1.1 sql语言类型 sql是一门独立的 ...

  8. MySQL——聚合函数和group by分组的使用

    文章目录 MySQL--聚合函数和group by分组的使用 1.聚合函数介绍 2.GROUP BY 分组 3.常见的聚合函数 4.SQL执行顺序 MySQL--聚合函数和group by分组的使用 ...

  9. 【mysql】哦买噶!多么强大的group by语句

    GROUP BY 语句 group by语句介绍 工具: 实例 建表 user表 (1)基本用法 (2)`GROUP BY`语句中的`GROUP_CONCAT`函数() (3)利用 `count`函数 ...

最新文章

  1. Unity中创建本地多人游戏完整案例视频教程 Learn To Create A Local Multiplayer Game In Unity
  2. 数据不平衡(class_weight、评估方法、上采样、下采样)、详解及实战
  3. 查询存储过程所需参数
  4. Server 2012 Hyper-v新功能之一:客户端 Hyper-V
  5. 01-利用思维导图梳理JavaSE-Java语言基础
  6. 关于移动端meta设置(未完待续)
  7. windows下共享文件夹在Linux下打开
  8. Azure认知服务之使用墨迹识别功能识别手写汉字
  9. 5, Data Augmentation
  10. Linux Kernel ‘CLONE_NEWUSER|CLONE_FS’本地权限提升漏洞
  11. 剑指offer面试题[26]-复杂链表的复制
  12. 昨天我上午下单买的电池,已经到了长沙
  13. sql统计各科成绩大于平均分的人_SQL第三关:汇总分析
  14. 从原子结构--PN结原理--光伏发电
  15. 新手建站之【域名解析】⑦
  16. Qt 界面获取键盘Enter键
  17. 苹果8黑屏无法强制开机_【维修案例】苹果xsmax黑屏死机不开机,如何解决?!...
  18. ios swiftui_ios swiftui中的本地化
  19. 使用selenium实现前程无忧简历自动刷新
  20. 微信小程序开发之.js文件

热门文章

  1. PHP访问数据库大全
  2. Android 支付密码弹出框
  3. 驱动级键盘模拟(C#)(高手请飘过)
  4. 华为浏览器ajax请求失败,AJAX请求浏览器F12看不到返回值
  5. 1.txt docx zip 文件夹的新建与打开
  6. 李彦宏会晤中国工商银行董事长陈四清
  7. Matlab保存图片的几种方法
  8. C#窗体,如何开启另一个进程,并打开指定的应用程序
  9. Excel不会函数也能一键取出数值整数部分
  10. US7ASCII字符集转换为ZHS16GBK