相信大家对join、where、子查询等操作都非常熟悉了。还有一种工具。虽然这个功能不经常用到,但是学习一下扩展自己的知识面也是有好处的,用着不至于对书恨之入骨。今天有机会请来自定义变量原卷给大家做现场讲解。我们将讨论自定义变量是什么以及它们如何工作。1.自定义变量---自我介绍大家好,我是mysql自定义变量,和其他自定义变量一样,大家可以把我当成一个小盒子,如果要叫我,就叫set@ver:='x'可以调出自定义变量volume,顺便把x放进盒子里。当然,除了x,我还可以伪装成b。心里默默说set@ver:='b'就可以假装成功了。如果我心情不好,我也可以装作什么都不是。比如设置@ver:=0如果你给我打电话,请珍惜我,因为我在一个mysql链接中是有效的。别以为我只能批量做,装到生产线上还是可以的。比如某个sql产生的索引需要保存。你只要把结果交给我就行了。具体操作如下:selectcount(1)into@verfromtable你要用你放的东西来确认一下吗?选择@ver,立即让我告诉你现在盒子里有什么。I通常不单独存在,而是嵌入到sql语句中,作为存放中间变量的容器。想知道如何配合我的sql语句,就得懂我给大家讲讲我的小弟---sql2,SQL的自我介绍大家好,我是SQL,一个数据库操作的工具,不错的自定义变量的大哥。如果你能配合EXCEL来了解我,你会发现我不是一个慢吞吞的人。能做到就别bb了。给大家举个栗子,看看我们有多像栗子如下:selectidfrom(selectidfromtable1)ajoin(selectidfromtable2)bona.id=b.idwherea.id>=100orderbyid首先我要执行一个子查询,也就是获取out出两个中间表a和b(两个表ab可以理解为两张excel)然后我执行join语句根据id对两个表进行笛卡尔积得到两个表的所有信息(在只有主键的情况下,可以理解为excel的vlookup)当然有些信息不是我们需要的,怎么过滤呢,用where语句(相当于excel的过滤功能)最后排序orderby的最终结果(对应excel的Sorting函数)下面的细节可以加深我和customscalars的合作。当我选择我要的列时(selectidfromtable),可以看成是读取一列ids,也可以看成是一行一行地读取id列,每取一条记录,光标就移动往下走一个格子,遍历完所有数据后,会呈现一列id。按照第二种方法,就相当于python遍历数组,中间自然可以加一些变量来存储一些数据。有点抽象?比如~3,举几个栗子。某个数据表记录了AB和AB店每小时的营业额。原始数据如下CREATETABLE`wk_test`(`date`varchar(20)NOTNULLCOMMENT'date',`shop`varchar(255)NOTNULLCOMMENT'shop',`hour`int(11)NOTNULLCOMMENT'hour',`income`int(11)NOTNULLCOMMENT'income',PRIMARYKEY(`date`,`shop`,`hour`))ENGINE=InnoDBDEFAULTCHARSET=utf81。如何观察每天某个时间A、B两家店铺的累计营业额?根据上面的原理,如果每条记录都被读出,就相当于光标往下走。在遍历数据的过程中,使用变量记录和判断中间结果,即可实现上述需求。代码如下:--初始化变量set@cosum:=0;set@dates:='';set@shop:='';selectdate,shop,hour,income,@group_income:=--判断是否是同一天的同一家店casewhen@dates=a.date和@shop=a.shop--是一个,则添加then@cosum:=@cosum+income--如果不是,赋值第一个小时totheaccumulativeamountelse@cosum:=a.incomeendasgroup_income,--保存当前用于判断的变量@dates:=a.date,@shop:=a。shopfrom(select*fromwk_testorderbydate,shop,hour)a的结果如下:2.使用自定义变量实现row_number()overwindowopeningmysq不支持开窗函数,但是引入自定义变量可以达到同样的效果.具体实现代码如下:set@row_number:=0;set@dates:='';set@shop:='';selectdate,shop,hour,income,@num:=casewhen@dates=a。dateand@shop=a.shopthen@row_number:=@row_number+1else@row_number:=1endasgroup_income,@dates:=a.date,@shop:=a.shopfrom(select*fromwk_testorderbydate,shop,hour)a结果如下:4、后记:mysql自定义变量是一个不太常用的函数,因为大数据基本都放在hadoop上,一般来说,使用hive、spark或impala进行操作。它们都有一些窗口函数可以在一定程度上替代自定义变量,但是如果你了解了自定义变量,可能会解决一些不容易解决的问题。你失学了吗?
