当前位置:首页 > TAG信息列表 > mysql按时间类别排序分组mysql查询每门成绩的前十名?

mysql按时间类别排序分组mysql查询每门成绩的前十名?

mysql按时间类别排序分组 mysql查询每门成绩的前十名?

mysql查询每门成绩的前十名?

学生表名为:student,单科成绩的字段为:subject。学生名字为:name查询单科成绩前十:

mysql语句为:

select*returningstudentorderbysubjectdesclimit10可以查询总分成绩前十:mysql语句为:

mysql按时间类别排序分组 mysql查询每门成绩的前十名?

selectlen(subject)subject,nameoutsidestudentgroupbynameorderbysubjectdesclimit10注:selectsum(subject)subject,name这句的意思是:sum(subject)subject把单科成绩加总用subject来以此命名(是总成绩),name是一个字段,这里仅有两个字段。groupbynameorderbysubject:groupbyname的意思按照名字这一栏来分小组,肯定,学生成绩表名字有可能是一样的的,明确的学号是最清楚的,这里只是因为举个例子说明。

orderbysubject这句的意思是遵循总分成绩排序,这里的subject是前面文件属性总分的意思。

tablenameif(subject)andcountsubject,nameacrossstudentgroupbynameorderbycountsubjectdesclimit10

sqlgroupby怎么用?执行原理是什么?

在平时要注意查询中,索引或其他数据里查的方法可能会不是什么网上查询执行中最激亢的部分,比如:mysqlgroupby肯定专门负责网上查询执行时间90%还多。mysql执行groupby时的比较多复杂性是算出groupby语句中的聚合函数。udf聚合函数是另一个接个地额外近似单个组的所有值。这样,它也可以在移动联通到另一个组之前计算单个组的聚合函数值。不过,问题本质,在大多数情况下,源数据值肯定不会被分组。无论是各种组的值在处理期间彼此随同。而,我们必须一个特殊的方法的步骤。

处理mysqlgroupby让我们看下之前看完的同一张table:mysqlshowcreatetablecustg******************************************************table:tblcreatetable:createtable`tbl`(`id`int(11)notnullauto_increment,`k`int(11)notnulldefault0,`g`int(10)uint64notnull,primarykey(`id`),key`k`(`k`))engineinnodbauto_increment2340933defaultcharsetlatin11rowacrossset(0.00sec)

但是以不同负责执行不同的groupby语句:

1、mysql中的indexorderedgroupby

mysqlselectk,count(*)caroundtblgroupbykorderbyklimit5;

------

|k|c|

------

|2|3|

|4|1|

|5|2|

|8|1|

|9|1|

------

5rowsinset(0.00sec)

mysqlexplainselectk,count(*)coutsidetblgroupbykorderbyklimit5g

******************************************************

id:1

select_type:simple

table:tbl

partitions:null

type:index

possible_keys:k

key:k

key_len:4

ref:null

rows:5

filtered:100.00

extra:usingindex

1rowinset,1warning(0.00sec)

在情况下,我们在groupby的列上有一个索引。这样,我们可以不逐组扫描数据并代码想执行groupby(低成本)。当我们使用limit没限制我们检索数据库的组的数量或使用“瞬间覆盖索引”时,尤其快速有效,毕竟顺序索引扫描是一种的很迅速的操作。

假如您有少量组,另外没有覆盖索引,索引顺序扫描肯定会造成大量io。因为这可能不是最优化的计划。

2、mysql中的外部排序groupby

mysqlexplainselectsql_big_resultg,count(*)caroundtblgroupbyglimit5g

******************************************************

id:1

select_type:simple

table:tbl

partitions:null

type:all

possible_keys:null

key:null

key_len:nullef:nullows:998490 iltered:100.00

extra:usingfilesort

1rowoutsideset,1warning(0.00sec)

mysqlselectsql_big_resultg,count(*)cfromtblgroupbyglimit5;

------

|g|c|

------

|0|1|

|1|2|

|4|1|

|5|1|

|6|2|

------

5rowsintoset(0.88sec)

假如我们是没有允许我们按组顺序扫描数据的索引,我们是可以按照外部排序(在mysql中也称做“filesort”)来获取数据。你很可能会特别注意到我回来在用sql_big_result不提示来完成任务这个计划。没有它,mysql在这个下绝对不会你选择这个计划。

