MySQL 运算符


1. 算数运算符

  • 数学运算
  • 对数值或者表达式进行 +-*/div , %mod 运算

1.1 加法与减法运算符

MySQL中+只表示数值相加

  • 整数+整数=整数
  • 浮点数+整数/浮点数 = 浮点数
  • 加减优先级相同
mysql 复制代码
mysql> SELECT 100 , 100 + 0, 100 + 0.0, 100 + 50 - 30, 100 - 0.5
    -> FROM DUAL;
+-----+---------+-----------+---------------+-----------+
| 100 | 100 + 0 | 100 + 0.0 | 100 + 50 - 30 | 100 - 0.5 |
+-----+---------+-----------+---------------+-----------+
| 100 |     100 |     100.0 |           120 |      99.5 |
+-----+---------+-----------+---------------+-----------+
1 row in set (0.00 sec)
  • 数 + 字符串 = 数本身
  • 若浮点数小数部分为零,则会输出整数
  • 遇到非数值类型,先尝试转成数值(隐式转换),如果转失败,就按0计算
mysql 复制代码
mysql> SELECT 100 + 'A', 100.0 + 'A', 100.1 + 'A',100 + 'NULL'
    -> FROM DUAL;
+-----------+-------------+-------------+--------------+
| 100 + 'A' | 100.0 + 'A' | 100.1 + 'A' | 100 + 'NULL' |
+-----------+-------------+-------------+--------------+
|       100 |         100 |       100.1 |          100 |
+-----------+-------------+-------------+--------------+
1 row in set, 3 warnings (0.00 sec)
  • 若字符串是数,则会按数的正常数的方式运算
mysql 复制代码
mysql> SELECT 100 + '1', '100' + '1'
    -> FROM DUAL;
+-----------+-------------+
| 100 + '1' | '100' + '1' |
+-----------+-------------+
|       101 |         101 |
+-----------+-------------+
1 row in set (0.00 sec)
  • 只要有NULL参与运算,结果就为NULL
mysql 复制代码
mysql> SELECT 100 + NULL
    -> FROM DUAL;
+------------+
| 100 + NULL |
+------------+
|       NULL |
+------------+
1 row in set (0.00 sec)

1.2 乘法与除法运算符

  • 整 * 整 = 整
  • 浮点 * 整 = 浮点
  • 浮点 * 浮点 = 浮点
  • 整 / 整 = 浮点
  • 整 / 浮点 = 浮点
  • 浮点 / 浮点 = 浮点

总结:

  • 有浮点参与运算,结果就是浮点数
  • 除法运算的结果一定是浮点数
mysql 复制代码
mysql> SELECT
    -> 100*1, 100*1.0,1 00.0*1.0, 100 / 1, 100 / 1.0, 100.0 / 1.0
    -> FROM
    -> DUAL
    -> ;
+-------+---------+-----------+----------+----------+-----------+
| 100*1 | 100*1.0 | 100.0*1.0 | 100/ 1   | 100/ 1.0 | 100.0/ 1.0|
+-------+---------+-----------+----------+----------+-----------+
|   100 |   100.0 |    100.00 | 100.0000 | 100.0000 | 100.00000 |
+-------+---------+-----------+----------+----------+-----------+
1 row in set (0.00 sec)
  • 数 / 0 = NULL
  • 分母为零,结果为NULL
mysql 复制代码
mysql> SELECT
    -> 100 / 0
    -> FROM
    -> DUAL;
+---------+
| 100 / 0 |
+---------+
|    NULL |
+---------+
1 row in set, 1 warning (0.00 sec)
  • 除法用 /div 都可以
  • 但注意,/结果为浮点数,div结果向下取整
mysql 复制代码
mysql> SELECT
    -> 100 / 2, 100 div 2
    -> FROM
    -> DUAL;
+---------+-----------+
| 100 / 2 | 100 div 2 |
+---------+-----------+
| 50.0000 |        50 |
+---------+-----------+
1 row in set (0.00 sec)

1.3 求模(求余)运算符

  • %mod 均可
mysql 复制代码
mysql> SELECT
    -> 100 % 3 , 100 mod 2
    -> FROM
    -> DUAL;
