• 深入浅出MySQL-03-【MySQL中的运算符】


    前言

    环境:

    • Windows11
    • MySQL-8.0.35

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

    1.算术运算符

    算术运算符包括 加、减、乘、除 和 模 运算符。

    运算符作用
    +加法
    -减法
    *乘法
    /,DIV除法,返回商
    %,MOD除法,返回余数

    这几种运算符的简单使用如下:

    mysql> select 0.1+0.333, 0.1-0.333, 0.1*0.333, 1/2, 1%2;
    +-----------+-----------+-----------+--------+------+
    | 0.1+0.333 | 0.1-0.333 | 0.1*0.333 | 1/2    | 1%2  |
    +-----------+-----------+-----------+--------+------+
    |     0.433 |    -0.233 |    0.0333 | 0.5000 |    1 |
    +-----------+-----------+-----------+--------+------+
    1 row in set (0.01 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在 除法 和 模 运算中,如果除数是0,将是非法除数,返回结果为null,如下:

    // 除数为0是可以的
    mysql> select 0/2,0%2;
    +--------+------+
    | 0/2    | 0%2  |
    +--------+------+
    | 0.0000 |    0 |
    +--------+------+
    1 row in set (0.00 sec)
    
    // 被除数如果为0,非法,返回null
    mysql> select 2/0, 2%0;
    +------+------+
    | 2/0  | 2%0  |
    +------+------+
    | NULL | NULL |
    +------+------+
    1 row in set, 2 warnings (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    除法 和 模 运算符中,分别还有 DIV 和 MOD 的使用,说明如下:

    • DIV是一个整数除法操作符。它会返回两个数的商,并丢弃任何小数部分。而除法操作符/,它会返回两个数相除的浮点结果,如下:
    // 这里,10除以3的结果是3.3333...,但由于DIV是整数除法,所以它只返回整数部分,即3。
    mysql> select 10/3, 10 DIV 3, 10 div 3;
    +--------+----------+----------+
    | 10/3   | 10 DIV 3 | 10 div 3 |
    +--------+----------+----------+
    | 3.3333 |        3 |        3 |
    +--------+----------+----------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • MOD是一个取模操作符。它会返回两个数相除后的余数,这和 % 的使用效果是一样的,如下:
    mysql> select 10%3, MOD(10,3), mod(10,3), 10 MOD 3, 10 mod 3;
    +------+-----------+-----------+----------+----------+
    | 10%3 | MOD(10,3) | mod(10,3) | 10 MOD 3 | 10 mod 3 |
    +------+-----------+-----------+----------+----------+
    |    1 |         1 |         1 |        1 |        1 |
    +------+-----------+-----------+----------+----------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.比较运算符

    当时用SELECT查询的时候,允许对表达式左侧和右侧的操作数进行比较,比较结果为真,则返回1,为假则返回0,比较结果不确定则返回NULL

    运算符作用
    =等于
    <>或!=不等于
    <=>NULL安全的等于(NULL-safe)
    小于
    <=小于等于
    >大于
    >=大于等于
    BETWEEN存在于指定范围
    IN存在于指定集合
    IS NULL为NULL
    IS NOT NULL不为NULL
    LIKE通配符匹配
    REGEXP 或 RLIKE正则表达式

    比较运算符可以比较 数字、字符串 和 表达式。数字作为浮点数比较,字符串以不区分大小写的方式进行比较。

    • = 运算符,用于比较两侧的操作数是否相等,但是NULL不能用于 = 比较,如下:
    mysql> select 1=0, 1=1, NULL=NULL, null=null, null=NULL;
    +-----+-----+-----------+-----------+-----------+
    | 1=0 | 1=1 | NULL=NULL | null=null | null=NULL |
    +-----+-----+-----------+-----------+-----------+
    |   0 |   1 |      NULL |      NULL |      NULL |
    +-----+-----+-----------+-----------+-----------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • <>/!= 运算符,和 = 相反,同样NULL不能用于此比较,如下:
    mysql> select 1!=0, 1<>0, 1<>1, null<>null;
    +------+------+------+------------+
    | 1!=0 | 1<>0 | 1<>1 | null<>null |
    +------+------+------+------------+
    |    1 |    1 |    0 |       NULL |
    +------+------+------+------------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • <=> 运算符,和 = 运算符类似,不同之处在于即使操作的值为NULL,也可以正确比较,也就是可以用比较NULL,如下:
    mysql> select 1=0, 1=1, null=null, null<=>null, null<=>NULL;
    +-----+-----+-----------+-------------+-------------+
    | 1=0 | 1=1 | null=null | null<=>null | null<=>NULL |
    +-----+-----+-----------+-------------+-------------+
    |   0 |   1 |      NULL |           1 |           1 |
    +-----+-----+-----------+-------------+-------------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • <、<=、>、>= 操作符,这几个好理解,不多做解释,如下:
    mysql> select 1<2, 'a'<'b', 'bdf'<='b', 'b'<='b', 'a'>'b', 'abc'>'a', 1>0, 'a'>='b','abc'>='a', 1>=0, 1>=1;
    +-----+---------+------------+----------+---------+-----------+-----+----------+------------+------+------+
    | 1<2 | 'a'<'b' | 'bdf'<='b' | 'b'<='b' | 'a'>'b' | 'abc'>'a' | 1>0 | 'a'>='b' | 'abc'>='a' | 1>=0 | 1>=1 |
    +-----+---------+------------+----------+---------+-----------+-----+----------+------------+------+------+
    |   1 |       1 |          0 |        1 |       0 |         1 |   1 |        0 |          1 |    1 |    1 |
    +-----+---------+------------+----------+---------+-----------+-----+----------+------------+------+------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • BETWEEN 操作符,使用格式为 a BETWEEN min AND max,当 a 的值大于等于 min 并且小于等于 max,则返回值1,否则返回0。当 a,min,max类型相同时,表达式等价于 a >= min and a <= max,当类型不同时,比较会遵循类型转换原则进行转换后,再进行比较运算。
    mysql> select 10 between 10 and 20, 9 between 10 and 20;
    +----------------------+---------------------+
    | 10 between 10 and 20 | 9 between 10 and 20 |
    +----------------------+---------------------+
    |                    1 |                   0 |
    +----------------------+---------------------+
    1 row in set (0.05 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • IN 操作符,使用格式为 a IN (value1, value2, …, valuen),当 a 的值在列表中,返回1,否则返回0。
    mysql> select 1 in (1,2,3), 't' in ('t','a','b'), 0 in (1,2);
    +--------------+----------------------+------------+
    | 1 in (1,2,3) | 't' in ('t','a','b') | 0 in (1,2) |
    +--------------+----------------------+------------+
    |            1 |                    1 |          0 |
    +--------------+----------------------+------------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • IS NULL 运算符,使用格式为 a IS NULL,a的值为NULL返回1,否则返回0.
    mysql> select 0 is null, null is null;
    +-----------+--------------+
    | 0 is null | null is null |
    +-----------+--------------+
    |         0 |            1 |
    +-----------+--------------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • IS NOT NULL 操作符,格式为 a IS NOT NULL,和 IS NULL 相反。
    mysql> select 0 is not null, null is not null;
    +---------------+------------------+
    | 0 is not null | null is not null |
    +---------------+------------------+
    |             1 |                0 |
    +---------------+------------------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • LIKE 操作符,格式为 a LIKE %123%,当 a 的值中含有字符串 123 时,返回1,否则返回0。
    mysql> select 123321 like '%123%', 123456 like '%123%', 123456 like '%321%';
    +---------------------+---------------------+---------------------+
    | 123321 like '%123%' | 123456 like '%123%' | 123456 like '%321%' |
    +---------------------+---------------------+---------------------+
    |                   1 |                   1 |                   0 |
    +---------------------+---------------------+---------------------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • REGEXP/RLIKE 操作符,使用格式为 str REGEXP str_pat,当str字符串中含有str_pat相匹配的字符串时,返回1,否则返回0。这里只是介绍操作符,具体REGEXP的使用,后续会说到。
    mysql> select 'abcded' regexp 'cd', 'abcded' rlike 'cd', 'abc' regexp 'cd';
    +----------------------+---------------------+-------------------+
    | 'abcded' regexp 'cd' | 'abcded' rlike 'cd' | 'abc' regexp 'cd' |
    +----------------------+---------------------+-------------------+
    |                    1 |                   1 |                 0 |
    +----------------------+---------------------+-------------------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.逻辑操作符

    又称为布尔运算符,确认表达式的真假。

    运算符作用
    NOT 或 !逻辑非
    AND 或 &&逻辑与
    OR 或 ||逻辑或
    XOR逻辑异或
    • NOT / ! 操作符,表示逻辑非,返回和操作数相反的结果,操作数为0-假,则返回1-真。但有一点除外,那就是 NOT NULL 的返回值为NULL。
    mysql> select not 1, not 0, !1, !0, not null;
    +-------+-------+----+----+----------+
    | not 1 | not 0 | !1 | !0 | not null |
    +-------+-------+----+----+----------+
    |     0 |     1 |  0 |  1 |     NULL |
    +-------+-------+----+----+----------+
    1 row in set, 2 warnings (0.01 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • AND / && 操作符,逻辑与,当所有的操作数均为非零值并且不为NULL时,结果为1,当一个或多个操作数为0时,结果就为0。操作数中有任何一个为NULL,则返回值为NULL,如下:
    mysql> select 1 and 1, 1 && 0, 1 and null;
    +---------+--------+------------+
    | 1 and 1 | 1 && 0 | 1 and null |
    +---------+--------+------------+
    |       1 |      0 |       NULL |
    +---------+--------+------------+
    1 row in set, 1 warning (0.01 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • OR / || 操作符,逻辑或,当多个操作数都是非NULL时,如果任意一个数为非0的值,则结果为1,否则结果为0(都是0)。当有一个操作数为NULL,其他的操作数为非0时,结果也是1,否则结果为NULL。如果多个操作数都是NULL,结果为NULL。
    mysql> select 1 or 0, 0 || 0, 0 or null, 1 or null, null or null;
    +--------+--------+-----------+-----------+--------------+
    | 1 or 0 | 0 || 0 | 0 or null | 1 or null | null or null |
    +--------+--------+-----------+-----------+--------------+
    |      1 |      0 |      NULL |         1 |         NULL |
    +--------+--------+-----------+-----------+--------------+
    1 row in set, 1 warning (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • XOR,逻辑异或,任意一个操作数为NULL时,返回NULL。对于非NULL的操作数,如果两个的逻辑真假值相异,返回结果1,否则返回0。
    mysql> select 1 xor 1, 0 xor 0, 1 xor 0, null xor 0;
    +---------+---------+---------+------------+
    | 1 xor 1 | 0 xor 0 | 1 xor 0 | null xor 0 |
    +---------+---------+---------+------------+
    |       0 |       0 |       1 |       NULL |
    +---------+---------+---------+------------+
    1 row in set (0.01 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.位运算符

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

    运算符作用
    &位与(位AND)
    |位或(位OR)
    ^位异(位XOR)
    ~位取反
    >>位右移
    <<位左移

    位运算符这里不多做讲解说明。

    5.运算符的优先级

    以上这么多运算符,很可能混合使用,那么它们的优先级是什么呢?如下:

    优先级高到低运算符
    1:=
    2||、OR、XOR
    3&&、AND
    4NOT
    5BETWEEN、CASE、WHEN、THEN、ELSE
    6=、<=>、>=、>、<、<=、<>、!=、IS、LIKE、REGEXT、IN
    7|
    8&
    9<<、>>
    10-、+
    11*、/、DIV、%、MOD
    12^
    13- 和 ~
    14!

    实际上,没人记得住这些,实际使用我们都是用 ()将需要有限的操作括起来,这样可以起到优先的作用,又方便理解。

  • 相关阅读:
    Android初学 抖音短视频无水印下载APP的实现
    关于机器学习的向量机,都讲了什么
    全链路压测专题---1、全链路压测的思想和方案
    动态规划之空间压缩技巧
    计算机毕业设计Java电子配件公司仓库管理系统(源码+系统+mysql数据库+lw文档)
    native2ascii转换Unicode编码为utf-8
    设计模式 - 解释器模式
    接入Websocket,自动接收CSDN短消息
    KNN分类算法
    Linux基础指令
  • 原文地址:https://blog.csdn.net/weixin_37799575/article/details/138144753