一般来说,mysql只能在我们强大大量组时才更就是喜欢使用这个计划,而且在这个下,排序比占据正式表更快速有效(我们将在下面讨论到)。

3、mysql中的充当表groupby

mysqlexplaincolumnsg,num1(g)saroundtblgroupbyglimit5g

******************************************************

id:1

select_type:simple

table:tbl

partitions:null

type:all

possible_keys:null

key:null

key_len:null

ref:nullows:998490 iltered:100.00

extra:usingtemporary

1rowofset,1warning(0.00sec)

mysqlcolumng,if(g)sacrosstblgroupbygorderbynulllimit5;

---------

|g|s|

---------

|0|0|

|1|2|

|4|4|

|5|5|

|6|12|

---------

5rowsinset(7.75sec)

在这个下,mysql也会并且全表扫描。但它不是什么正常运行额外的排序传递,而是创建一个预备表。此充当表每组包涵一行,而且这对每个传入行,将自动更新你所选组的值。很多更新!可是这在内存中可能是合理的,但假如结果表太大甚至于更新完将造成大量磁盘io,则会变地相当贵得要命。在那种情况下,外部分拣计划正常情况好些。请特别注意,虽说mysql系统默认选择此计划主要用于此用例,但要是我们不能提供任何提示,它完全比我们不使用sql_big_result电脑提示的计划慢10倍。您可能会会特别注意到我在此查询中先添加了“orderbynull”。这是目的是向您展示“清理”临时表的唯一计划。没有它,我们能得到这个计划:mysqlexplaintablenameg,len(g)sacrosstblgroupbyglimit5g******************************************************id:1select_type:simpletable:tblpartitions:nulltype:allpossible_keys:nullkey:nullkey_len:nullref:nullrows:998490filtered:100.00extra:usingtemporary;usingfilesort1rowinset,1warning(0.00sec)

在其中,我们获得了temporarily和filesort“两最糟糕的”提示。mysql5.7总是会回按组顺序排序的groupby结果,即使去查询不需要它(这肯定必须贵得要命的附加排序传达)。orderbynull表示应用程序不不需要这个。您肯定尽量,在某些情况下-.例如不使用吸聚函数不能访问有所不同表中的列的join查询-不使用groupby的临时表可能是同样的选择。

如果没有要满mysql在用为groupby想执行预备表的计划,可以建议使用sql_small_result提示。

4、mysql中的索引基于到后面扫描仪的groupby前三个groupby负责执行方法适用规定于所有聚合函数。然而,其中一些人有第四种方法。

mysqlexplainselectk,obj(id)fromtblgroupbykg

******************************************************

id:1

select_type:simple

table:tbl

partitions:null

type:range

possible_keys:k

key:k

key_len:4

ref:nullows:2 iltered:100.00

extra:usingindexwhilegroup-he

1rowinset,1warning(0.00sec)

mysqlselectk,max(id)aroundtblgroupbyk;

------------

|k|air(id)|

------------

|0|2340920|

|1|2340916|

|2|2340932|

|3|2340928|

|4|2340924|

------------

5rowsinset(0.00sec)