+---------+-----------+
| 100 % 3 | 100 mod 2 |
+---------+-----------+
|       1 |         0 |
+---------+-----------+
1 row in set (0.00 sec)
  • 模的结果正负 = 被取模数的正负
mysql 复制代码
mysql> SELECT
    -> -5 % 2, 5 % -2, -5 % -2, 5 % 2
    -> FROM
    -> DUAL;
+--------+--------+---------+-------+
| -5 % 2 | 5 % -2 | -5 % -2 | 5 % 2 |
+--------+--------+---------+-------+
|     -1 |      1 |      -1 |     1 |
+--------+--------+---------+-------+
1 row in set (0.00 sec)

2. 比较运算符

  • 左右表达式比较

  • 结果为真,返回1

  • 结果为假,返回0

  • 其他情况,返回NULL

  • 常用做SELECT查询语句的条件

2.1 符号类型的运算符

2.1.1 等号运算符
  • 这下真是判断等号两边的表达式的值是否相等了,而不是赋值
  • 如果相等则返回1,不相等则返回 0
  • 两边都是数。正常比较
mysql 复制代码
mysql> SELECT
    -> 1 = 2, 1 != 2
    -> FROM DUAL;
+-------+--------+
| 1 = 2 | 1 != 2 |
+-------+--------+
|     0 |      1 |
+-------+--------+
1 row in set (0.00 sec)
  • 一边数,一边字符串。字符串隐式转换,若转换数值不成功,则看作为0
mysql 复制代码
mysql> SELECT
    -> 1 = '1', 1 = 'A', 'A' = 'a','1' = 'A'
    -> FROM DUAL;
+---------+---------+-----------+-----------+
| 1 = '1' | 1 = 'A' | 'A' = 'a' | '1' = 'A' |
+---------+---------+-----------+-----------+
|       1 |       0 |         1 |         0 |
+---------+---------+-----------+-----------+
1 row in set, 1 warning (0.00 sec)
  • 若两边都是字符串。则按照ANSI的比较规则比较
mysql 复制代码
mysql> SELECT
    -> 'AB' = 'AB','ab' = 'AB'
    -> FROM DUAL;
+-------------+-------------+
| 'AB' = 'AB' | 'ab' = 'AB' |
+-------------+-------------+
|           1 |           1 |
+-------------+-------------+
1 row in set (0.00 sec)

mysql> SELECT
    -> 'AB' = '0'
    -> FROM DUAL;
+------------+
| 'AB' = '0' |
+------------+
|          0 |
+------------+
1 row in set (0.00 sec)

mysql> SELECT
    -> 'AB' = 'A'
    -> FROM DUAL;
+------------+
| 'AB' = 'A' |
+------------+
|          0 |
+------------+
1 row in set (0.00 sec)
  • 只要有NULL就是NULL
mysql 复制代码
mysql> SELECT
    -> 1 = NULL, NULL = NULL
    -> FROM DUAL;
+----------+-------------+
| 1 = NULL | NULL = NULL |
+----------+-------------+
|     NULL |        NULL |
+----------+-------------+
1 row in set (0.00 sec)

所以说要查询为NULL的,用=就查不出

2.1.2 安全等于运算符
  • <=>
  • 与等于相似
  • 唯一区别:可以对NULL进行判断(tips:<=>,为NULL而生)
mysql 复制代码
mysql> SELECT
    -> 'NULL' <=> 'NULL', 1 <=> 'NULL'
    -> FROM DUAL;
+-------------------+--------------+
| 'NULL' <=> 'NULL' | 1 <=> 'NULL' |
+-------------------+--------------+
|                 1 |            0 |
+-------------------+--------------+
1 row in set, 1 warning (0.00 sec)
2.1.3 不等运算符
  • !=<>
mysql 复制代码
mysql> SELECT 1 <> 1, 1 != 2, 'a' != 'b', (3+4) <> (2+6), 'a' != NULL, NULL <> NULL;
+--------+--------+------------+----------------+-------------+--------------+
| 1 <> 1 | 1 != 2 | 'a' != 'b' | (3+4) <> (2+6) | 'a' != NULL | NULL <> NULL |
+--------+--------+------------+----------------+-------------+--------------+
|      0 |      1 |          1 |              1 |        NULL |         NULL |
+--------+--------+------------+----------------+-------------+--------------+
1 row in set (0.00 sec)

