zoukankan      html  css  js  c++  java
  • 4. MySQL中的运算符

    MySQL支持多种类型的运算符,来连接表达式的项。这些类型主要包括算数运算符、比较运算符、逻辑运算符和位运算符

    4.1 算数运算符

    (1) “/”为实数除,结果有小数位,“div”为整数除,结果不存在小数位,不会四舍五入。

    # 无需选择数据库就可以进行表达式的操作查询
    mysql> select 3.1+0.04,3.1-0.04,2*3,1/2,12%8;
    +----------+----------+-----+--------+------+
    | 3.1+0.04 | 3.1-0.04 | 2*3 | 1/2    | 12%8 |
    +----------+----------+-----+--------+------+
    |     3.14 |     3.06 |   6 | 0.5000 |    4 |
    +----------+----------+-----+--------+------+
    
    # 除法运算和模运算中,如果除数为0,将是非法除数,返回结果为NULL
    mysql> select 1/0;
    +------+
    | 1/0  |
    +------+
    | NULL |
    +------+
    1 row in set (0.00 sec)
    
    # div整数除,结果不会四舍五入,mod函数可以实现%同样的效果
    mysql> select 3 div 2,mod(12,8);
    +---------+-----------+
    | 3 div 2 | mod(12,8) |
    +---------+-----------+
    |       1 |         4 |
    +---------+-----------+
    

    4.2 比较运算符

    (1)MySQL允许用户对表达式左右两边的操作数进行比较,比较结果为真,则返回1,为假则返回0,比较结果不确定则返回NULL

    (2)比较运算符可以用于比较数字、字符串和表达式。数字作为浮点数比较,而字符串以不区分大小写的方式比较。

    MySQL字符串四则运算的注意点:

    对MySQL中的字符串进行四则运算的时候,会转化为相应的数值类型进行运算。即使运算符两侧的字符串没有数值类型,也能参与运算。转化规则等同于比较的规则。

    字符串与数值类型的比较

    • MySQL字符串和数字比较时,会自动地把字符串类型转化为数字类型,从首字母开始,遇到非数字类型终止。
    • 对于数字开头的字符串,转成数字后会自动丢弃后面的字母部分,只留下纯数字进行比较。
    • 对于没有数字开头的字符串与数值类型比较时,只会转化为0和其他数值进行比较。

    同理,MySQL会将字符串转化为数字,所以当将字符串和数值进行四则运算时原理,也是同上,会被截断转化为相应的数值类型。

    #对于开头部分不能截取出数字的字符串来说,转换的结果自然就是0了。就只剩下0去和其他数值进行比较
    mysql> select 'a'=0;
    +-------+
    | 'a'=0 |
    +-------+
    |     1 |
    +-------+
    1 row in set, 1 warning (0.00 sec)
    
    mysql> select 'aa1' < 2;
    +-----------+
    | 'aa1' < 2 |
    +-----------+
    |         1 |
    +-----------+
    1 row in set, 1 warning (0.00 sec)
    
    #对于数据开头的字符串,转成数字后会自动丢弃后面的字母部分,只留下纯数字进行比较。
    mysql> select '23aa' < 3;
    +------------+
    | '23aa' < 3 |
    +------------+
    |          0 |
    +------------+
    1 row in set, 1 warning (0.00 sec)
    
    #字符串与数字相加
    # 转化为 0+3
    mysql> select 'a'+3;
    +-------+
    | 'a'+3 |
    +-------+
    |     3 |
    +-------+
    1 row in set, 1 warning (0.00 sec)
    # 转化为1+3
    mysql> select '1a'+3;
    +--------+
    | '1a'+3 |
    +--------+
    |      4 |
    +--------+
    # 转化为2*3
    mysql> select '2a'*3;
    +--------+
    | '2a'*3 |
    +--------+
    |      6 |
    +--------+
    1 row in set, 1 warning (0.00 sec)
    #字符串相加
    mysql> select '3a'+'2b';
    +-----------+
    | '3a'+'2b' |
    +-----------+
    |         5 |
    +-----------+
    #可以看到截断警告的提示
    mysql> show warnings;
    +---------+------+----------------------------------------+
    | Level   | Code | Message                                |
    +---------+------+----------------------------------------+
    | Warning | 1292 | Truncated incorrect DOUBLE value: '2a' |
    +---------+------+----------------------------------------+
    1 row in set (0.00 sec)
    
    # NULL不可比较返回NULL
    mysql> select 1=0,1=1,NULL=0,NULL=NULL;
    +-----+-----+--------+-----------+
    | 1=0 | 1=1 | NULL=0 | NULL=NULL |
    +-----+-----+--------+-----------+
    |   0 |   1 |   NULL |      NULL |
    +-----+-----+--------+-----------+
    
    mysql> select 'ab'='ab','a'<'d',1<=1;
    +-----------+---------+------+
    | 'ab'='ab' | 'a'<'d' | 1<=1 |
    +-----------+---------+------+
    |         1 |       1 |    1 |
    +-----------+---------+------+
    # 字符串比较不区分大小写
    mysql> select 'ab'='AB';
    +-----------+
    | 'ab'='AB' |
    +-----------+
    |         1 |
    +-----------+
    
    

    (3)BETWEEN运算符的使用格式为 a BETWEEN min and max,包括min和max边界值;当操作数a、min、max类型相同时,此表达式等价于a>=min and a<=max),当操作数类型不同时,比较时会遵循类型转化原则进行转化后,在进行比较运算。

    (4)IN运算符的使用格式为a IN(value1,value2,...)

    (5)IS NULL和IS NOT NULL判断值是否为NULL或者不为NULL

    (6)LIKE运算符常用模糊查询,%代表0个或多个字符,下划线"_"代表一个字符,使用格式为“a LIKE %xxx%”

    (7)REGEXP正则匹配运算符,使用格式“str REGEXP str_pat”,当str字符串中含有str_pat相匹配的字符串时,返回1,否则返回0.

    mysql> select 10 between 10 and 20,9 between 10 and 20;
    +----------------------+---------------------+
    | 10 between 10 and 20 | 9 between 10 and 20 |
    +----------------------+---------------------+
    |                    1 |                   0 |
    +----------------------+---------------------+
    
    mysql> select 0 is null,0 is not null,null is null,null is not null;
    +-----------+---------------+--------------+------------------+
    | 0 is null | 0 is not null | null is null | null is not null |
    +-----------+---------------+--------------+------------------+
    |         0 |             1 |            1 |                0 |
    +-----------+---------------+--------------+------------------+
    
    mysql> select 'a' in ('a','ab');
    +-------------------+
    | 'a' in ('a','ab') |
    +-------------------+
    |                 1 |
    +-------------------+
    
    mysql> select 'abc' regexp 'ab', 'aabbc' regexp 'bc';
    +-------------------+---------------------+
    | 'abc' regexp 'ab' | 'aabbc' regexp 'bc' |
    +-------------------+---------------------+
    |                 1 |                   1 |
    +-------------------+---------------------+
    1 row in set (0.00 sec)
    

    4.3 逻辑运算符

    ​ 逻辑运算符又称为布尔运算符,用来确认表达式的真和假。

    (1) NOT NULL的返回值为NULL

    (2)逻辑与运算,一个或多个操作数为0时,所得结果为0,操作数中有任何一个为NULL则返回值为NULL。

    (3)逻辑或功能不再赘述,逻辑异或,操作数逻辑真假值相异为1,相同为0

    mysql> select not 0, !0, not null;
    +-------+----+----------+
    | not 0 | !0 | not null |
    +-------+----+----------+
    |     1 |  1 |     NULL |
    +-------+----+----------+
    
    mysql> select not 0, !1, not null; 
    +-------+----+----------+
    | not 0 | !1 | not null |
    +-------+----+----------+
    |     1 |  0 |     NULL |
    +-------+----+----------+
    
    mysql> select (1 and 2),(0 && 5),(1 and NULL);
    +-----------+----------+--------------+
    | (1 and 2) | (0 && 5) | (1 and NULL) |
    +-----------+----------+--------------+
    |         1 |        0 |         NULL |
    +-----------+----------+--------------+
    
    mysql> select (1 or 0),(0 || 0),(NULL or NULL);
    +----------+----------+----------------+
    | (1 or 0) | (0 || 0) | (NULL or NULL) |
    +----------+----------+----------------+
    |        1 |        0 |           NULL |
    +----------+----------+----------------+
    
    mysql> select 1 xor 0, 1 xor 1,null xor 1;
    +---------+---------+------------+
    | 1 xor 0 | 1 xor 1 | null xor 1 |
    +---------+---------+------------+
    |       1 |       0 |       NULL |
    +---------+---------+------------+
    

    4.4 位运算符

    ​ 位运算是将给定的操作数转化为二进制后,对各个操作数每一位都进行指定的逻辑运算,得到的二进制结果转化为十进制数后就是位运算的结果。

    mysql> select 2&&3;
    +------+
    | 2&&3 |
    +------+
    |    1 |
    +------+
    
    mysql> select 2|3;
    +-----+
    | 2|3 |
    +-----+
    |   3 |
    +-----+
    # 位相异为1,相同为0
    mysql> select 2^3;
    +-----+
    | 2^3 |
    +-----+
    |   1 |
    +-----+
    # 1的取反为什么会是这么大的数字?
    # 在MySQL中,常量数字默认会以8字节来表示,8字节就是64位,常量1的二进制表示为63个0加1个1,位取反后就是63个1
    #加一个0.
    mysql> select ~1,~18446744073709551614;
    +----------------------+-----------------------+
    | ~1                   | ~18446744073709551614 |
    +----------------------+-----------------------+
    | 18446744073709551614 |                     1 |
    +----------------------+-----------------------+
    mysql> select bin(18446744073709551614);
    +------------------------------------------------------------------+
    | bin(18446744073709551614)                                        |
    +------------------------------------------------------------------+
    | 1111111111111111111111111111111111111111111111111111111111111110 |
    +------------------------------------------------------------------+
    
    # 位右移n位,相当于除以2^n
    mysql> select 100>>3,100 div 8;
    +--------+-----------+
    | 100>>3 | 100 div 8 |
    +--------+-----------+
    |     12 |        12 |
    +--------+-----------+
    
    mysql> select 100<<3;
    +--------+
    | 100<<3 |
    +--------+
    |    800 |
    +--------+
    
  • 相关阅读:
    IT轮子系列(七)——winform 版本更新组件
    IT轮子系列(六)——Excel上传与解析,一套代码解决所有Excel业务上传,你Get到了吗
    IT轮子系列(四)——使用Jquery+formdata对象 上传 文件
    IT轮子系列(一)——DropDownList 的绑定(二)
    IT轮子系列(五)——MVC API 文件上传,总有一款是你需要的
    IT轮子系列(三)——如何显示方法名——Swagger的使用(三)
    IT轮子系列(三)——如何给返回类型添加注释——Swagger的使用(二)
    IT轮子系列(二)——mvc API 说明文档的自动生成——Swagger的使用(一)
    IT轮子系列(一)——DropDownList 的绑定,你秒懂了吗
    python3.7 安装 xlrd 模块---Mac
  • 原文地址:https://www.cnblogs.com/wubug/p/13660298.html
Copyright © 2011-2022 走看看