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 |
    +--------+
    
  • 相关阅读:
    poj 1113 Wall 凸包的应用
    NYOJ 78 圈水池 (入门级凸包)
    Monotone Chain Convex Hull(单调链凸包)
    poj Sudoku(数独) DFS
    poj 3009 Curling 2.0(dfs)
    poj 3083 Children of the Candy Corn
    Python join()方法
    通过FISH和下一代测序检测肺腺癌ALK基因融合比较
    华大病原微生物检测
    NGS检测ALK融合大起底--转载
  • 原文地址:https://www.cnblogs.com/wubug/p/13660298.html
Copyright © 2011-2022 走看看