mysql中这样解决数据排序和分组排序

更新时间:2023-06-19 08:15:54 阅读: 评论:0

英文信落款mysql中这样解决数据排序和分组排序超市简介
为⼤家熟知的关系型数据库有mysql、SQLServer、oracle、DB2等。它们的sql语句其实是有细微的差别的,不要想着有些语句在SQLServer上可以⽤就可以在mysql上使⽤。今天⽼韩就来讲⼀下其中的⼀个知识点,mysql中如何排名。
SQLServer和oracle中有row_num函数,可以对数据库中信息进⾏排名,但是mysql中却没有这个函数,那么在mysql中如何解决这个问题呢,下⾯⽼韩分为两块来讲解这个问题。螃蟹怎么画
⼀、直接排序编号;
⽼韩想对student学⽣表中的学⽣按照score来进⾏排名,有些读者朋友说了,直接⽤order by⼀下不就完了,这样是按照成绩排名了,但是并没有编号,所以仅仅使⽤order by相当于需求实现了⼀部分,⽽且是很少的⼀部分,废话不多说直接上SQL语句:
柳色青t @nub:=0;
联想维修站lect (@nub:=@nub+1) as 排名,a.* from student a order by score;
执⾏结果:可以看到已经实现了需求,既排序了,⼜有了排名字段,咱们来分析⼀下SQL语句,t是赋
值,还有⼀个赋值的关键字是lect,但是使⽤lect时候就不能直接将上⾯SQL语句中的t直接替换为lect,因为lect必须和lect语句结合来使⽤,必须写成:lect @nub:=@nub+1 as 排名,b.* from (lect * from student ) b, (lect @nub:=0) c order by score
“@”是声明变量的意思,除了“@”还有“@@”,两个@符号表⽰是全局变量,⼀个@符号表⽰局部变量,mysql中也可以使⽤declare声明变量,但是在这不可以使⽤,后⾯存储过程章节,⽼韩会讲,就跟Java中的new关键字⼀样,“:=”表⽰赋值,这个地⽅等同于“=”,由于“:=”⽐“=”使⽤范围⼴泛,统⼀使⽤“:=”即可,@nub:=@nub+1表⽰@nub先+1再赋值给@nub,这个地⽅是前⾯⽼韩讲过的虚拟列,这⾥不多做赘述。
⼆、分组后再排序编号;
直接上SQL语句,⽼韩再针对SQL语句进⾏分析,SQL语句:
最好玩网络游戏lect
@nub:=(ca when @classnoCopy=classno then @nub+1 el 1 end ) as 排名,c.*,@classnoCopy:=c.classno
from
(lect b.* from (lect distinct classno from student order by classno)a left join student b on a.classno = b.classno) c ,(lect @nub:=0,
@classnoCopy:=0 )d
查询结果为:如下图所⽰,可以看到实现了我们的需求。
先对学⽣进⾏分组再通过score来排名,⽼韩针对上⾯的sql语句来进⾏⼀个分析,分析⼀个sql语句的时候先从内往外分析,因为执⾏的时候也是从内⽽外,有⼈会问你为啥知道,如果内部不执⾏,外部如何查数据,肯定是内部先出来数据之后,外部才能去查。
最下⾯的别名为d的数据集,这个地⽅前⾯已经讲过,声明两个变量并赋值。
别名为c的数据集,这⾥⾯有个关键字distinct,表⽰去重,实际上不写也没问题但是⽼韩为了更明显就写了,表⽰取student表中所有的班级编号并去重,加上left join表⽰以班级为主表来进⾏数据填充,因为⽼韩⼜加了order by classno表⽰升序排列,那么所有的信息都会以这个顺序去匹配,效果如下图所⽰;
加上left join之后的效果如下图所⽰,如果不能理解为什么是这种效果可以查看前⾯的左连接、右连接章节,其实这个地⽅完全可以写成lect urname,classno,score from student order by classno,
阅读点亮人生这⾥是赶巧了可以直接使⽤order by,如果是字符串就不好说了。
改善报告模板最关键的地⽅来了,@nub:=(ca when @classnoCopy=classno then @nub+1 el 1 end ) as 排名,c.*,@classnoCopy:=c.classno这两句代码如何理解呢?我们要明确⼀点,sql执⾏就想Java程序main⽅法中代码执⾏⼀样,从上到下去执⾏,先执⾏@nub:=(ca when
@classnoCopy=classno then @nub+1 el 1 end ) as 排名。
这⾥⾯有个ca when 语句,读者朋友不要懵逼,这个东西其实我们前⾯学过的,它表⽰当classnoCopy=classno返回true的时候
@nub=@nub+1,el就是返回fal,@nub=1,最后以end结尾,表⽰语句结束,是不是跟三元运算⾮常相似啊,其实mysql中也有三元运算但是写法跟Java中不⼀样,所以上⾯的语句可以写成这样:@nub:=if(@classnoCopy=classno,(@nub+1),1),if(),⽠号内有三个变量,第⼀个变量就是表达式,返回⼀个boolean类型,后⾯跟两个值,如果是true就返回第⼀个值,如果fal就返回第⼆个值。
sql语句执⾏是从这⼀句开始执⾏的,可以看到,刚开始@classnoCopy是0,很明显跟班级编号不⼀样,那么这个时候排名等于1,开始执⾏下⾯的语句,下⾯的语句是赋值,将classno赋值给@classnoCopy,sql语句是⼀⾏⼀⾏对结果集进⾏扫描的,到第⼆⾏的时
候,@classnoCopy=classno很明显是成⽴的,所以排名会加1变成2,扫描第三⾏的时候@classnoCopy=classno不成⽴了,因为这个时候@classnoCopy是1,classno是2,排名⼜变成了1,循环执⾏语句就得到需要的结果。

本文发布于:2023-06-19 08:15:54,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/989586.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:语句   数据   排序   赋值   排名   结果   变量   效果
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图