zoukankan      html  css  js  c++  java
  • Mysql学习笔记009

    根据天计算访问量

     

     

    先建一个表、插入一些数据 每一条数据表示用户访问某网站的日期(如:2000-01-01)

    mysql> CREATE TABLE t1(
    -> year YEAR(4),
    -> month INT(2) UNSIGNED ZEROFILL,
    -> day INT(2) UNSIGNED ZEROFILL
    -> );
    Query OK, 0 rows affected (0.53 sec)

    mysql> INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),
    -> (2000,2,23),(2000,2,23);
    Query OK, 6 rows affected (0.08 sec)
    Records: 6 Duplicates: 0 Warnings: 0

    mysql>

     

     

    栗子:查询每个月的访问天数(重复的不算)

    操作如下:

    SELECT year, month, BIT_COUNT(BIT_OR(1<<day)) AS day FROM t1 GROUP BY year, month;

    mysql> SELECT year, month,
    -> BIT_COUNT(BIT_OR(1<<day)) AS day FROM t1
    -> GROUP BY year, month;
    +------+-------+-----+
    | year | month | day |
    +------+-------+-----+
    | 2000 | 01 | 3 |
    | 2000 | 02 | 2 |
    +------+-------+-----+
    2 rows in set (0.00 sec)

    mysql>

    传送门 分享一个解释BIT_COUNT()和BIT_OR()的博客。

    还有一个传送们 , 看的书都是和我一样的。

     

     

    查看一下表中的数据:

    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.00 sec)

    mysql>

     

     

    如果看了进了传送们也觉得不是很懂的同学,那就听我白话吧。

    看了这个操作:

    SELECT year, month, BIT_COUNT(BIT_OR(1<<day)) AS day FROM t1 GROUP BY year, month;

    我相信大多数人一定会有两个疑惑在心中产生,BIT_OR() 和 BIT_COUNT()是干啥的?为什么还有这种操作?

    首先讲解一下BIT_COUNT()函数:

    BIT_COUNT(N) 返回的是N(二进制)中的1的个数.

    我写个栗子你就明白了:

    SELECT BIT_COUNT(100); 这个的答案是多少?

    想一想100的二进制是:1100100

    mysql> SELECT bin(100);
    +----------+
    | bin(100) |
    +----------+
    | 1100100 |
    +----------+
    1 row in set (0.00 sec)

    mysql>

    那答案应该是3喽?

    mysql> SELECT BIT_COUNT(100);
    +----------------+
    | BIT_COUNT(100) |
    +----------------+
    | 3 |
    +----------------+
    1 row in set (0.00 sec)

    mysql>

    少侠您真是好眼力,答案就是3。

    这下知道BIT_COUNT()函数是干啥的了吧。

     

     

    然后我们来接着探讨第二个问题BIT_OR()是干啥的?

    别看他们两个长得很像,但他们不同性质的函数。

    BIT_OR(expr)是将expr这个列的所有字段都OR一遍  计算执行的精确度64位,这里好多博客都没有列举过怎么用的example 可能是他们认为他简单了,也可能是他们也不会用(他们肯定不会用,嘿嘿嘿)

    那之前的一个shop表作为操作:

    SELECT * FROM shop;

    mysql> SELECT * FROM shop;
    +---------+--------+-------+
    | article | dealer | price |
    +---------+--------+-------+
    | 0001 | A | 3.45 |
    | 0001 | B | 3.99 |
    | 0002 | A | 10.99 |
    | 0003 | B | 1.45 |
    | 0003 | C | 1.69 |
    | 0003 | D | 1.25 |
    | 0004 | D | 19.95 |
    +---------+--------+-------+
    7 rows in set (0.06 sec)

    我们把article这一列进行BIT_OR()试一试。 在实验之前推算一下结果应该是什么?

    0001

    0001

    0010

    0011

    0011

    0011

    OR   0100       

    ————————

    0111

    结果应该是这样的吗?

    mysql> SELECT BIT_OR(article) FROM shop;
    +-----------------+
    | BIT_OR(article) |
    +-----------------+
    | 7 |
    +-----------------+
    1 row in set (0.00 sec)

    mysql>

    7就是二进制的0111 没错吧,并且我不管有多少个1 连续OR 结果都是1 

    1 or 1 or 0 or 1  =  1 

    转换成这个问题中的逻辑就是:不管我今天访问了多少次,我就是访问过了这个网站(用逻辑表示就是1)

     

     

    我们回过头来再看一遍这种操作:

    SELECT year, month, BIT_COUNT(BIT_OR(1<<day)) AS day FROM t1 GROUP BY year, month;

    现在看起来就好解释的多了。1 左移 天数的位 ,相应的位数就表示一个月之中的第几天(反正64位,够用)。比如今天2017-06-02

    1<<2 就是 100 表示今天我访问了这个网站。 我将day这字段OR完之后得到了一个64为的binary (这个数的意义,我想不用解释了) 再用BIT_COUNT()函数数一下就得到了我们想要的结果(可把我累死了(๑•ᴗ•๑),墨迹了这么半天不知道讲没讲明白)。

     

     

    使用AUTO_INCREMENT

     

     

    听名字就知道自动增加,直接上操作:

    mysql> CREATE TABLE animals(
    -> id MEDIUMINT NOT NULL AUTO_INCREMENT,
    -> name CHAR(30) NOT NULL,
    -> PRIMARY KEY(id)
    -> );
    Query OK, 0 rows affected (0.85 sec)

    mysql> INSERT INTO animals (name) VALUES
    -> ('dog'),('cat'),('penguin'),
    -> ('lax'),('whale'),('ostrich');
    Query OK, 6 rows affected (0.13 sec)
    Records: 6 Duplicates: 0 Warnings: 0

    mysql> SELECT * FROM animals;
    +----+---------+
    | id | name |
    +----+---------+
    | 1 | dog |
    | 2 | cat |
    | 3 | penguin |
    | 4 | lax |
    | 5 | whale |
    | 6 | ostrich |
    +----+---------+
    6 rows in set (0.00 sec)

    mysql>

    先建了一个animals表 字段有id 和name。 id设置成自增的主键, 插入数据只写name。 然后id就会自动填充。

     

     

    另外还有一个命令可以修改,AUTO_INCREMENT 的起始值。

    操作如下:

    ALTER TABLE tbl_name AUTO_INCREMENT = 2333;

     

     

    to be continued...

  • 相关阅读:
    1209.3——选择排序算法
    1209.2——直接插入排序算法
    1209.1——快速排序算法
    1208.1——猜数字小游戏
    1207.1——C语言 函数
    1207--ATM自动取款机的实现
    Mac搭建本地svn服务器,并用Cornerstone连接服务器
    iOS textField 和textView的一些用法
    iOS button 文字图片上下/左右排布
    iOS 代理的具体使用
  • 原文地址:https://www.cnblogs.com/zuosy/p/6934857.html
Copyright © 2011-2022 走看看