2025年3月31日 星期一 乙巳(蛇)年 正月初一 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 软件应用 > 数据库 > MySQL

MySQL之BIT_OR、BIT_COUNT函数

时间:11-10来源:作者:点击数:16
CDSY,CDSY.XYZ

本文介绍了如何利用MySQL的BIT_OR和BIT_COUNT函数,结合位运算快速计算用户每月访问系统的天数,提供了一种比常规查询更高效的方法。通过对位运算的理解和示例,展示了这两个函数在数据查询中的巧妙应用,提高了查询性能。

1.前言

最近在看MySQL官方文档时,发现一个很巧妙的用法,可以很快速地计算出用户每月的访问系统的天数。下面我们来分析一下原理。

2.数据准备

  • CREATE TABLE data_test (year YEAR, month INT UNSIGNED, day INT UNSIGNED);
  • INSERT INTO data_test VALUES(2022,1,1),(2022,1,20),(2022,1,30),(2022,2,2),(2022,2,5),(2022,2,5);

从上面的建表语句和数据插入语句2022年的1月份的访问天数为3,2月份的访问天数为2。

按照常规的查询,可以按照下面的语句进行查询:

  • with a as (select `year`, `month` from data_test group by `year`, `month`)
  • select b.`year`, b.`month`, count(distinct day) days
  • from a
  • left join data_test b on a.`month` = b.`month` and a.`year` = b.`year`
  • group by b.`year`, b.`month`;
  • +------+-------+------+
  • | year | month | days |
  • +------+-------+------+
  • | 2022 | 1 | 3 |
  • | 2022 | 2 | 2 |
  • +------+-------+------+

3.数据查询

按照常规的做法,我们需要查询两次才能得出结果。其实我们有更简便的方法来查询,就是使用MySQL为我们提供的BIT_ORBIT_COUNT函数。

  • SELECT `year`, `month`, BIT_COUNT(BIT_OR(1 << day)) AS days
  • FROM data_test
  • GROUP BY `year`, `month`;
  • +------+-------+------+
  • | year | month | days |
  • +------+-------+------+
  • | 2022 | 1 | 3 |
  • | 2022 | 2 | 2 |
  • +------+-------+------+

可以看到得到的结果和上面使用常规方法查询的结果一致,那么这两个函数的原理到底是什么呢?我们来一一分析。

  • BIT_OR:该函数是用来进行位运算中的或运算的。
  • BIT_COUNT:该函数是用来计算二进制数中1的个数的。
  • 1 << day:表示1向左移day个位。
    • 1 << 1得到的值是0000 0000 0000 0000 0000 0000 0000 0010
    • 1 << 20得到的值是0000 0000 0001 0000 0000 0000 0000 0000
    • 1 << 30得到的值是0000 0001 0000 0000 0000 0000 0000 0000
    对这3个值进行或运算的话,可以得到0000 0001 0001 0000 0000 0000 0000 0010,取1的个数为3

所以MySQL通过很巧妙的位运算来获得结果,同时也提高了性能。

CDSY,CDSY.XYZ
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