运算符概念
算术运算符
加减乘除求余
比较运算符
大于> 小于< 等于= 大于等于>= 小于等于<= 不等于!=
IN、 BETWEEN AND、 IS NULL、 GREATEST、 LEAST、 LIKE、 REGEXP
逻辑运算符
TRUE(1) FALSE(0) NOT(!) AND(&&) OR(||) XOR
位操作运算符
操作数按二进制位进行运算,包括与(&)位、或(|)位、非(~)位、异或(^)、左移(<<)、右移(>>)
算术运算符
mysql> create table tmpl4(num int);
Query OK, 0 rows affected (0.16 sec)
mysql> insert into tmpl4 values(64);
Query OK, 1 row affected (0.01 sec)
1.加减运算
mysql> select num,num+10,num-3+5,num+5-3,num+36.5 from tmpl4;
+------+--------+---------+---------+----------+
| 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)
2.乘法、除法运算、取余
mysql> select num,num*2,num/2,num/3,num%3 from tmpl4;
+------+-------+---------+---------+-------+
| num | num*2 | num/2 | num/3 | num%3 |
+------+-------+---------+---------+-------+
| 64 | 128 | 32.0000 | 21.3333 | 1 |
+------+-------+---------+---------+-------+
1 row in set (0.00 sec)
3.用0除num
mysql> select num,num/0,num%0 from tmpl4;
+------+-------+-------+
| num | num/0 | num%0 |
+------+-------+-------+
| 64 | NULL | NULL |
+------+-------+-------+
1 row in set (0.00 sec)
比较运算符
1.等于运算符
mysql> select 1=0,'2'=2,2=2,'0.02'=0,'b'='b',(1+3)=(2+2),null=null from tmpl4;
+-----+-------+-----+----------+---------+-------------+-----------+
| 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)
如下规则:
若两个参数为NULL,则结果为NULL
若两个参数为字符串,则按照字符串比较
若两个参数为整数,则按照整数比较
若两个参数一整数,一字符串,则会自动将字符串转为数字再进行比较
2.安全等于运算符(<=>):
与=号用法一至,唯一区别是可以判断NULL,两者都为NULL时,返回值为1。
mysql> select 1<=>0,'2'<=>2,null<=>null from tmpl4;
+-------+---------+-------------+
| 1<=>0 | '2'<=>2 | null<=>null |
+-------+---------+-------------+
| 0 | 1 | 1 |
+-------+---------+-------------+
1 row in set (0.00 sec)
3.不等于运算符(<>或者!=)
mysql> select 'good'<>'god',1<>2,4!=4;
+---------------+------+------+
| 'good'<>'god' | 1<>2 | 4!=4 |
+---------------+------+------+
| 1 | 1 | 0 |
+---------------+------+------+
1 row in set (0.00 sec)
4.小于或等于运算符(<=)
mysql> select 'good'<='god',1<=2,null<=null;
+---------------+------+------------+
| 'good'<='god' | 1<=2 | null<=null |
+---------------+------+------------+
| 0 | 1 | NULL |
+---------------+------+------------+
1 row in set (0.00 sec)
5.is null(isnull)、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)
6.BETWEEN AND运算符
mysql> select 4 BETWEEN 2 AND 5,4 BETWEEN 4 AND 6,12 BETWEEN 9 AND 10;
+-------------------+-------------------+---------------------+
| 4 BETWEEN 2 AND 5 | 4 BETWEEN 4 AND 6 | 12 BETWEEN 9 AND 10 |
+-------------------+-------------------+---------------------+
| 1 | 1 | 0 |
+-------------------+-------------------+---------------------+
1 row in set (0.00 sec)
7.LEAST运算符
mysql> select least(2,0),least(20,3,100),least('a','b','c'),least(10,null);
+------------+-----------------+--------------------+----------------+
| least(2,0) | least(20,3,100) | least('a','b','c') | least(10,null) |
+------------+-----------------+--------------------+----------------+
| 0 | 3 | a | NULL |
+------------+-----------------+--------------------+----------------+
1 row in set (0.00 sec)
返回最小值,如果有一个自变量为NULL,无法判断大小则返回NULL。
8.GRETEST运算符(最大值同最小值)
mysql> select greatest(2,0),greatest(20,3,100.5),greatest('a','b','c'),greatest(10,null);
+---------------+----------------------+-----------------------+-------------------+
| greatest(2,0) | greatest(20,3,100.5) | greatest('a','b','c') | greatest(10,null) |
+---------------+----------------------+-----------------------+-------------------+
| 2 | 100.5 | c | NULL |
+---------------+----------------------+-----------------------+-------------------+
1 row in set (0.00 sec)
9.IN、NOT IN 运算符
mysql> select 2 in (1,3,5,'thks'),'thks' not in ('thsk',2,3),'5' in (5,62);
+---------------------+----------------------------+---------------+
| 2 in (1,3,5,'thks') | 'thks' not in ('thsk',2,3) | '5' in (5,62) |
+---------------------+----------------------------+---------------+
| 0 | 1 | 1 |
+---------------------+----------------------------+---------------+
1 row in set, 2 warnings (0.00 sec)
存在NULL时的IN查询,左侧为NULL,表中找不到匹配项并且表达式中有一个为NULL
mysql> select null in (1,20,'dasd'),10 in ('dasdm',null,56);
+-----------------------+-------------------------+
| null in (1,20,'dasd') | 10 in ('dasdm',null,56) |
+-----------------------+-------------------------+
| NULL | NULL |
+-----------------------+-------------------------+
1 row in set, 1 warning (0.00 sec)
10.LIKE
匹配对象 like 要匹配的格式,满足返回1,否则0
- '%',匹配任何数目的字符
- '_',只能匹配一个字符
mysql> select 'stud' like 'stud','stud' like 'stu_','stud' like '%d','stud' like 's__';
+--------------------+--------------------+------------------+-------------------+
| 'stud' like 'stud' | 'stud' like 'stu_' | 'stud' like '%d' | 'stud' like 's__' |
+--------------------+--------------------+------------------+-------------------+
| 1 | 1 | 1 | 0 |
+--------------------+--------------------+------------------+-------------------+
1 row in set (0.00 sec)
REGEXP正则表达式
匹配对象 REGEXP 指定匹配的字符串
- '^'匹配以该字符串后面的字符开头
- '$'匹配以该字符串前的字符结尾
- '.'匹配任何一个单字符
- '[....]'匹配在方括号内的任何字符,为了命名字符的范围,使用了一个'-','[a-z]'匹配任何字符。'[0-9]'匹配任何数字。
- ' * '匹配零个或多个在他前面的字符;'x'匹配任何数量的'x'字符,'[0-9]'匹配任何数量的数字
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.04 sec)
逻辑运算符
1.NOT 或者 !
逻辑运算当为0时,所得值为1,当操作数为非零时,所得值为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,!-5,!(1-1),!(1+1);
+-----+-----+--------+--------+
| !10 | !-5 | !(1-1) | !(1+1) |
+-----+-----+--------+--------+
| 0 | 0 | 1 | 0 |
+-----+-----+--------+--------+
1 row in set (0.00 sec)
2.AND 或者 &&
逻辑运算为非0并且不为NULL,返回1,有一个为0则返回0,其余情况返回NULL
mysql> select 1 AND -1,1 AND 0,0 AND NULL,1 AND NULL;
+----------+---------+------------+------------+
| 1 AND -1 | 1 AND 0 | 0 AND NULL | 1 AND NULL |
+----------+---------+------------+------------+
| 1 | 0 | 0 | NULL |
+----------+---------+------------+------------+
1 row in set (0.00 sec)
mysql> select 1 && -1,1 && 0,0 && NULL,1 && NULL;
+---------+--------+-----------+-----------+
| 1 && -1 | 1 && 0 | 0 && NULL | 1 && NULL |
+---------+--------+-----------+-----------+
| 1 | 0 | 0 | NULL |
+---------+--------+-----------+-----------+
1 row in set (0.00 sec)
3.OR 或者 ||
两值均为非NULL,只要一个不是0,则为1;有一个为NULL,只要有一个不是0,则是1,否则则为NULL
mysql> select 0 or -1, 0 or NULL, 1 or NULL, 0 or 0;
+---------+-----------+-----------+--------+
| 0 or -1 | 0 or NULL | 1 or NULL | 0 or 0 |
+---------+-----------+-----------+--------+
| 1 | NULL | 1 | 0 |
+---------+-----------+-----------+--------+
1 row in set (0.00 sec)
mysql> select 0 || -1,0 || NULL, 50 || NULL, 0 || 0;
+---------+-----------+------------+--------+
| 0 || -1 | 0 || NULL | 50 || NULL | 0 || 0 |
+---------+-----------+------------+--------+
| 1 | NULL | 1 | 0 |
+---------+-----------+------------+--------+
1 row in set (0.00 sec)
4.XOR
逻辑异或运算,当任意一个为NULL,返回NULL,两个都非NULL,一个为0,一个为非0,返回1,否则返回0。
mysql> select 0 xor 0, 1 xor 1, 1 xor NULL, 25 xor 0, 0 xor NULL;
+---------+---------+------------+----------+------------+
| 0 xor 0 | 1 xor 1 | 1 xor NULL | 25 xor 0 | 0 xor NULL |
+---------+---------+------------+----------+------------+
| 0 | 0 | NULL | 1 | NULL |
+---------+---------+------------+----------+------------+
位运算符
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)
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)
3.位异或运算符(^)
位与运算的实质是将参与运算的几个操作数,按对应的二进制数逐位进行逻辑与运算,对应的二进制不一样时,则该位的运算结果为1,否则为0
mysql> select 10 ^ 15,1^0,1^1;
+---------+-----+-----+
| 10 ^ 15 | 1^0 | 1^1 |
+---------+-----+-----+
| 5 | 1 | 0 |
+---------+-----+-----+
1 row in set (0.00 sec)
4.位左移运算符(<<)
使指定的二进制所有位都左移指定的位数,左移后左边高位的数值将丢弃,右边低位的位置用0补齐。
mysql> select 1<<2,2<<4;
+------+------+
| 1<<2 | 2<<4 |
+------+------+
| 4 | 32 |
+------+------+
1 row in set (0.00 sec)
1的二进制位0000 0001,左移两位之后变为0000 0100,即十进制整数4,再左移两位变为16。
5.位取反运算符(~)
位取反运算实质是将参与运算的数据,按对应的二进制数逐位反转,即1取反后变为0,0取反后变为1。
mysql> select 5 & ~1;
+--------+
| 5 & ~1 |
+--------+
| 4 |
+--------+
1 row in set (0.00 sec)
~优先级高,1本来为0000 0001,取反后为1111 1110,5的二进制为0000 0101,与运算后为0000 0100,则为4
mysql经过位运算后的数值是一个64位的无符号整数,可以使用BIN()函数产看1取反之后的结果
+------------------------------------------------------------------+
| bin(~1) |
+------------------------------------------------------------------+
| 1111111111111111111111111111111111111111111111111111111111111110 |
+------------------------------------------------------------------+
1 row in set (0.00 sec)