2.2 非符号类型的运算符

2.2.1 NULL 相关
  • IS NULL 或 ISNULL( ) :为空运算符
  • IS NOT NULL :不为空运算符
mysql 复制代码
mysql> SELECT
    -> 1 IS NULL, ISNULL(NULL), 1 IS NOT NULL
    -> FROM DUAL;
+-----------+--------------+---------------+
| 1 IS NULL | ISNULL(NULL) | 1 IS NOT NULL |
+-----------+--------------+---------------+
|         0 |            1 |             1 |
+-----------+--------------+---------------+
1 row in set (0.00 sec)
2.2.2 最小,最大
  • LEAST(A,B,...)
  • GREATEST(A,B,...)
mysql 复制代码
mysql> SELECT
    -> LEAST(1,2),GREATEST(1,2),LEAST('A','B','C')
    -> FROM DUAL;
+------------+---------------+--------------------+
| LEAST(1,2) | GREATEST(1,2) | LEAST('A','B','C') |
+------------+---------------+--------------------+
|          1 |             2 | A                  |
+------------+---------------+--------------------+
1 row in set (0.00 sec)
  • 字符串,从第一个字母开始比,字典序
  • 注意不是比长度
mysql 复制代码
mysql> SELECT
    -> LEAST('APPLE','A')
    -> FROM DUAL;
+--------------------+
| LEAST('APPLE','A') |
+--------------------+
| A                  |
+--------------------+
1 row in set (0.00 sec)

mysql> SELECT
    -> LEAST('APPLE','A'),GREATEST('APPLE','A')
    -> FROM DUAL;
+--------------------+-----------------------+
| LEAST('APPLE','A') | GREATEST('APPLE','A') |
+--------------------+-----------------------+
| A                  | APPLE                 |
+--------------------+-----------------------+
1 row in set (0.00 sec)
2.2.3 BETWEEN ... AND ... 运算符
  • A BETWEEN B AND C;
  • B ≤ A ≤ C , 返回1
  • A ≤ B || A ≥ C , 返回0
  • 注意,包含边界
mysql 复制代码
mysql> SELECT 1 BETWEEN 0 AND 1, 10 BETWEEN 11 AND 12, 'b' BETWEEN 'a' AND 'c';
+-------------------+----------------------+-------------------------+
| 1 BETWEEN 0 AND 1 | 10 BETWEEN 11 AND 12 | 'b' BETWEEN 'a' AND 'c' |
+-------------------+----------------------+-------------------------+
|                 1 |                    0 |                       1 |
+-------------------+----------------------+-------------------------+
1 row in set (0.00 sec)
2.2.4 IN(set) 、NOT IN(set)
  • 元素 IN/NOT IN(集合)
  • 返回1、2
mysql 复制代码
mysql> SELECT 'a' NOT IN ('a','b','c'), 1 NOT IN (2,3);
+--------------------------+----------------+
| 'a' NOT IN ('a','b','c') | 1 NOT IN (2,3) |
+--------------------------+----------------+
|                        0 |              1 |
+--------------------------+----------------+
1 row in set (0.00 sec)
2.2.5 LIKE :模糊查询
  • 主要用来匹配字符串

  • 通常用于模糊匹配

  • 如果满足条件则返回1,否则返回 0

  • 如果给定的值或者匹配条件为NULL,则返回结果为NULL

  • 但是只用LIKE和=也差不多,需要搭配以下通配符使用

    "%":匹配0个或多个字符
    "_":只能匹配一个字符

  • 是否包含'a'

mysql 复制代码
mysql> SELECT
    -> 'abc' LIKE '%a%'
    -> FROM DUAL;
+------------------+
| 'abc' LIKE '%a%' |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)
  • 是否以'a' 开头
mysql 复制代码
mysql> SELECT
    -> 'abc' LIKE 'a%'
    -> FROM DUAL;
+-----------------+
| 'abc' LIKE 'a%' |
+-----------------+
|               1 |
+-----------------+
1 row in set (0.00 sec)
  • 是否以'a'结尾
