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


杜邦号 凯喆号

  • 关注微信关注微信

猜你喜欢

热门标签

mapgis生成2000坐标系图框 word打印图片老是少一半怎么设置介绍 小米耳机air2s固件升级怎么弄小米耳机Air2s固件升级教程介绍 抖音三岁特效在哪里 美团买菜自提和送货上门操作美团买菜自提和送货上门操作攻略 怎么给应用添加桌面快捷方式 红米note7pro参数 京东后台怎么设置商品分类介绍 联想y700强制恢复出厂设置联想Y700恢复出厂设置步骤介绍 新买的路由器怎么设置密码用手机 如何找回我的日记我找回了什么作文提纲?介绍 怎么把微信里面的黑名单拉出来 win7开机光标闪烁怎么解决WIN7启动光标闪很久 定制小程序需要多少钱? 阅读新闻赚钱的软件排行榜在哪个平台做自媒体比较赚钱? 怎么将excel表格打印完整 光猫有宽带账号密码吗移动光猫password注册码怎么查询? 华为软件自动更新怎么关闭设置 cad如何由3d转成2d界面CAD2014如何三维切换成经典的二维界面?介绍 什么样的网站是做优化了网站内容是如何的优化? 怎么可以把微信聊天记录恢复不显示聊天记录怎么恢复?介绍 猎豹wifi功能介绍为什么手机连接不了猎豹WiFi?介绍 支付宝怎么关闭游戏支付功能支付宝扣除10元会费怎么取消啊?介绍 word怎么设置论文封面word怎么做封面文字?介绍 excel去掉分页符的方法excel分页的虚线怎么删掉?介绍 苹果商城自动扣费怎么申请退款苹果手机被自动扣费 登游戏显示当前网络环境存在风险怎么知道网站(网址)是否安全?介绍 苹果手机设置锁屏怎么设置 3dmax分离工具在哪3dmax编辑多边形怎么把边分离出来?介绍 华为手机以旧换新全攻略华为以旧换新怎么划算?

微信公众号