mysql自定义函数怎么设置(MySQL自定义变量?学不废不收费~)
mysql自定义函数怎么设置
MySQL自定义变量?学不废不收费~
相信大家对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,举个栗子让你看一下我们俩有多像
栗子如下:
select
id
from
(select id from table1 ) a
join
(select id from table2) b
on a.id=b.id
where a.id>=100
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两个店每个小时的营业额,原始数据如下
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:='';
select
date,shop,hour,income,
@group_income:=
--判断是否是同一天的同一个商店
case when @dates=a.date and @shop=a.shop
--是一个则累加
then @cosum:=@cosum+income
--不是则将第一个小时的值赋值给累加量
else @cosum:=a.income
end as group_income,
--保存当前用于判断的变量
@dates:=a.date,
@shop:=a.shop
from
(select * from wk_test order by date,shop,hour) a
结果如下:
2.用自定义变量实现row_number()over 开窗mysq不支持开窗函数,但是引入自定义变量就能实现相同的效果,具体实现代码如下:
set @row_number:=0;
set @dates:='';
set @shop:='';
select
date,shop,hour,income,
@num:=case when @dates=a.date and @shop=a.shop
then @row_number:=@row_number+1
else @row_number:=1
end as group_income,
@dates:=a.date,
@shop:=a.shop
from
(select * from wk_test order by date,shop,hour) a
结果如下:
4,后记:
Mysql的自定义变量是一个不太常用的功能,因为大数据基本上是存储在hadoop上,操作一般用hive,spark或者impala,他们都自带一些开窗函数在一定程度上可以取代自定义变量。但是如果懂自定义变量有可能会解决一些不太好解决的问题。
你学废了么?
原文地址:https://mp.weixin.qq.com/s/-78Ae-3USYFbzZkC0iYAFQ
- mysql性能怎么看(是什么影响了 MySQL 的性能?)
- 查看mysql执行计划关键字(带你学习MySQL执行计划)
- mysqlgroupby语句实现原理(Mysql中错误使用SQL语句Groupby被兼容的情况)
- mysql char和varchar区别(MySQL CHAR和VARCHAR存储、读取时的差别)
- 所有聚合函数mysql教程(Mysql 聚合函数嵌套使用操作)
- mysql和mycat半主从复制项目(Linux如何使用 MyCat 实现 MySQL 主从读写分离)
- mysql修改复杂密码设置(MySQL修改密码的几种方式)
- mysql简单查询基本语句(详解MySQL 查询语句的执行过程)
- mysql各种锁详解(MySQL 查看事务和锁情况的常用语句分享)
- centos7怎么安装mysql(Centos7 mysql数据库安装及配置实现教程)
- MYSQL中常用的强制性操作
- mysql实验总结分析(MySQL查询截取的深入分析)
- mysql获取随机数(MySQL 生成随机数字、字符串、日期、验证码及 UUID的方法)
- idea的mysql如何连接(在IntelliJ IDEA中使用Java连接MySQL数据库的方法详解)
- mysql千万级别数据查询优化(mysql千万级数据量根据索引优化查询速度的实现)
- 安装mysql中要注意什么问题(安装Mysql时可能会遇到的一些疑难杂症)
- 苹果正式发布自研芯片M1 5nm 32核心 彻底放弃Intel(苹果正式发布自研芯片M1)
- 苹果自研芯片跑分对比 A16芯片排名靠后,M1系列霸榜(苹果自研芯片跑分对比)
- X86处理器的梦魇 苹果M1自研芯片到底有多强(苹果M1自研芯片到底有多强)
- 泰剧《爱欲之神》Boom kitkong和Great合体杂志(泰剧爱欲之神Boomkitkong和Great合体杂志)
- 素人恋爱综艺火药味十足 男生为赢得芳心集体扯头花,真是出好戏(素人恋爱综艺火药味十足)
- 《囧妈》为何受抵制 春节七部影片撤档背后的责任与博弈(囧妈为何受抵制)
热门推荐
- python函数使用方法高级用法(Python函数的参数常见分类与用法实例详解)
- sqlserver日志被删除(sql server日志处理不当造成的隐患详解)
- 在windows安装docker详细步骤(Docker 部署 Prometheus的安装详细教程)
- ExecuteNonQuery()返回值
- css三种布局模式(CSS实现等分布局的4种方式)
- python如何一行行读取文件(python 实现一次性在文件中写入多行的方法)
- js如何生成随机数
- SQL SERVER中查看一个数据库的表结构及字段
- python分析excel基础数据生成报表(Python实现定制自动化业务流量报表周报功能XlsxWriter模块)
- jenkins集成docker自动部署(详解docker部署Jenkins新手使用教程)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9