mysql 复制代码
mysql> SELECT
    -> 'abc' LIKE '%a'
    -> FROM DUAL;
+-----------------+
| 'abc' LIKE '%a' |
+-----------------+
|               0 |
+-----------------+
1 row in set (0.00 sec)
  • 包含'a'且包含'b' 的两种写法
mysql 复制代码
mysql> SELECT
    -> 'abc' LIKE '%a%b%' OR 'abc' LIKE '%b%a%'
    -> FROM DUAL;
+------------------------------------------+
| 'abc' LIKE '%a%b%' OR 'abc' LIKE '%b%a%' |
+------------------------------------------+
|                                        1 |
+------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT
    -> 'abc' LIKE '%a%' AND 'abc' LIKE '%b%'
    -> FROM DUAL;
+---------------------------------------+
| 'abc' LIKE '%a%' AND 'abc' LIKE '%b%' |
+---------------------------------------+
|                                     1 |
+---------------------------------------+
1 row in set (0.00 sec)
  • 第二个字符是否是'a'
    • 一个下划线表示一个字符
mysql 复制代码
mysql> SELECT
    -> 'abc' LIKE '_a%'
    -> FROM DUAL;
+------------------+
| 'abc' LIKE '_a%' |
+------------------+
|                0 |
+------------------+
1 row in set (0.00 sec)
  • 第二个字符是否是下划线
    • 使用转义字符\
mysql 复制代码
mysql> SELECT
    -> 'a_c' LIKE '_\_%'
    -> FROM DUAL;
+-------------------+
| 'a_c' LIKE '_\_%' |
+-------------------+
|                 1 |
+-------------------+
1 row in set (0.00 sec)
2.2.6 REGEXP运算符
  • 较复杂,这里仅做简单了解

  • REGEXP运算符用来匹配字符串,语法格式为: expr REGEXP 匹配条件

  • 如果expr满足匹配条件,返回 1;如果不满足,则返回0

  • 若expr或匹配条件任意一个为NULL,则结果为NULL

  • REGEXP运算符在进行匹配时,常用的有下面几种通配符:

(1)'^'匹配以该字符后面的字符开头的字符串

(2)'$'匹配以该字符前面的字符结尾的字符串

(3)'.'匹配任何一个单字符

(4)"[...]"匹配在方括号内的任何字符

例如,"[abc]"匹配"a"或"b"或"c"。为了命名字符的范围,使用一个'-'

"[a-z]"匹配任何字母,而"[0-9]"匹配任何数字

(5)'*'匹配零个或多个在它前面的字符

例如,"x*"匹配任何数量的'x'字符,"[0-9]*"匹配任何数量的数字, 而"*"匹配任何数量的任何字符

mysql 复制代码
mysql> SELECT 'shkstart' REGEXP '^s', 'shkstart' REGEXP 't$', 'shkstart' REGEXP 'hk';
+------------------------+------------------------+------------------------+
| 'shkstart' REGEXP '^s' | 'shkstart' REGEXP 't$' | 'shkstart' REGEXP 'hk' |
+------------------------+------------------------+------------------------+
|                      1 |                      1 |                      1 |
+------------------------+------------------------+------------------------+
1 row in set (0.01 sec)

mysql> SELECT 'atguigu' REGEXP 'gu.gu', 'atguigu' REGEXP '[abc]', 'atguigu' REGEXP '[a-c]';
+--------------------------+--------------------------+--------------------------+
| 'atguigu' REGEXP 'gu.gu' | 'atguigu' REGEXP '[abc]' | 'atguigu' REGEXP '[a-c]' |
+--------------------------+--------------------------+--------------------------+
|                        1 |                        1 |                        1 |
+--------------------------+--------------------------+--------------------------+
1 row in set (0.00 sec)

3. 逻辑运算符

逻辑运算符主要用来判断表达式的真假,在MySQL中,逻辑运算符的返回结果为1、0或者NULL

3.1 逻辑非运算符

  • NOT 或 !
  • !0 = 1
  • !1 = 0
  • !NULL = NULL
