运算符的使用解析
- 1 运算符概述
- 2 算数运算符
- 3 比较运算符
- 3.1 等于运算符(=)
- 3.2 安全等于运算符(<==>)
- 3.3 不等于运算符(<> 或者 !=)
- 3.4 小于等于运算符(<=)
- 3.5 小于运算符(<)
- 3.6 大于等于运算符(>=)
- 3.7 大于运算符(>)
- 3.8 IS NULL 和 IS NOT NULL
- 3.9 BETWEEN AND 运算符
- 3.10 LEAST 运算符
- 3.11 GREATST 运算符
- 3.12 IN,NOT IN 运算符
- 3.13 LIKE 运算符
- 3.14 REGEXP 运算符
- 4 逻辑运算符
- 4.1 NOT 或者 !
- 4.2 AND 和 &&
- 4.3 OR 或者 ||
- 4.4 XOR 运算符
- 5 位运算符
- 5.1 位或运算符(|)
- 5.2 位与运算符(&)
- 5.3 位异或运算符(^)
- 5.4 位左移运算符(<<)
- 5.5 位右移运算符
- 5.6 位取反运算符 (~)
- 6 运算符的优先级
MySQL支持各种类型的运算符,这些运算符可以用于处理数字、日期和字符串等不同类型的数据。
1 运算符概述
MySQL支持各种类型的运算符,这些运算符可以用于处理数字、日期和字符串等不同类型的数据。以下是一些MySQL支持的常用运算符:
算术运算符:加号(+)、减号(-)、乘号(*)、除号(/),求余(%)
比较运算符:等于(=)、不等于(<>)、小于(<)、大于(>)、小于等于(<=)、大于等于(>=)、LIKE(用于模式匹配)、IN(用于多个值比较)和BETWEEN(用于范围比较),IS NULL,GREATEST,LEAST,LIKE,REGEXP等。
逻辑运算符:TURE(1),FALSE(0),还有逻辑非(NOT 或者 !),逻辑与(AND 或者 &&),逻辑或(OR 或者 ||),逻辑异或(XOR)。
位运算符:包括位与(&),位或(|),位非(~),位异或(^),左移(<<),右移(>>)。
2 算数运算符
算数运算符是SQL中最基本的运算符。
创建测试表,进行加减法和乘除法的运算测试。
mysql> CREATE TABLE tab_08 ( num INT);
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO tab_08 value(64);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT num, num+10, num-3+5, num+5-3, num+36.5 FROM tab_08;
+------+--------+---------+---------+----------+
| num | num+10 | num-3+5 | num+5-3 | num+36.5 |
+------+--------+---------+---------+----------+
| 64 | 74 | 66 | 66 | 100.5 |
+------+--------+---------+---------+----------+
1 row in set (0.00 sec)
mysql> SELECT num, num *2, num /2, num/3, num%3 FROM tab_08;
+------+--------+---------+---------+-------+
| num | num *2 | num /2 | num/3 | num%3 |
+------+--------+---------+---------+-------+
| 64 | 128 | 32.0000 | 21.3333 | 1 |
+------+--------+---------+---------+-------+
1 row in set (0.00 sec)
mysql> SELECT num, num / 0, num %0 FROM tab_08;
+------+---------+--------+
| num | num / 0 | num %0 |
+------+---------+--------+
| 64 | NULL | NULL |
+------+---------+--------+
1 row in set, 2 warnings (0.00 sec)
结果可以看到,对NUM进行运算的时候,加减法的运算时候,加减的优先级别相同,先加后减,先减后加结果相同。在进行除法运算的时候,64 无法被 3 整除,MySQL对结果保留到了小数点后四位,除以 3 的余数为 1 ,所以 num%3 的结果为 1 ,除法中 0 的除法没有意义,返回结果会为NULL。
3 比较运算符
比较运算符的结果总是 1,0 或者是NULL,比较运算符会经常在SELECT查询子句中使用,来满足查询的条件。
3.1 等于运算符(=)
等于运算符可以用于比较不同数据类型的值,例如字符型、数字型、日期型等,只要这两个值的数据类型相同,就可以进行比较。
需要注意的是,在比较字符型的值时,SQL 通常是区分大小写的。如果想要忽略大小写,可以使用 LOWER() 或 UPPER() 函数进行转换。
mysql> SELECT 1=0, '2'=2, 2=2,'0.02'=0, 'b'='b', (1+3) = (2+2),NULL=NULL;
+-----+-------+-----+----------+---------+---------------+-----------+
| 1=0 | '2'=2 | 2=2 | '0.02'=0 | 'b'='b' | (1+3) = (2+2) | NULL=NULL |
+-----+-------+-----+----------+---------+---------------+-----------+
| 0 | 1 | 1 | 0 | 1 | 1 | NULL |
+-----+-------+-----+----------+---------+---------------+-----------+
1 row in set (0.00 sec)
如果两个数值的数据类型相同,则直接进行比较。
如果两个数值的数据类型不同,则会将其中一个数值转换为另一个数值的数据类型,然后再进行比较。通常,将数字转换为字符型时,SQL 会将数字转换为一个字符串,然后逐位比较字符串的每一个字符;将字符转换为数字时,SQL 会尽可能将字符转换为数字,然后进行比较。
如果其中一个数值为 NULL,则比较的结果为 UNKNOWN。这是因为在 SQL 中,NULL 表示未知或不存在的值,所以无法判断 NULL 和其他值之间的大小关系或相等关系。
3.2 安全等于运算符(<==>)
和等于运算符有相同的比较效果,但是安全等于运算符可用于判断NULL值。两个均为NULL返回为 1,不为NULL,一个为NULL,返回为 0,不为NULL。
mysql> SELECT 1<=>0, '2'<=>2, 2<=>2,'0.02'<=>0, 'b'<=>'b', (1+3) <=> (2+1),NULL<=>NULL;
+-------+---------+-------+------------+-----------+-----------------+-------------+
| 1<=>0 | '2'<=>2 | 2<=>2 | '0.02'<=>0 | 'b'<=>'b' | (1+3) <=> (2+1) | NULL<=>NULL |
+-------+---------+-------+------------+-----------+-----------------+-------------+
| 0 | 1 | 1 | 0 | 1 | 0 | 1 |
+-------+---------+-------+------------+-----------+-----------------+-------------+
1 row in set (0.00 sec)
3.3 不等于运算符(<> 或者 !=)
不等于运算符是 SQL 中常用的另一种比较运算符,表示两个值不相等。在 SQL 中,通常有两种不等于运算符:<> 和 !=。这两种不等于运算符的使用方法完全相同,可以判断数字,字符串,表达式等。 不相等返回为 1 ,相等返回为 0 。
mysql> SELECT 'good'<>'god', 1<>2, 4!=4, 5.5!=5, (1+3)!=(2+1),NULL<>NULL;
+---------------+------+------+--------+--------------+------------+
| 'good'<>'god' | 1<>2 | 4!=4 | 5.5!=5 | (1+3)!=(2+1) | NULL<>NULL |
+---------------+------+------+--------+--------------+------------+
| 1 | 1 | 0 | 1 | 1 | NULL |
+---------------+------+------+--------+--------------+------------+
1 row in set (0.00 sec)
3.4 小于等于运算符(<=)
用于比较两个值大小的运算符之一,用于判断第一个值是否小于或等于第二个值。不能用于判断空值NULL。小于等于返回 1,否则返回 0
mysql> SELECT 'good'<='god', 1<=2, 4<=4, 5.5<=5, (1+3) <= (2+1),NULL<=NULL;
+---------------+------+------+--------+----------------+------------+
| 'good'<='god' | 1<=2 | 4<=4 | 5.5<=5 | (1+3) <= (2+1) | NULL<=NULL |
+---------------+------+------+--------+----------------+------------+
| 0 | 1 | 1 | 0 | 0 | NULL |
+---------------+------+------+--------+----------------+------------+
1 row in set (0.01 sec)
3.5 小于运算符(<)
用于比较两个值大小的运算符之一,用于判断第一个值是否小于第二个值。不能用于判断空值NULL。小于返回 1,否则返回 0
mysql> SELECT 'good'<'god', 1<2, 4<4, 5.5<5, (1+3) < (2+1),NULL<NULL;
+--------------+-----+-----+-------+---------------+-----------+
| 'good'<'god' | 1<2 | 4<4 | 5.5<5 | (1+3) < (2+1) | NULL<NULL |
+--------------+-----+-----+-------+---------------+-----------+
| 0 | 1 | 0 | 0 | 0 | NULL |
+--------------+-----+-----+-------+---------------+-----------+
1 row in set (0.00 sec)
3.6 大于等于运算符(>=)
SQL 中用于比较两个值大小的运算符之一,用于判断第一个值是否大于等于第二个值。不能用于判断空值NULL。大于等于返回 1,否则返回 0。
mysql> SELECT 'good'>='god', 1>=2, 4>=4, 5.5>=5, (1+3) >= (2+1),NULL>=NULL;
+---------------+------+------+--------+----------------+------------+
| 'good'>='god' | 1>=2 | 4>=4 | 5.5>=5 | (1+3) >= (2+1) | NULL>=NULL |
+---------------+------+------+--------+----------------+------------+
| 1 | 0 | 1 | 1 | 1 | NULL |
+---------------+------+------+--------+----------------+------------+
1 row in set (0.00 sec)
3.7 大于运算符(>)
SQL 中用于比较两个值大小的运算符之一,用于判断第一个值是否大于第二个值。不能用于判断空值NULL。大于返回 1,否则返回 0。
mysql> SELECT 'good'>'god', 1>2, 4>4, 5.5>5, (1+3) > (2+1),NULL>NULL;
+--------------+-----+-----+-------+---------------+-----------+
| 'good'>'god' | 1>2 | 4>4 | 5.5>5 | (1+3) > (2+1) | NULL>NULL |
+--------------+-----+-----+-------+---------------+-----------+
| 1 | 0 | 0 | 1 | 1 | NULL |
+--------------+-----+-----+-------+---------------+-----------+
1 row in set (0.00 sec)
3.8 IS NULL 和 IS NOT NULL
IS NULL 和 IS NOT NULL 是 SQL 中用于判断一个值是否为空(NULL)的运算符。
IS NULL 如果为NULL返回 1,否则返回 0。IS NOT NULL则与之相反。
mysql> SELECT NULL IS NULL, ISNULL(NULL),ISNULL(10), 10 IS NOT NULL;
+--------------+--------------+------------+----------------+
| NULL IS NULL | ISNULL(NULL) | ISNULL(10) | 10 IS NOT NULL |
+--------------+--------------+------------+----------------+
| 1 | 1 | 0 | 1 |
+--------------+--------------+------------+----------------+
1 row in set (0.00 sec)
3.9 BETWEEN AND 运算符
用于判断一个值是否在两个指定值之间的运算符。语法格式为:
value BETWEEN low AND high
其中,value 表示要判断的值,low 和 high 分别表示区间的下限和上限。
如果在区间内,包含low 和 high 值,返回为1,否则返回 0。
mysql> SELECT 4 BETWEEN 4 AND 6, 4 BETWEEN 4 AND 6,12 BETWEEN 9 AND 10;
+-------------------+-------------------+---------------------+
| 4 BETWEEN 4 AND 6 | 4 BETWEEN 4 AND 6 | 12 BETWEEN 9 AND 10 |
+-------------------+-------------------+---------------------+
| 1 | 1 | 0 |
+-------------------+-------------------+---------------------+
1 row in set (0.00 sec)
mysql> SELECT 'x' BETWEEN 'f' AND 'g', 'b' BETWEEN 'a' AND 'c';
+-------------------------+-------------------------+
| 'x' BETWEEN 'f' AND 'g' | 'b' BETWEEN 'a' AND 'c' |
+-------------------------+-------------------------+
| 0 | 1 |
+-------------------------+-------------------------+
1 row in set (0.00 sec)
3.10 LEAST 运算符
用于在多个值中选择最小值的函数。
其语法格式为:
LEAST(value1, value2, ...)
其中,value1、value2、… 表示要比较的值,可以是任意数量的值。
需要注意的是,如果给 LEAST 函数传递的参数中有一个为空(NULL),那么结果也会为空。如果要避免这种情况,可以使用 COALESCE 函数将空值转换为一个默认值。例如:
– 选择两个数值中较小的一个,如果其中一个为空,则选择另一个
SELECT LEAST(5, COALESCE(NULL, 3));
mysql> SELECT least(2,0), least(20.0,3.0,100.5), least('a','c','b'),least(10,NULL);
+------------+-----------------------+--------------------+----------------+
| least(2,0) | least(20.0,3.0,100.5) | least('a','c','b') | least(10,NULL) |
+------------+-----------------------+--------------------+----------------+
| 0 | 3.0 | a | NULL |
+------------+-----------------------+--------------------+----------------+
1 row in set (0.00 sec)
3.11 GREATST 运算符
GREATEST
是 SQL 中用于在多个值中选择最大值的函数。
其语法格式为:
GREATEST(value1, value2, ...)
其中,value1
、value2
、… 表示要比较的值,可以是任意数量的值。
需要注意的是,如果给 GREATEST
函数传递的参数中有一个为空(NULL),那么结果也会为空。如果要避免这种情况,可以使用 COALESCE
函数将空值转换为一个默认值。例如:
-- 选择两个数值中较大的一个,如果其中一个为空,则选择另一个
SELECT GREATEST(5, COALESCE(NULL, 3));
mysql> SELECT greatest(2,0), greatest(20.0,3.0,100.5), greatest('a','c','b'),greatest(10,NULL);
+---------------+--------------------------+-----------------------+-------------------+
| greatest(2,0) | greatest(20.0,3.0,100.5) | greatest('a','c','b') | greatest(10,NULL) |
+---------------+--------------------------+-----------------------+-------------------+
| 2 | 100.5 | c | NULL |
+---------------+--------------------------+-----------------------+-------------------+
1 row in set (0.00 sec)
3.12 IN,NOT IN 运算符
IN 运算符用来判断是否为IN 列表中的其中一个值,如果是返回为1,否则返回 0。NOT IN和IN则是相反的结果。
IN 的语法格式为:
value IN (value1, value2, ...)
其中,value 表示要进行测试的值,(value1, value2, …) 表示要进行比较的一组值。NOT IN 的语法格式与 IN 很相似,只需在 IN 前面加上 NOT 即可。
mysql> SELECT 2 IN (1,3,5,'thks'), 'thks' IN (1,3,5,'thks');
+---------------------+--------------------------+
| 2 IN (1,3,5,'thks') | 'thks' IN (1,3,5,'thks') |
+---------------------+--------------------------+
| 0 | 1 |
+---------------------+--------------------------+
1 row in set, 2 warnings (0.00 sec)
3.13 LIKE 运算符
用于在 SQL 查询中进行模式匹配。它与通配符符号一起使用,来匹配字符串中的部分内容。
LIKE 运算符的语法格式为:
value LIKE pattern
其中,value 表示要进行匹配的字符串,pattern 表示要匹配的模式。可以使用 % 和 _ 通配符来表示任意多个字符和任意单个字符。
需要注意的是,在使用 LIKE 运算符时,匹配字符串的时候区分大小写。如果要忽略大小写,可以使用 LOWER 或 UPPPER 函数将字符串转换为小写或大写再进行匹配。
mysql> SELECT 'stud' LIKE 'stud', 'stud' LIKE 'stu_','stud' LIKE '%d','stud' LIKE 't_ _ _', 's' LIKE NULL;
+--------------------+--------------------+------------------+----------------------+---------------+
| 'stud' LIKE 'stud' | 'stud' LIKE 'stu_' | 'stud' LIKE '%d' | 'stud' LIKE 't_ _ _' | 's' LIKE NULL |
+--------------------+--------------------+------------------+----------------------+---------------+
| 1 | 1 | 1 | 0 | NULL |
+--------------------+--------------------+------------------+----------------------+---------------+
1 row in set (0.00 sec)
3.14 REGEXP 运算符
REGEXP 运算符用于在 SQL 查询中进行正则表达式匹配。它与正则表达式的语法一起使用,来匹配字符串中的部分内容。
REGEXP 运算符的语法格式为:
value REGEXP pattern
其中,value 表示要进行匹配的字符串,pattern 表示要匹配的正则表达式。正则表达式中可以使用各种元字符和限定符来表达不同的匹配模式。
1)‘^’ 匹配以该字符后边字符开头的字符串。
2)‘$’ 匹配以该字符后边字符结尾的字符串。
3)‘.’ 匹配任意一个单字符
4)‘[…] ’ 匹配括号内的任何字符,如[abcd] 匹配a,b,c,d。也可使用范围,[a-z] 匹配任意字母,[0-9]匹配任意数字。
5)’* ’ 匹配零个或者多个在他前面的字符。比如 ‘a*’,是匹配任何数量的a字符,'* '则是匹配任何数据量的任何字符。
mysql> SELECT 'ssky' REGEXP '^s', 'ssky' REGEXP 'y$', 'ssky' REGEXP '.sky', 'ssky' REGEXP '[ab]';
+--------------------+--------------------+----------------------+----------------------+
| 'ssky' REGEXP '^s' | 'ssky' REGEXP 'y$' | 'ssky' REGEXP '.sky' | 'ssky' REGEXP '[ab]' |
+--------------------+--------------------+----------------------+----------------------+
| 1 | 1 | 1 | 0 |
+--------------------+--------------------+----------------------+----------------------+
1 row in set (0.00 sec)
4 逻辑运算符
所有逻辑运算符所求的结果均为TRUE,FALSE或者NULL,mysql中体现为1,0,和NULL
4.1 NOT 或者 !
逻辑非运算符NOT或者 ! ,表示当前操作数为 0 ,所得值为1,当操作数为非 0 值时候,所得值为0,当操作数为NULL是,所得的返回值为NULL。
mysql> SELECT NOT 10, NOT (1-1), NOT -5, NOT NULL, NOT 1 + 1;
+--------+-----------+--------+----------+-----------+
| NOT 10 | NOT (1-1) | NOT -5 | NOT NULL | NOT 1 + 1 |
+--------+-----------+--------+----------+-----------+
| 0 | 1 | 0 | NULL | 0 |
+--------+-----------+--------+----------+-----------+
1 row in set (0.00 sec)
mysql> SELECT !10, !(1-1), !-5, ! NULL, ! 1 + 1;
+-----+--------+-----+--------+---------+
| !10 | !(1-1) | !-5 | ! NULL | ! 1 + 1 |
+-----+--------+-----+--------+---------+
| 0 | 1 | 0 | NULL | 1 |
+-----+--------+-----+--------+---------+
1 row in set, 5 warnings (0.00 sec)
4.2 AND 和 &&
逻辑与运算符 AND 或者 &&表示当所有操作数均为非零值并且不为NULL时,计算所得结果为 1 ,当一个或者多个操作数为 0 时,所得结果为 0 ,其余情况为NULL。
mysql> SELECT 1 AND -1,1 AND 0,1 AND NULL, 0 AND NULL;
+----------+---------+------------+------------+
| 1 AND -1 | 1 AND 0 | 1 AND NULL | 0 AND NULL |
+----------+---------+------------+------------+
| 1 | 0 | NULL | 0 |
+----------+---------+------------+------------+
1 row in set (0.00 sec)
mysql>
mysql> SELECT 1 && -1,1 && 0,1 && NULL, 0 && NULL;
+---------+--------+-----------+-----------+
| 1 && -1 | 1 && 0 | 1 && NULL | 0 && NULL |
+---------+--------+-----------+-----------+
| 1 | 0 | NULL | 0 |
+---------+--------+-----------+-----------+
1 row in set, 4 warnings (0.00 sec)
4.3 OR 或者 ||
逻辑或运算符 OR 或者 || 表示当两个操作数均为非NULL值,且任意一个操作数为非零值时,结果为 1,否则结果为 0。 有一个操作数为NULL,另一个为非零值时,结果为 1.否则结果为NULL。当两个操作数均为NULL时,所得结果为NULL。
mysql> SELECT 0 OR 0 OR 0, 1 OR 2,1 OR NULL, 0 OR NULL, NULL OR NULL;
+-------------+--------+-----------+-----------+--------------+
| 0 OR 0 OR 0 | 1 OR 2 | 1 OR NULL | 0 OR NULL | NULL OR NULL |
+-------------+--------+-----------+-----------+--------------+
| 0 | 1 | 1 | NULL | NULL |
+-------------+--------+-----------+-----------+--------------+
1 row in set (0.00 sec)
mysql> SELECT 1 || -1 || 0, 1 || 2,1 || NULL, 0 || NULL, NULL || NULL;
+--------------+--------+-----------+-----------+--------------+
| 1 || -1 || 0 | 1 || 2 | 1 || NULL | 0 || NULL | NULL || NULL |
+--------------+--------+-----------+-----------+--------------+
| 1 | 1 | 1 | NULL | NULL |
+--------------+--------+-----------+-----------+--------------+
1 row in set, 6 warnings (0.00 sec)
4.4 XOR 运算符
逻辑异或运算符XOR,表示当任意一个操作数为NULL,返回值NULL,对于得NULL的操作数,如果两个都是非 0 值或者都是 0 值。则返回结果为 0 ,如过一个为 0,另一个为非 0 值,则返回结果为 1。
mysql> SELECT 1 XOR 1, 0 XOR 0, 1 XOR 0, 1 XOR NULL, 1 XOR 1 XOR 1;
+---------+---------+---------+------------+---------------+
| 1 XOR 1 | 0 XOR 0 | 1 XOR 0 | 1 XOR NULL | 1 XOR 1 XOR 1 |
+---------+---------+---------+------------+---------------+
| 0 | 0 | 1 | NULL | 1 |
+---------+---------+---------+------------+---------------+
1 row in set (0.00 sec)
最后一个 1 XOR 1 为 0 ,之后再和 1 进行运算,结果为1.
5 位运算符
位运算符是在二进制数上进行计算的运算符,位运算符会先将操作数变为二进制数,然后进行位运算,最后将结果从二进制变回十进制。
5.1 位或运算符(|)
位或运算的实质是将参与运算的几个数据按照对应的二进制数诸位进行逻辑位或运算,对应的二进制为有一个或者两个为1则该为的运算结果为1,否则为0。
mysql> SELECT 10 | 15, 9 | 4 | 2;
+---------+-----------+
| 10 | 15 | 9 | 4 | 2 |
+---------+-----------+
| 15 | 15 |
+---------+-----------+
1 row in set (0.00 sec)
10 的二进制数值为 1010,15 的二进制数值为 1111,按位或运算之后,结果为 1111,即整数15
9的二进制数值为 1001,4 的二进制数值为 0100,2的二进制数值为 0010,按位或运算之后,结果为 1111,即整数 15。其结果为一个64 位无符号整数。
5.2 位与运算符(&)
位与运算的实质是将参与运算的几个操作数按照对应的二进制数逐位进行逻辑与运算。对应的二进制位都为1则该位的运算结果为 1,否则为 0。
mysql> SELECT 10 & 15, 9 &4& 2;
+---------+---------+
| 10 & 15 | 9 &4& 2 |
+---------+---------+
| 10 | 0 |
+---------+---------+
1 row in set (0.00 sec)
10的二进制数值为 1010,15 的二进制数值为 1111,按位与运算之后,结果为 1010,即整数10
9的二进制数值为 1001,4 的二进制数值为 0100,2的二进制数值为 0010,按位与运算之后,结果为 0000,即整数0。其结果为一个64位无符号整数。
5.3 位异或运算符(^)
位异或运算的实质是将参与运算的两个数据按照对应的二进制数逐位进行逻辑异或运算。对应位的二进制数不同时,对应位的结果才为 1。如果两个对应位数都为0或者都为 1,则对应位的结果为 0。
mysql> SELECT 10 ^ 15, 1 ^0, 1 ^ 1;
+---------+------+-------+
| 10 ^ 15 | 1 ^0 | 1 ^ 1 |
+---------+------+-------+
| 5 | 1 | 0 |
+---------+------+-------+
1 row in set (0.01 sec)
10 的二进制数值为 1010,15 的二进制数值为 1111,按位异或运算之后,结果为 0101,即整数5
1的二进制数值为 0001,0的二进制数值为 0000,按位异或运算之后,结果为 0001
1和1本身二进制位完全相同,因此结果为 0。
5.4 位左移运算符(<<)
位左移运算符<<使指定的二进制值的所有位都左移指定的位数。左移指定位数之后,左边高位的数值将被移出并丢弃,右边低位空出的位置用 0补齐。
语法格式为:
expr<<n
其中,n 指定值expr要移位的位数。
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左移两位之后变成 0001 0000,即变成十进制的 16。
5.5 位右移运算符
位右移运算符>>使指定的二进制值的所有位都右移指定的位数。右移指定位数之后,右边低位的数值将被移出并丢弃,左边高位空出的位置用 0 补齐。
语法格式为:
expr>>n
其中,n 指定值expr 要移位的位数。
mysql> SELECT 1>>1, 16>>2;
+------+-------+
| 1>>1 | 16>>2 |
+------+-------+
| 0 | 4 |
+------+-------+
1 row in set (0.00 sec)
1的二进制值为 0000 0001,右移 1位之后变成000 0000,即十进制整数 0
16 的二进制值为0001 0000 右移两位之后变成 0000 0100,即变成十进制的 4。
5.6 位取反运算符 (~)
位取反运算的实质是将参与运算的数据按照对应的二进制数逐位反转,即 1 取反后变为 0、0取反后变为 1。
mysql> SELECT 5 & ~1;
+--------+
| 5 & ~1 |
+--------+
| 4 |
+--------+
1 row in set (0.00 sec)
在逻辑运算 5& ~1 中,由于位取反运算符 ~ 的级别高于位与运算符 & ,因此先对 1进行取反操作,取反之后,除了最低位为 0外其他位都为 1,即1110,然后与十进制数值 5 进行与运算,结果为 0100,即整数 4。
6 运算符的优先级
运算符的优先级别决定了不同的运算符在表达式中的计算的先后顺序。
可以看到,不同运算符的优先级是不同的。一般情况下,级别高的运算符先进行计算,如果级别相同,MySOL 按表达式的顺序从左到右依次计算。当然,在无法确定优先级的情况下,可以使用圆括号()来改变优先级,并且这样会使计算过程更加清晰。