写点什么

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

用户头像
Java王路飞
关注
发布于: 2021 年 03 月 19 日

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

今天有机会请到了自定义变量本量来给大家现场说法,咱天就唠叨唠叨自定义变量是个啥,是咋工作的。

  • 自定义变量---自我介绍

大家好,我是 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,举个栗子让你看一下我们俩有多像

栗子如下:

selectidfrom(select id from table1 ) ajoin(select id from table2) bon a.id=b.idwhere a.id>=100order 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 两个店每个小时的营业额,原始数据如下

CREATE TABLE `wk_test` (`date` varchar(20) NOT NULL COMMENT '日期',`shop` varchar(255) NOT NULL COMMENT '商店',`hour` int(11) NOT NULL COMMENT '小时',`income` int(11) NOT NULL COMMENT '收入',PRIMARY KEY (`date`,`shop`,`hour`)) ENGINE=InnoDB DEFAULT CHARSET=utf8            
复制代码


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

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

--初始化变量set @cosum:=0;set @dates:='';set @shop:='';
selectdate,shop,hour,income,@group_income:=--判断是否是同一天的同一个商店case when @dates=a.date and @shop=a.shop--是一个则累加then @cosum:=@cosum+income--不是则将第一个小时的值赋值给累加量else @cosum:=a.incomeend as group_income,--保存当前用于判断的变量@dates:=a.date,@shop:=a.shopfrom(select * from wk_test order by date,shop,hour) a
复制代码

结果如下:

2.用自定义变量实现 row_number()over 开窗

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

set @row_number:=0;set @dates:='';set @shop:='';
selectdate,shop,hour,income,@num:=case when @dates=a.date and @shop=a.shopthen @row_number:=@row_number+1else @row_number:=1end as group_income,
@dates:=a.date,@shop:=a.shopfrom(select * from wk_test order by date,shop,hour) a
复制代码

结果如下:

4,后记:

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

你学废了么?

原文链接:https://mp.weixin.qq.com/s/-78Ae-3USYFbzZkC0iYAFQ

如果觉得本文对你有帮助,可以关注一下我公众号,回复关键字【面试】即可得到一份 Java 核心知识点整理与一份面试大礼包!另有更多技术干货文章以及相关资料共享,大家一起学习进步!


发布于: 2021 年 03 月 19 日阅读数: 16
用户头像

Java王路飞

关注

需要资料添加小助理vx:17375779923 即可 2021.01.29 加入

Java领域;架构知识;面试心得;互联网行业最新资讯

评论

发布
暂无评论
MySQL自定义变量?学不废不收费