文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL自定义变量?学不废不收费~

2024-12-03 09:28

关注

相信大家对join,where 以及子查询等等操作已经非常熟悉,在此基础上如果对于mysql的用户自定义变量再熟练掌握了,那么对于数据分析来说就又多了一个工具。虽然这个功能不是经常用,但是学来扩展一下自己的知识库也是好的,免得书到用时方恨少。今天有机会请到了自定义变量本量来给大家现场说法,咱天就唠叨唠叨自定义变量是个啥,是咋工作的。

1.自定义变量---自我介绍

大家好,我是mysql自定义变量,和其他的自定义变量一样,你们可以把我当作一个小盒子,如果想要召唤我只要大喊一声

set @ver:='x'

就可以召唤出自定义变量本量,顺便把x放装进了盒子。

当然我除了可以装x,

还可以装b,心中默念 set @ver:='b' 就可以装逼成功

如果心情不好我还可以啥也不装

比如set @ver:=0

如果召唤我请珍惜我,因为我在一次mysql链接中有效。

不要以为我只能散装,把我安装在生产线上照样能行。

比如某条sql生产出来一个指标需要存一下,只需要把结果into我就行了,具体操作如下:

select count(1) into @ver from table

想跟装进去的东西确认眼神么?select @ver,马上告诉你盒子里现在装了个啥

我一般不会单独存在,而是内嵌到sql语句里面作为一个存储中间变量的容器,如果想知道和我sql语句之间是怎么配合的,就不得不了解一下我的小老弟---sql

2,SQL的自我简介

大家好,我是SQL,是一种数据库操作的工具,也是自定义变量的好大哥。如果能配合EXCEL来了解我,就会发现我不是一个慢热的人。能动手咱就不bb,举个栗子让你看一下我们俩有多像

栗子如下:

  1. select 
  2. id 
  3. from 
  4.  
  5. (select id from table1 ) a 
  6.  
  7. join 
  8. (select id from table2) b 
  9. on a.id=b.id 
  10. where a.id>=100 
  11. order by id 

首先我要执行子查询,也就是把a和b两个中间表搞出来(ab两个表可以理解为excle的两个sheet)

然后我再执行join语句,对两个表根据id进行笛卡尔乘积,得到两个表的全部信息(主键唯一的情况下可以理解为excel的vlookup)

当然有些信息并不是我们需要的,怎么过滤呢,用where语句(相当于excel的筛选功能)

最终以order by 对最终结果进行排序(对应excel的排序功能)

下面说一点细节可以加深我和自定义标量之间的合作方式

当我select 想要的列时候(select id from table)可以看成是读取了一列id,也可以看成是一行一行读取id列,每取一条记录,游标往下走一格,当遍历完所有的数据之后再呈现给我们一列id。按照第二种方式相当于是python遍历数组,中间自然可以加一些变量来存储一些数据。

有点抽象?举个例子~

3,举几个栗子

某个数据表格记录了AB两个店每个小时的营业额,原始数据如下

  1. CREATE TABLE `wk_test` ( 
  2. `datevarchar(20) NOT NULL COMMENT '日期'
  3. `shop` varchar(255) NOT NULL COMMENT '商店'
  4. `hourint(11) NOT NULL COMMENT '小时'
  5. `income` int(11) NOT NULL COMMENT '收入'
  6. PRIMARY KEY (`date`,`shop`,`hour`) 
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8         

 

如何观察每天某个时间点A,B两个店的分别的累计营业额?

按照上面所说的原理,如果每读出一条记录相当于游标往下走一下,我们在遍历数据的过程中用变量对中间结果进行记录和判断,那么就能实现上述需求,代码如下:

  1. --初始化变量 
  2.  
  3. set @cosum:=0; 
  4.  
  5. set @dates:=''
  6. set @shop:=''
  7.  
  8. select 
  9. date,shop,hour,income, 
  10.  
  11.  
  12.  
  13. @group_income:= 
  14.  
  15. --判断是否是同一天的同一个商店 
  16.  
  17. case when @dates=a.date and @shop=a.shop 
  18.  
  19. --是一个则累加 
  20.  
  21. then @cosum:=@cosum+income 
  22.  
  23. --不是则将第一个小时的值赋值给累加量 
  24.  
  25. else @cosum:=a.income 
  26.  
  27. end as group_income, 
  28. --保存当前用于判断的变量 
  29. @dates:=a.date
  30. @shop:=a.shop 
  31. from 
  32. (select * from wk_test order by date,shop,hour) a 

结果如下:


用自定义变量实现row_number()over 开窗mysq不支持开窗函数,但是引入自定义变量就能实现相同的效果,具体实现代码如下:

  1. set @row_number:=0; 
  2. set @dates:=''
  3. set @shop:=''
  4.  
  5. select 
  6. date,shop,hour,income, 
  7. @num:=case when @dates=a.date and @shop=a.shop 
  8. then @row_number:=@row_number+1 
  9. else @row_number:=1 
  10. end as group_income, 
  11.  
  12. @dates:=a.date
  13. @shop:=a.shop 
  14. from 
  15. (select * from wk_test order by date,shop,hour) a 

结果如下:


4,后记:

Mysql的自定义变量是一个不太常用的功能,因为大数据基本上是存储在hadoop上,操作一般用hive,spark或者impala,他们都自带一些开窗函数在一定程度上可以取代自定义变量。但是如果懂自定义变量有可能会解决一些不太好解决的问题。

你学废了么?

 

来源:数师兄内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