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 |
+--------+
原文地址:https://www.cnblogs.com/wubug/p/13660298.html