mysql中bit_count和bit_or使用

mysql中bit_count和bit_or使用,第1张

在看参考手册的时候看到个案例

3.6.8 Calculating Visits Per Day

首先要说明以下几个函数

bit_count:

就是计算二进制里有多少个1

10的二进制是1010

bit_count(10) = 2

100的二进制是1100100

bit_count(123) = 3

bit_or:

按位或,就是如果两边一个位置上存在1,那这个位置就为1

拿上面10和100举例

10 | 100 转换为二进制就是 1010|1100100

1010

1100100

1101110

1<<day:

向左位移,向左位移几位,然后用0填补

比如day=2

1<<2 = 100

day=4

1<<4 = 10000

回到主题,现在要计算出图中每天的访问量,可以看到day列中是存在重复记录的,所以要去除,一般思路应该会写出以下SQL:

这个的确可以得到正确值,但是官方参考文档里使用了更巧妙的算法

为了演示,现在将day设定为1,2,2,3好了,那就等于

bit_or(1<<1, 1<<2, 1<<2, 1<<3)

10 | 100 | 100 | 1000 =>110 | 100 | 1000 =>110 | 1000 =>1110

当110 | 100的时候,相同的值就不会发生变化,所以最后bit_count的结果就为3

插入2w条数据后,看下执行计划,第一种SQL执行两遍全表扫描

为了明确看到查询性能,我们启用profiling并关闭query cache:

文章摘要:

1、BIT_COUNT/BIT_OR的用法

2、使用位组函数来计算每个月中用户登陆的天数

3、举一反三:统计每个年度用户登陆天数。

示例表中含有代表用户访问网页的年-月-日值。

将返回:

该查询计算了在表中按年/月组合的不同天数,BIT_OR(或)可以自动去除重复的询问。

要求精度高就用decimal

审题错了...

简单写下区别:

float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位)

double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效位)

decimal:数字型,128bit,不存在精度损失,常用于银行帐目计算。(28个有效位)

numberic === decimal

float f = 345.98756f//结果显示为345.9876,只显示7个有效位,对最后一位数四舍五入。

double d=345.975423578631442d//结果显示为345.975423578631,只显示15个有效位,对最后一位四舍五入。

注:float和double的相乘 *** 作,数字溢出不会报错,会有精度的损失。

decimal dd=345.545454879.....//可以支持28位,对最后一位四舍五入。

注:当对decimal类型进行 *** 作时,数值会因溢出而报错。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7257578.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存