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 |
+--------+