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

转载于:https://www.cnblogs.com/localtion/p/10515118.html

深入理解bit_or和bit_and,bit_count相关推荐

  1. mysql兼容性高吗_MySQL与标准的兼容性

    作者:创新互联 文章来源:虚拟主机 点击数: 更新时间:2013-04-21 MySQL包含了一些可能在其他SQL数据库找不到的扩充.要注意如果你使用他们,你的代码把不与其他SQL服务器兼容.在一些情 ...

  2. 【MySQL5.7指南】第一章——概述

    1.1 关于本手册 1.2 MySQL数据库管理系统概述 1.3 MySQL 5.7 的新特性 1.4 在 MySQL 5.7 中添加.弃用或删除的服务器和状态变量和选项 1.5 MySQL信息来源 ...

  3. MySQL8的8大新SQL特性

    目录 介绍 公用表表达式(CTE) 窗口函数 作为默认值的表达式 降序索引 函数索引关键部件 强制转换的其他目标类型 具有重复键更新的行和列别名 正则表达式支持 结论 介绍 尽管MySQL8已在近3年 ...

  4. Uedit32高亮文件(加强)

    替换根目录下 wordfile.txt / /L1"C/C++" C_LANG Line Comment = // Block Comment On = /* Block Comm ...

  5. MySQL 8.0有什么新功能

    https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/ 我们自豪地宣布MySQL 8.0的一般可用性. 现在下载 ...

  6. oracle raw性能,对Oracle Raw类型的详细解剖

    SQL create table datatype_test_raw(paddr raw(8)); Table created SQL insert into datatype_test_raw(pa ...

  7. oracle中raw是什么格式,oracle中RAW数据类型

    近日在研究v$latch视图时,发现一个从未见过的数据类型.v$latch 中ADDR属性的数据类型为RAW(4|8)  同时也发现v$process中的ADDR属性的数据类型也为RAW(4|8).于 ...

  8. [Lua工具类]Lua 中MD5的实现

    lua的MD5实现方法: local md5 = {_VERSION = "md5.lua 1.1.0",_DESCRIPTION = "MD5 computation ...

  9. mybatis类型转换配置(springboot集成mybatis的配置)

    使用mybatis将string转为blob存入数据库时出现ora-01465异常,无效的十六进制转换!求解,求解 oracle中用于保存位串的数据类型是RAW,LONGRAW(推荐使用BLOB). ...

最新文章

  1. 通过代码自定义cell(cell的高度不一致)
  2. 英语和数学不好可以学python-西安童程童美Python人工智能少儿编程课程好不好
  3. UML建模——用例图(Use Case Diagram)
  4. c++ createtoolhelp32snapshot取进程路径_Linux进程间通信(上)之管道、消息队列实践
  5. shell脚本中向hive动态分区插入数据
  6. 在linux中dns不安装coching,ubuntu 8.04下openldap的安装和使用
  7. java基本数据类型的标识符_java基础(一)-标识符、变量、基本数据类型及转换、运算符及表达式...
  8. python numpy数组切片_python中numpy数组切片实验解释
  9. 4站地铁50多分钟,百度地图怎么算的
  10. Atitit.  Exception in thread main java.lang.Error: Unresolved compilation problem:
  11. CUDA优化之PReLU性能调优
  12. vega8显卡和mx250哪个好_哪种显卡等效于vega8 vs.mx150?什么显卡等效于MX110与mx110....
  13. SAP License:SAP五大主流ERP一览
  14. MySQL特异功能之:Impossible WHERE noticed after reading const tables
  15. 未检测到正确安装的网络适配器_网络适配器图标出现黄色感叹号的解决办法
  16. 分发自动化_使用bitrise自动化应用分发
  17. 笔记本外接显示器无声音
  18. 近岸蛋白递交注册:年营收3.4亿 朱化星控制71.24%表决权
  19. Ubuntu安装后,无启动项,解决办法
  20. 实验二、贪吃蛇的游戏开发

热门文章

  1. Microsoft Edge 开启 IE 模式
  2. 东北大学计算机a类吗,东北大学在985大学中水平怎么样?东北大学2020能回归双一流A类吗?...
  3. 什么是 FreeMarker?
  4. 英飞凌SP370方案胎压监测器-专业级视频课程-朱有鹏-专题视频课程
  5. Chap和pap认证
  6. 真相 | 投机者根本不是用户!区块链市场因他们起高楼,因他们崩到底!
  7. OnSysCommand( UINT nID, LPARAM lParam );分析
  8. 香港大学计算机授课型硕士(MSc)申请经验分享
  9. 产品开发阶段 EVT DVT PVT MP
  10. laravel-excel使用(老猫包子店的故事)