当前位置:首页 > 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情况


杜邦号 凯喆号

  • 关注微信关注微信

猜你喜欢

热门标签

qq别人给我打电话手机不显示 手机高性能模式会自动开启吗 oppoa11为什么录屏没有声音 微信个人收款码怎么弄 荣耀play手机微信指示灯怎么设置 怎么查看钉钉群文件下载记录介绍 word怎么在选项前面自动打钩Word自动选择选项 怎么分辨真假蜂蜜 删除qq人脸识别怎么删 oppo手机误删的照片怎么恢复 京东双11红包有多少 汉兰达sim卡插哪里 最新版ps有什么功能介绍 华为麦芒4手机内存卡怎么解决 如何布置一个完美的桌面iphone14桌面布局高级感?介绍 二手转转市场 苹果14灵动岛怎么截图为什么我苹果14截图没有灵动岛? 苹果手机在哪里添加录屏功能 电涡流位移传感器品牌电涡流传感器的应用领域有哪些?能举个例子吗?介绍 三星手机动态锁屏壁纸怎么设置三星w20壁纸怎么动?介绍 word文档怎么去掉带格式的批注word转pdf怎么把批注去掉?介绍 iphone官网查序列号激活时间查询 苹果电脑怎么免费下载word苹果笔记本怎么下载石墨文档? excel横坐标文字怎么换行Excel如何换行显示? excel字体红色怎么变回黑色excel目录字体变色? 抖音壁纸最近很火的 怎么才能知道台式电脑网络密码有线电视网络wifi密码忘了怎么办?介绍 京东买的二手手机多久可以退货京东拍拍二手7天无理由退货流程?介绍 苹果手机怎么在图片里加文字苹果手机怎样把短信手写字笔化加粗? windows10为什么关闭不了自动锁屏手机自动关屏关不了是什么原因?介绍

微信公众号