赞
踩
在MySQL数据库操作中,运算符”扮演“着较为重要的角色,连接表达式中的各个操作数,其作用是用来指明对操作数所进行的运算。下面是我在学习其过程中总结的一些关于MySQL各种运算符的特点以及使用方法。
算术运算符是SQL中最基本的运算符,用于各类数值运算。
运算符 | 作用 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法,返回商 |
% | 取余,返回余数 |
表1 MySQL中的算术运算符
例操作如下:
create table tmp1(num INT);
INSERT INTO tmp1 value(64);
- mysql> SELECT num,num+10,num-3+5,num+5-3,num+36.5 FROM tmp1;
- +------+--------+---------+---------+----------+
- | 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 FROM tmp1;
- +------+-------+---------+-------+
- | num | num*2 | num/2 | num%3 |
- +------+-------+---------+-------+
- | 64 | 128 | 32.0000 | 1 |
- +------+-------+---------+-------+
- 1 row in set (0.00 sec)
当然在数学运算中,除数为0的除法是没有意义的,即除法运算中的除法不能为0,若被0除,则放回结果为NULL。
- mysql> SELECT num,num/0,num%0 FROM tmp1;
- +------+-------+-------+
- | num | num/0 | num%0 |
- +------+-------+-------+
- | 64 | NULL | NULL |
- +------+-------+-------+
- 1 row in set (0.00 sec)
一个比较运算符用于比较运算,其结果总是1、0或者是NULL。比较运算符常出现在SELECT语句中用来查询指定条件的记录。
符号 | 描述 |
---|---|
= | 等于 |
<>, != | 不等于 |
> | 大于 |
< | 小于 |
<= | 小于等于 |
>= | 大于等于 |
BETWEEN AND | 在两值之间 |
IN | 在集合中 |
NOT IN | 不在集合中 |
<=> | 严格比较两个NULL值是否相等(安全等于) |
LIKE | 模糊匹配 |
REGEXP 或 RLIKE | 正则式匹配 |
IS NULL | 为空 |
IS NOT NULL | 不为空 |
LEAST | 在有多个参数时,返回最小值 |
GREATEST | 在有多个参数时,返回最大值 |
表2 MySQL中的比较运算符
下面通过例子展现不同比较运算符的使用方法
等号(=)用来判断数字、字符串和表达式是否相等:若相等则返回值为1,否则返回值为0。
- mysql> SELECT 1=0,'2'=2,2=2,(1+2)=(0+3),NULL=NULL;
- +-----+-------+-----+-------------+-----------+
- | 1=0 | '2'=2 | 2=2 | (1+2)=(0+3) | NULL=NULL |
- +-----+-------+-----+-------------+-----------+
- | 0 | 1 | 1 | 1 | NULL |
- +-----+-------+-----+-------------+-----------+
- 1 row in set (0.00 sec)
数值比较时的规则:
(1)若有一个或两个参数为NULL,则比较运算的结果为NULL
(2)若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较
(3)若两个参数均为整数,则按整数进行比较
(4)若用字符串和数字进行相等判断,则MySQL可以自动将字符串转换为数字
操作与=运算符相同,但<=>可以用来判断NULL值。在两个操作数均为NULL时返回值为1;当一个操作数为NULL时返回值为0而不为NULL。
- mysql> SELECT 1<=>0,1<=>NULL,NULL<=>NULL;
- +-------+----------+-------------+
- | 1<=>0 | 1<=>NULL | NULL<=>NULL |
- +-------+----------+-------------+
- | 0 | 0 | 1 |
- +-------+----------+-------------+
- 1 row in set (0.00 sec)
'<>'或者'!='用于判断数字、字符串、表达式不相等的判断:若不相等返回值为1,否则返回值为0.其不等用于判断空值NULL。
- mysql> SELECT 'good'<>'god',1<>2,4!=4,5.5!=5,NULL<>NULL;
- +---------------+------+------+--------+------------+
- | 'good'<>'god' | 1<>2 | 4!=4 | 5.5!=5 | NULL<>NULL |
- +---------------+------+------+--------+------------+
- | 1 | 1 | 0 | 1 | NULL |
- +---------------+------+------+--------+------------+
- 1 row in set (0.00 sec)
‘<=’用来判断左边的操作数是否小于等于右边的操作数:若小于等于返回值为1否则返回0.‘<=’不能用于判断控制NULL。
- mysql> SELECT 'good'<='god',1<=2,5.5<=5,NULL<=NULL;
- +---------------+------+--------+------------+
- | 'good'<='god' | 1<=2 | 5.5<=5 | NULL<=NULL |
- +---------------+------+--------+------------+
- | 0 | 1 | 0 | NULL |
- +---------------+------+--------+------------+
- 1 row in set (0.00 sec)
‘<’用来判断左边的操作数是否小于右边的操作数:若小于返回值为1否则返回0.‘<’不能用于判断控制NULL
- mysql> SELECT 'good'<'god',1<2,5.5<5,NULL<NULL;
- +--------------+-----+-------+-----------+
- | 'good'<'god' | 1<2 | 5.5<5 | NULL<NULL |
- +--------------+-----+-------+-----------+
- | 0 | 1 | 0 | NULL |
- +--------------+-----+-------+-----------+
- 1 row in set (0.00 sec)
6,7两点操作与前面4,5反向相同,就不重复操作啦~
IS NULL和ISNULL检验一个值是否为NULL:若为NULL返回值为1,否则返回值为0。
IS NOTNULL检验一个值是否为非NULL:若非NULL,返回值为1否则返回值为0
- 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)
语法格式:expr BETWEEN min AND max.假如expr大于等于min且小于等于max,则BETWEEN的返回值为1,否则返回值为0.
- 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)
-
- 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)
语法格式:LEAST(值1,值2,...,值n)。其中,“值n”表示参数列表中有n个值。在有两个或多个参数的情况下,返回最小值。假如任意一个自变量为NULL,则LESAT()的返回值为NULL。
- 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)
语法格式:GREATEST(值1,值2,...,值n)。其中,n表示参数列表中有n个值。当有两个或多个参数时,返回值为最大值。假如任意一个自变量为NULL,则GREATEST()返回值为NULL。
- 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)
IN运算符用来判段操作数是否为IN列表中的其中一个值:如果是,返回值为1否则返回值为0.
NOT IN运算符用来判断表达式是否为IN列表中的其中一个值,如果不是则返回值为1,否则返回值为0
- 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)
-
- mysql> SELECT 2 NOT IN(1,3,5,'thks'),'thks' NOT IN (1,3,5,'thks');
- +------------------------+------------------------------+
- | 2 NOT IN(1,3,5,'thks') | 'thks' NOT IN (1,3,5,'thks') |
- +------------------------+------------------------------+
- | 1 | 0 |
- +------------------------+------------------------------+
- 1 row in set, 2 warnings (0.00 sec)
在左侧表达式为NULL的情况下,或是表中找不到匹配项并且表中一个表达式为NULL去情况下,IN的返回值均为NULL。
LIKE运算符用来匹配字符串,语法格式为:expr LIKE匹配条件。如果expr满足匹配条件,则返回值为1(TRUE);如果不匹配,则返回值为0(FALSE)。expr或匹配条件中任何一个为NULL,则结果为NULL。
LIKE运算符在进行匹配时有两种通配符:
%
)通配符允许匹配任何字符串的零个或多个字符。_
)通配符允许匹配任何单个字符。- 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)
REGEXP运算符用来匹配字符串。语法格式:expr REGEXP匹配条件。如果expr满足匹配条件,返回1;如果不满足,则返回0.若expr或匹配条件任意一个为NULL,则结果为NULL。
REGEXP运算符在进行匹配时,通常有以下几种通配符:
模式 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。 |
$ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。 |
. | 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像 '[.\n]' 的模式。 |
[...] | 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 |
- 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)
在SQL中,所有逻辑运算符的求值所得结果均为TRUE,FALSE或NULL。在MySQL中,它体现为1(TRUE)、0(FASLE)和NULL。
运算符号 | 作用 |
---|---|
NOT 或 ! | 逻辑非 |
AND | 逻辑与 |
OR | 逻辑或 |
XOR | 逻辑异或 |
表3 MySQL中的逻辑运算符
逻辑非运算符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,!(1-1),!-5,!NULL,!1+1;
- +-----+--------+-----+-------+------+
- | !10 | !(1-1) | !-5 | !NULL | !1+1 |
- +-----+--------+-----+-------+------+
- | 0 | 1 | 0 | NULL | 1 |
- +-----+--------+-----+-------+------+
- 1 row in set(0.00 sec)
在使用运算符运算时,一定要注意不同运算符的优先级不同。如果不能确定计算顺序,最好使用括号,以保证运算结果的正确。
逻辑与运算符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> 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, (0.00 sec)
“AND”运算符可以有多个操作数,需要注意的是:多个操作数运算时,AND两边一定要使用空格隔开,不然会影响结果的正确性。
逻辑或运算符OR或者||表示两个操作数均为非NULL值且任意一个操作数为非零值时,结果为1,否则结果为0;当有一个操作数为NULL,且另一个操作数为非零值时,则结果为1,否则结果为NULL;当两个操作数均为NULL,则所得结果为NULL。
- mysql> SELECT 1 OR -1 OR 0,1 OR 2,1 OR NULL,0 OR NULL,NULL OR NULL;
- +--------------+--------+-----------+-----------+--------------+
- | 1 OR -1 OR 0 | 1 OR 2 | 1 OR NULL | 0 OR NULL | NULL OR NULL |
- +--------------+--------+-----------+-----------+--------------+
- | 1 | 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 (0.00 sec)
逻辑异或运算符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)
a XOR b 的计算等同于(a AND (NOT b))或者((NOT a)AND b)。
位运算符参与运算的操作数按二进制位进行运算,是二进制数上进行计算的运算符.位运算符会先将操作数变成二进制数,然后进行位运算,最后将计算结果从二进制变回十进制数.
运算符号 | 作用 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 取反 |
<< | 左移 |
>> | 右移 |
表4 MySQL中的位运算符
位或运算的实质是将参与运算的几个数据按照对应的二进制数逐位进行逻辑或运算.对应的二进制位有一个或两个为1则该位的运算结果为1,否则为0.
- mysql> SELECT 10 | 15,9 | 4 | 2;
- +---------+-----------+
- | 10 | 15 | 9 | 4 | 2 |
- +---------+-----------+
- | 15 | 15 |
- +---------+-----------+
- 1 row in set (0.00 sec)
位与运算符的实质是将参加运算的几个操作数按照对应的二进制数逐位进行逻辑与运算.对应的二进制位都为1则该位的运算结果为1,否则为0.
- mysql> SELECT 10&15,9&4&2;
- +-------+-------+
- | 10&15 | 9&4&2 |
- +-------+-------+
- | 10 | 0 |
- +-------+-------+
- 1 row in set (0.00 sec)
位异或运算的实质是将参与运算的两个数据按照对应的二进制数逐位进行逻辑异或运算.对应位的二进制数不同时,对应位的结果才为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.00 sec)
位左移运算符<<使指定的二进制值的所有位都左移指定的位数.左移指定位数之后,左边高位的数值将被移出并丢弃,右边低位空出的位置用0补齐.
语法格式:expr<<n.其中,n指定值expr要移位的位数.
- mysql> SELECT 1<<2,4<<2;
- +------+------+
- | 1<<2 | 4<<2 |
- +------+------+
- | 4 | 16 |
- +------+------+
- 1 row in set (0.00 sec)
位右移运算符>>使指定的二进制值的所有位都右移指定的位数.右移指定位数之后,右边低位的数值将被移除并丢弃,左边高位空出的位置用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取反后变为0 0取反后变成1.
- mysql> SELECT 5 & ~1;
- +--------+
- | 5 & ~1 |
- +--------+
- | 4 |
- +--------+
- 1 row in set (0.00 sec)
-
- //可以使用BIN()函数查看1取反后的结果,如下
-
- mysql> SELECT BIN(~1);
- +------------------------------------------------------------------+
- | BIN(~1) |
- +------------------------------------------------------------------+
- | 1111111111111111111111111111111111111111111111111111111111111110 |
- +------------------------------------------------------------------+
- 1 row in set (0.00 sec)
以上是学习过程中自己的总结,如有不妥之处,还望指正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。