mysql 复制代码
mysql>  SELECT NOT 1, NOT 0, NOT(1+1), NOT !1, NOT NULL;
+-------+-------+----------+--------+----------+
| NOT 1 | NOT 0 | NOT(1+1) | NOT !1 | NOT NULL |
+-------+-------+----------+--------+----------+
|     0 |     1 |        0 |      1 |     NULL |
+-------+-------+----------+--------+----------+
1 row in set, 1 warning (0.00 sec)

3.2 逻辑与运算符

  • AND 或 &&
  • 均非0非NULL 返回1
  • 有0 返回0
  • 其余情况返回NULL
mysql 复制代码
mysql> SELECT 1 AND -1, 0 AND 1, 0 AND NULL, 1 AND NULL;
+----------+---------+------------+------------+
| 1 AND -1 | 0 AND 1 | 0 AND NULL | 1 AND NULL |
+----------+---------+------------+------------+
|        1 |       0 |          0 |       NULL |
+----------+---------+------------+------------+
1 row in set (0.00 sec)

3.3 逻辑或运算符

  • OR 或 ||
  • 有非0值 返回1 否则返回0
  • 有NULL 若另一值为非0 返回1 否则返回NULL
  • 两个值都是NULL 返回NULL
mysql 复制代码
mysql>  SELECT 1 OR -1, 1 OR 0, 1 OR NULL, 0 || NULL, NULL || NULL;
+---------+--------+-----------+-----------+--------------+
| 1 OR -1 | 1 OR 0 | 1 OR NULL | 0 || NULL | NULL || NULL |
+---------+--------+-----------+-----------+--------------+
|       1 |      1 |         1 |      NULL |         NULL |
+---------+--------+-----------+-----------+--------------+
1 row in set, 2 warnings (0.00 sec)
  • AND 的优先级高于 OR

3.4 逻辑异或运算符

  • XOR
  • 有NULL返回NULL
  • 两个非NULL的值都是0或者都不等于0时,则返回0
  • 一个值为0,另一个值不为0时,则返回1
mysql 复制代码
mysql>  SELECT 1 XOR -1, 1 XOR 0, 0 XOR 0, 1 XOR NULL, 1 XOR 1 XOR 1, 0 XOR 0 XOR 0;
+----------+---------+---------+------------+---------------+---------------+
| 1 XOR -1 | 1 XOR 0 | 0 XOR 0 | 1 XOR NULL | 1 XOR 1 XOR 1 | 0 XOR 0 XOR 0 |
+----------+---------+---------+------------+---------------+---------------+
|        0 |       1 |       0 |       NULL |             1 |             0 |
+----------+---------+---------+------------+---------------+---------------+
1 row in set (0.00 sec)

4. 位运算符

(了解)

位运算符是在二进制数上进行计算的运算符

位运算符会先将操作数变成二进制数,然后进行位运算, 最后将计算结果从二进制变回十进制数

使用频率不高

4.1 按位与运算符

  • 按位与(&)运算符将给定值对应的二进制数逐位进行逻辑与运算
  • 当给定值对应的二进制位的数值都为1时,则该位返回1,否则返回0
mysql 复制代码
mysql>  SELECT 1 & 10, 20 & 30;
+--------+---------+
| 1 & 10 | 20 & 30 |
+--------+---------+
|      0 |      20 |
+--------+---------+
1 row in set (0.00 sec)
  • 1的二进制数为0001,10的二进制数为1010,所以1 & 10的结果为0000,对应的十进制数为0
  • 20的二进制数为10100,30的二进制数为11110,所以20 & 30的结果为10100,对应的十进制数为20

4.2 按位或运算符

  • 按位或(|)运算符将给定的值对应的二进制数逐位进行逻辑或运算
  • 当给定值对应的二进制位的数值有一个或两个为1时,则该位返回1,否则返回0
mysql 复制代码
mysql>  SELECT 1 | 10, 20 | 30;
+--------+---------+
| 1 | 10 | 20 | 30 |
+--------+---------+
|     11 |      30 |
+--------+---------+
1 row in set (0.00 sec)
  • 1的二进制数为0001,10的二进制数为1010,所以1 | 10的结果为1011,对应的十进制数为11
  • 20的二进制数为10100,30的二进制数为11110,所以20 | 30的结果为11110,对应的十进制数为30