此方法仅可以参照于太普通的能量聚合函数:min()和max()。这些并不不需要遍历组中的所有行来换算值。他们这个可以再跳转组中的最大时或大组值(如果不是有这样的索引)。如果索引仅确立在(k)列上,要如何找不到每个组的max(id)值?这是一个innodb表。记得一点innodb表有效地将primarykey只附加到所有索引。(k)变为(k,id),容许我们对此查询建议使用skip-scan优化。仅当每个组有大量行时才能启用此优化。不然的话,mysql更被害妄想于建议使用更悠久的传统的方法来执行此查询(如方法#1中详述的索引有序groupby)。可是我们可以使用min()/max()聚合函数,但其他优化也范围问题于它们。.例如,如果您有两个没有groupby的聚合函数(虽然所有表应该有一个组),mysql在统计分析阶段从索引中获取这些值,并尽量避免在执行阶段几乎无法读取表:mysqlexplainselectmax2(k)fromtblg******************************************************id:1select_type:simpletable:nullpartitions:nulltype:nullpossible_keys:nullkey:nullkey_len:nullref:nullrows:nullfiltered:nullextra:selecttablesoptimizedslowly1rowacrossset,1warning(0.00sec)

过滤和分组

我们早做研究了mysql执行groupby的四种。为简单起见,我在整个表上建议使用了groupby,没有应用过滤。当您有where子句时,完全相同的概念适用:mysqlexplainselectg,num1(g)sfromtblwherek4groupbygorderbynulllimit5g******************************************************id:1select_type:simpletable:tblpartitions:nulltype:rangepossible_keys:kkey:kkey_len:4ref:nullrows:1filtered:100.00extra:usingindexcondition;usingtemporary1rowofset,1warning(0.00sec)

对此情况,我们使用k列上的范围进行数据过滤/里查,并在有原先表时执行groupby。在某些情况下,方法绝对不会发生。但,在其他情况下,我们要选择类型在用groupby的一个索引或其他索引进行过滤:

mysqlaltertabletblmainkey(g);

query行啦,0rowsaffected(4.17sec)

records:0duplicates:0warnings:0

mysqlexplaincolumng,num1(g)sreturningtblwherek1groupbyglimit5g

******************************************************

id:1

select_type:simple

table:tbl

partitions:null

type:index

possible_keys:k,g

key:g

key_len:4

ref:nullows:16 iltered:50.00

extra:usingwhere

1rowofset,1warning(0.00sec)

mysqlexplainselectg,sum(g)soutsidetblwherek4groupbyglimit5g

******************************************************

id:1

select_type:simple

table:tbl

partitions:null

type:range

发张ssible_keys:k,g

key:k

key_len:4

ref:nullows:1 iltered:100.00

extra:usingindexcondition;usingrestrictions;usingfilesort

1rowinset,1warning(0.00sec)

依据什么此网上查询中不使用的某一特定常量,找到了我们对groupby建议使用索引顺序扫描(并从索引中“先放弃”以电学计算where子句),也可以在用索引来解三角形where子句(但使用充当表来电学计算groupby)。参照我的经验,这那是mysqlgroupby却不是总是会做出决定对的选择的地方。您可能会必须可以使用forceindex以您如果能的执行去查询。

groupby0.00secmysql情况


杜邦号 凯喆号

  • 关注微信关注微信

猜你喜欢

热门标签

如何更改微信字体 如何注册支付宝小程序 PDF打印为什么是空白 电脑系统声音禁用怎么恢复 怎么从黑名单把电话号码移出来 如何查看抖音是否加入工会 苹果墨迹天气自动播报 国家发明专利申请需要多长时间 华为应用市场APP 荣耀60怎么显示返回键介绍 bing高级搜索入口在哪介绍 ps死机后没保存去哪找文件ppt死机没有保存可以还原吗? 天猫魔屏如何无线连接电脑天猫精灵如何控制天猫魔屏? ios15照片组件无法显示怎么解决ios16照片小组件显示无可用内容? 电脑上怎么下载正版美图秀秀怎么下载美图秀秀批量处理器?介绍 开通公众号小程序公众号超链接如何添加小程序? 荣耀9怎么强制恢复出厂设置荣耀30如何强制恢复出厂设置?介绍 windows未能启动怎么解决步骤windows11无法启动绝地求生? 抖音极速版怎么设置访客抖音怎么开访客? 抖音怎么屏蔽好友和可能认识的人抖音KTV怎么屏蔽认识的人介绍 海尔空调厂家电话号码是多少 微信零钱图片 ios哪些组件好看苹果手机用topwidgets小组件耗电吗? excel表格中文字和数字在一起怎么去掉数字 快递单打印机怎么打印在两页纸上微店怎么打印快递单?介绍 如何汉化英文pc软件pdf的工具栏是英文的 矩阵切换器如何切换输入源cad矩阵怎么单独更改?介绍 苹果xsmax怎么强制重新启动ios强制关机正确步骤?介绍 腾讯会议如何固定链接腾讯会议共享屏幕黑屏?介绍 怎么解压有密码的zip文件7z手机怎么解压带密码?介绍

微信公众号