深入理解bit_or和bit_and,bit_count
bit_or:二进制数按位或,bit_and:二进制数按位与,bit_count:统计二进制数1个个数
下面以一个例子来说明用法:
示例要实现的功能就是计算每月有几天有访问,先把示例摘录在这里。
1
2
3
4
5
6
7
-- 创建表
CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL,
day INT(2) UNSIGNED ZEROFILL);
-- 插入测试数据
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
(2000,2,23),(2000,2,23);
测试数据截图如下:
mysql> select*from t1;
+------+-------+------+
| year | month | day |
+------+-------+------+
| 2000 | 01 | 01 |
| 2000 | 01 | 20 |
| 2000 | 01 | 30 |
| 2000 | 02 | 02 |
| 2000 | 02 | 23 |
| 2000 | 02 | 23 |
+------+-------+------+
6 rows in set (0.01 sec)
从上面的数据可以看出,1月份有3天有访问,2月份有2天访问。如果用group by来计算,需要使用两次,笔者自己写了个sql语句:
1
2
3
select year, month, count(0)
from (select year, month, day,count(0) from t1 group by year, month, day) as tmp
group by year, month;
就是先按照year,month,day分组计算一次,将结果当成临时表再按照year,month分组计算一次。
官方手册上使用的这样的语句:
1
2
SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1
GROUP BY year,month;
bit_count函数的含义
用来计算二进制数中包含1的个数。
1
select BIT_COUNT(10);
因为10转成二进制是1010,所以该结果就是2。
bit_or函数的含义
就是对两个二进制数进行或运算。如:
1100
或 0101
--------------
1101
上面例子中当计算2月份的访问天数时,
(1<< 02) | (1 << 23) | (1<<23) = 100 | 1000...(23个0)| 1000...(23个0) = 1000...100
再用bit_count一算就是2了,非常巧妙。
此处针对1<<day进行解释:这里的计数采取的是位图法,每天有访问就用1表示,02天表示100,23表示1000..(23个0)。
最后经过bit_or按位或后变成10000..(20个0)100,然后用bit_count统计2进制1的个数为2,非常巧妙
结果:
mysql> select year,month,bit_count(bit_or(1<<day)) as days from t1 group by year,month;
+------+-------+------+
| year | month | days |
+------+-------+------+
| 2000 | 01 | 3 |
| 2000 | 02 | 2 |
+------+-------+------+
2 rows in set (0.00 sec)
此外,还可以对day使用distinct来去重,得出每月有访问的天数:
mysql> select year,month,count(distinct day) from t1 group by year,month;
+------+-------+---------------------+
| year | month | count(distinct day) |
+------+-------+---------------------+
| 2000 | 01 | 3 |
| 2000 | 02 | 2 |
+------+-------+---------------------+
---------------------
作者:峰之流觞
来源:CSDN
原文:https://blog.csdn.net/koli6678/article/details/79841153
版权声明:本文为
bit_or:二进制数按位或,bit_and:二进制数按位与,bit_count:统计二进制数1个个数
下面以一个例子来说明用法:
示例要实现的功能就是计算每月有几天有访问,先把示例摘录在这里。
1
2
3
4
5
6
7
-- 创建表
CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL,
day INT(2) UNSIGNED ZEROFILL);
-- 插入测试数据
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
(2000,2,23),(2000,2,23);
测试数据截图如下:
mysql> select*from t1;
+------+-------+------+
| year | month | day |
+------+-------+------+
| 2000 | 01 | 01 |
| 2000 | 01 | 20 |
| 2000 | 01 | 30 |
| 2000 | 02 | 02 |
| 2000 | 02 | 23 |
| 2000 | 02 | 23 |
+------+-------+------+
6 rows in set (0.01 sec)
从上面的数据可以看出,1月份有3天有访问,2月份有2天访问。如果用group by来计算,需要使用两次,笔者自己写了个sql语句:
1
2
3
select year, month, count(0)
from (select year, month, day,count(0) from t1 group by year, month, day) as tmp
group by year, month;
就是先按照year,month,day分组计算一次,将结果当成临时表再按照year,month分组计算一次。
官方手册上使用的这样的语句:
1
2
SELECT year,month,BIT_COUNT(BIT_OR(1<<day)) AS days FROM t1
GROUP BY year,month;
bit_count函数的含义
用来计算二进制数中包含1的个数。
1
select BIT_COUNT(10);
因为10转成二进制是1010,所以该结果就是2。
bit_or函数的含义
就是对两个二进制数进行或运算。如:
1100
或 0101
--------------
1101
上面例子中当计算2月份的访问天数时,
(1<< 02) | (1 << 23) | (1<<23) = 100 | 1000...(23个0)| 1000...(23个0) = 1000...100
再用bit_count一算就是2了,非常巧妙。
此处针对1<<day进行解释:这里的计数采取的是位图法,每天有访问就用1表示,02天表示100,23表示1000..(23个0)。
最后经过bit_or按位或后变成10000..(20个0)100,然后用bit_count统计2进制1的个数为2,非常巧妙
结果:
mysql> select year,month,bit_count(bit_or(1<<day)) as days from t1 group by year,month;
+------+-------+------+
| year | month | days |
+------+-------+------+
| 2000 | 01 | 3 |
| 2000 | 02 | 2 |
+------+-------+------+
2 rows in set (0.00 sec)
此外,还可以对day使用distinct来去重,得出每月有访问的天数:
mysql> select year,month,count(distinct day) from t1 group by year,month;
+------+-------+---------------------+
| year | month | count(distinct day) |
+------+-------+---------------------+
| 2000 | 01 | 3 |
| 2000 | 02 | 2 |
+------+-------+---------------------+
---------------------
作者:峰之流觞
来源:CSDN
原文:https://blog.csdn.net/koli6678/article/details/79841153
深入理解bit_or和bit_and,bit_count的更多相关文章
- MySQL优化篇(一),我可以和面试官多聊几句吗?——SQL优化流程与优化数据库对象
我可以和面试官多聊几句吗?只是想偷点技能过来.MySQL优化篇(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. MyISAM表锁和InnoD ...
- 5.Mysql常用函数
5.常用函数函数可以进行字符串的处理.数值计算和日期计算等,mysql可以用在SQL(DML)中以增加SQL的功能.5.1 数值函数1. abs(x) 返回x的绝对值select abs(5),abs ...
- MySQL 8.0有什么新功能
https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/ 我们自豪地宣布MySQL 8.0的一般可用性. 现在下载 ...
- Mysql8.0.11简介,新特性
MySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8 ...
- 5. ClustrixDB SQL语法
CustrixDB支持的DML语法 SELECT, DISTINCT, [LEFT | RIGHT | OUTER] JOIN, STRAIGHT_JOIN UNION, HAVING, GROUP ...
- oracle中RAW数据类型
近日在研究v$latch视图时,发现一个从未见过的数据类型.v$latch 中ADDR属性的数据类型为RAW(4|8) 同时也发现v$process中的ADDR属性的数据类型也为RAW(4|8).于 ...
- MySQL技术专题(X)该换换你的数据库版本了,让我们一同迎接8.0的到来哦!(初探篇)
前提背景 MySQL关是一种关系数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用的标准化语言,其特点为体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,在 Web应用方面 MySQ ...
- mysql中bit_count和bit_or函数的含义
翻阅mysql手册时,看到有个示例使用了bit_or方法来去除重复的数据,一开始没看明白,后来看明白之后感觉非常巧妙.示例要实现的功能就是计算每月有几天有访问,先把示例摘录在这里. 1 2 3 4 5 ...
- BIT_COUNT()和BIT_OR()
在学习MySQL手册时,看到根据天数计算访问量时,出现了BIT_COUNT()和BIT_OR()两个函数来处理天数计算的问题 所使用的表格信息如下: mysql> select year,mon ...
随机推荐
- HTML 发表说说 制作方法
==================================================================================================== ...
- EasyUI combobox 加载JSON数据
Action返回 JSON 格式如下: jsonResult = { total=7,rows=[ {TEXT=技术支持, ID=402894ca4419acf1014419b148a10000}, ...
- Office - Word 2013
1. 使用 Quick Parts 向Word中添加自定义属性: 2.
- Android学习——Service(一)
这篇博文来介绍Android另一个十分重要的组件,Service.Service和Activity很类似,区别在于它运行在后台,不可见且没有界面.Service的优先级高于Activity,当系统负载 ...
- 用WCAT进行IIS压力测试
用WCAT进行IIS压力测试 分类: javascript专辑 IT信息化 2008-10-13 16:56 5754人阅读 评论(1) 收藏 举报 iis测试服务器microsoft脚本网络 如何建 ...
- Oracle案例06—— OGG-01098 Could not flush "./dirdat/e1000004383" (error 28, No space left on device)
一.前言 自从换了新环境,各种问题层出不穷,如果不是之前积累的经验丰富,估计都歇菜了,看来作为数据库全栈工程师(oracle/mysql/sqlserver/sap hana/pg/mongodb/r ...
- Infragist ics Ult imate 2015 Vol.1 - Product Keys
Ultimate ProductKeys 2015 Vol.1: 9122-1900164-4504144 9122-9300855-3994197 9122-7600717-4579130 9122 ...
- June 18th 2017 Week 25th Sunday
Life was like a box of chocolates, you never know what you're gonna get. 人生就像一盒巧克力,结果往往出人意料. Compare ...
- python UI自动化实战记录三:pageobject-基类
脚本思路: 使用pageobject模式,写一个basepage基类,所有页面的通用方法封装到基类中.比如打开页面,关闭页面,等待时间,鼠标移到元素上,获取单个元素,获取一组元素,获取元素的子元素,截 ...
- 分享一个SqliteHelper类
分享一个SqliteHelper类 SQLite作为一个本地文件数据库相当好用,小巧.快速.支持事务.关系型,甚至可以运行在Android上.在很久以前的一个项目中,我们用过它来将接收到的数据做本地统 ...