4.3 按位异或运算符

  • 按位异或(^)运算符将给定的值对应的二进制数逐位进行逻辑异或运算
  • 当给定值对应的二进制位的数值不同时,则该位返回1,否则返回0
mysql 复制代码
mysql>  SELECT 1 ^ 10, 20 ^ 30;
+--------+---------+
| 1 ^ 10 | 20 ^ 30 |
+--------+---------+
|     11 |      10 |
+--------+---------+
1 row in set (0.00 sec)
  • 1的二进制数为0001,10的二进制数为1010,所以1 ^ 10的结果为1011,对应的十进制数为11
  • 20的二进制数为10100,30的二进制数为11110,所以20 ^ 30的结果为01010,对应的十进制数为10
mysql 复制代码
mysql>  SELECT 12 & 5, 12 | 5,12 ^ 5 FROM DUAL;
+--------+--------+--------+
| 12 & 5 | 12 | 5 | 12 ^ 5 |
+--------+--------+--------+
|      4 |     13 |      9 |
+--------+--------+--------+
1 row in set (0.00 sec)
4.4 按位取反运算符
  • 按位取反(~)运算符将给定的值的二进制数逐位进行取反操作,即将1变为0,将0变为1
mysql 复制代码
mysql> SELECT 10 & ~1;
+---------+
| 10 & ~1 |
+---------+
|      10 |
+---------+
1 row in set (0.00 sec)
  • 按位取反(~)运算符的优先级高于按位与(&)运算符的优先级
  • 首先,对数字1进行按位取反操作,结果除了最低位为0,其他位都为1
  • 然后与10进行按位与操作,结果为10

4.5 按位右移运算符

  • 按位右移(>>)运算符将给定的值的二进制数的所有位右移指定的位数
  • 右移指定的位数后,右边低位的数值被移出并丢弃,左边高位空出的位置用0补齐
mysql 复制代码
mysql>  SELECT 1 >> 2, 4 >> 2;
+--------+--------+
| 1 >> 2 | 4 >> 2 |
+--------+--------+
|      0 |      1 |
+--------+--------+
1 row in set (0.00 sec)
  • 1的二进制数为0000 0001,右移2位为0000 0000,对应的十进制数为0
  • 4的二进制数为0000 0100,右移2 位为0000 0001,对应的十进制数为1

4.6 按位左移运算符

  • 按位左移(<<)运算符将给定的值的二进制数的所有位左移指定的位数
  • 左移指定的位数后,左边高位的数值被移出并丢弃,右边低位空出的位置用0补齐
mysql 复制代码
mysql>  SELECT 1 << 2, 4 << 2;
+--------+--------+
| 1 << 2 | 4 << 2 |
+--------+--------+
|      4 |     16 |
+--------+--------+
1 row in set (0.00 sec)
  • 1的二进制数为0000 0001,左移两位为0000 0100,对应的十进制数为4
  • 4的二进制数为0000 0100,左移两位为0001 0000,对应的十进制数为16

5. 运算符的优先级

不用记, 实在不行用() 就行


相关推荐
码上有光1 小时前
MySQL的基础操作——约束(上)——期末快速复习
数据库·mysql·期末复习
2401_867623981 小时前
JavaScript中Number-isSafeInteger的校验逻辑
jvm·数据库·python
oddsand11 小时前
原理篇-Redis数据结构
数据库·redis·缓存
昆曲之源_娄江河畔1 小时前
SQL2000记录行锁定
数据库·sql2000·记录行锁定·更新锁定
Anastasiozzzz2 小时前
万字深度实战!AI Agent 接入万物的底层密码:MCP 协议传输机制与开发指南(下篇)
java·开发语言·数据库·人工智能·ai·架构
WL_Aurora2 小时前
MySQL 目录结构全解析
数据库·mysql
Languorous.2 小时前
SQL新手高频语法错误:分号遗漏、字段名写错,避坑合集
数据库·sql
Anastasiozzzz2 小时前
深度解析 AI 时代的“TCP/IP协议”:Agent-to-Agent (A2A) 通信架构与多智能体协同底层逻辑
大数据·开发语言·网络·数据库·网络协议·tcp/ip·架构
wang3zc2 小时前
如何设置密码复杂度策略以约束MongoDB用户的密码强度
jvm·数据库·python