运算符连接是对数据进行运算的,可以更加灵活的使用表中的数据,常见的运算符分为:算术运算符、比较运算符、逻辑运算符、位运算符。下面将分别对上述运算符做出讲解和演示:
一、算术运算符
算术运算符有加(+)、减(-)、乘(*)、除(/)、求余(%)。注:优先级乘、除、求余的优先级相同,高于加、减的优先级,加减优先级相同。
例1
计算5+3,5-3,5+3-3,5*3,5/3,5%3,5+6/3,5+2*3,5-7%3,5*3/2,5*3%4;SQL语句:
SELECT 5+3,5-3,5+3-3,5*3,5/3,5%3,5+6/3,5+2*3,5-7%3,5*3/2,5*3%4;
运行上述语句,结果如下:
由上图可以看到加减乘除的计算和优先级均与数学中相同,因此,我不做过多讲解,我只说一下求余,取个例子:65除以8,用取商(/)计算可得到小数8.125;用取余(%)计算便是1,65除以8等于8,余1,取余取的就是这个余数。
二、比较运算符
比较算法符的结果只会是0,1或NULL。通常用于查询满足指定条件的记录,下表为比较运算符汇总表:
运算符 | 解释 |
= | 等于 |
<=> | 安全等于 |
<>或!= | 不等于 |
<= | 小于等于 |
< | 小于 |
>= | 大于等于 |
> | 大于 |
IS NULL | 判断一个值是否为NULL |
IS NOT NULL | 判断一个值是否不为NULL |
LEAST | 在有两个或者多个参数时,返回最小值 |
GREATEST | 在有两个或者多个参数时,返回最大值 |
BETWEEN AND | 判断一个值是否落在两个值之间 |
ISNULL | 与IS NULL作用相同 |
IN | 判断一个值是IN列表中的任意一个值 |
NOT IN | 判断一个值不是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
REGEXP | 正则表达式匹配 |
2.1"="和"<=>"
等于(=)用于判断数字、字符串、表达式是否相等,相等返回1,不相等返回0,有空值时返回空值,SQL语句:
SELECT 2=2,'2'=2,'A'='A',1=0,0.000002=0,2+3=3+2,NULL=NULL;
运行上述语句,结果如下:
由上图可知“=”可以用于数值、字符串、表达式的比较,但是不能比较空值,字符串‘2’和数值2做比较时,MYSQL会将字符串自动转化为数值进行比较,因此,返回值为1。注:若有一个或者两个参数为NULL,则比较运算结果为NULL。
安全等于(<=>)和等于(=)有着相同的比较操作,唯一的不同点在于,安全等于(<=>)可以比较NULL,即当存在参数为NULL时不会返回NULL,只会返回0或者1。SQL语句:
SELECT 2<=>2,'2'<=>2,'A'<=>'A',1<=>0,0.000002<=>0,2+3<=>3+2,NULL<=>NULL,2<=>NULL;
运行上述语句,结果如下:
由上图可知,没有空值(NULL)的比较运算结果均与“=”的运算一致;有空值(NULL)的运算结果也是0或者1,当两个参数均为NULL时返回1,否则返回0。
2.2‘<>’和‘!=’
不等于运算符(‘<>’或'!=')用于判断数值、字符串、表达式是否不相等,不相等返回1,相等返回0,不能用于比较NULL,SQL语句:
SELECT 2<>2,2<>3,'2'<>2,'HELLO'<>'HELLO','HELLO'<>'HELL',2!=2,2!=3,'2'!=2,'HELLO'!='HELLO','HELLO'!='HELL';
运行上述语句,结果如下:
从上图可知,“<>”和“!=”的作用相同,可以用于比较数值、字符串、表达式的比较。
2.3 '<='和'<'
“<=”用于判断左边的操作数是否小于等于右边的操作数,是返回1,否返回0,不能用于空值判断;“<”用于判断左边的操作数是否小于右边的操作数,是返回1,否返回0,不能用于空值判断。SQL语句:
SELECT 'HELLO'<='HELLO','HELLO'<='HALLO',2<='2',2<=1,2.5<=2.8,2+3<=3+3,NULL<=NULL;
SELECT 'HELLO'<'HELLO','HELLO'<'HALLO',2<'2',2<1,2.5<2.8,2+3<3+3,NULL<NULL;
运行上述语句,结果如下:
由上图可知,“<=”和“<”运算符可以用于比较数值、字符串、表达式。
2.4“>=”和“>”
“>=”用于判断左边的操作数是否大于等于右边的操作数,是返回1,否返回0,不能用于空值判断;“>”用于判断左边的操作数是否大于右边的操作数,是返回1,否返回0,不能用于空值判断。SQL语句:
SELECT 'HELLO'>='HELLO','HELLO'>='HALLO',2>='2',2>=1,2.5>=2.8,2+3>=3+3,NULL>=NULL;
SELECT 'HELLO'>'HELLO','HELLO'>'HALLO',2>'2',2>1,2.5>2.8,2+3>3+3,NULL>NULL;
运行上述语句,结果如下:
由上图可知,“>=”和“>”运算符可以用于比较数值、字符串、表达式。
2.5 IS NULL、ISNULL和IS NOT NULL
IS NULL 和ISNULL作用相同,用于判断一个值是否为空值,是返回1,否返回0,不同点在于格式不同(见下SQL语句);IS NOT NULL用于判断一个值是否不为空值,是返回1,否返回0。SQL语句:
SELECT NULL IS NULL,2 IS NULL,ISNULL(NULL),ISNULL(2),NULL IS NOT NULL,2 IS NOT NULL;
运行上述语句,结果如下:
由上图可知IS NULL、ISNULL和IS NOT NULL的作用。
2.6 LEAST和GREATEST
LEAST()用于返回多个参数中的最小值,语法格式:LEAST(value1,value2,...,waluen),其中n表示参数列表中有n个值。GREATEST()用于返回多个参数中的最大值,语法格式:GREATEST(value1,value2...)。注:有任意一个值为NULL,LEAST()和GREATEST()的返回值为NULL。SQL语句:
SELECT LEAST(1,3,5),LEAST('A','C','DV'),LEAST(1,'DF'),LEAST(1,'1'),LEAST(1+2,8),LEAST(NULL,1,'A'),LEAST('1','A');
SELECT LEAST(1,3,5),GREATEST('A','C','DV'),GREATEST(1,'DF'),GREATEST(1,'1'),GREATEST(1+2,8),GREATEST(NULL,1,'A'),GREATEST('1','A');
运行上述语句,结果如下:
由上图可知, 不管参数时一种数据类型还是多种数据类型,LEAST都能返回最小值,GREATEST都能返回最大值,排序顺序:特殊字符小于数值小于字符串字母,字符串按照字母表排序前面的小后面的大。
2.7BETWEEN AND
BETWEEN AND用于判断值是否在范围内,语法:expr BETWEEN min AND max.如果expr在[min,max]内,返回1,否则返回0,SQL语句:
SELECT 2 BETWEEN 2 AND 3,'C' BETWEEN 'A' AND 'B','5' BETWEEN '3' AND 'A',5 BETWEEN 3 AND 'A','SD' BETWEEN 'S' AND 'SDD',2 BETWEEN 3 AND 4;
运行上述语句,结果如下:
由上图可以看到,BETWEEN AND运算符可以判断数值,也可以判断字符串,但是不能判断数值在不在数值和字符串之间,这时的返回值为0。数值和字符串之间不构成范围,因此返回值为0。
2.8IN和NOT IN
IN运算符用于判断操作数是否在列表中,是返回1,否返回0。语法:value IN (value1,value2...)NOT IN用于判断操作数是否不在列表中,是返回1,否返回0,。语法:value NOT IN (value1,value2...),SQL语句:
SELECT 2 IN (2,5,'DF'),2 IN ('2',5,'DF'),'DF' IN (2,'DGG'),'DF' IN (2,'DF');
SELECT 2 NOT IN (2,5,'DF'),2 NOT IN ('2',5,'DF'),'DF' NOT IN (2,'DGG'),'DF' NOT IN (2,'DF');
运行上述语句,结果如下:
从上图可以见到IN和NOT IN 的作用,注:在左边为NULL或者表中找不到匹配项,并且表中有NULL的情况下,IN和NOT IN 的返回值均为NULL。
注:LIKE 和 REGEXP分别为模糊查询和正则表达式,LIKE字符串匹配是较为简单的,REGEXP正则表达式是一个可以进行浮渣查询的强大工作,通配符较多,在这儿我就不做介绍,后续会单独出一篇做介绍。
三、逻辑运算符
在SQL中,所有的逻辑运算的结果均为TRUE、FALSE或NULL。在MYSQL中体现为1(TRUE)、0(FALSE)或NULL,详见下表:
运算符 | 用途 |
NOT或! | 逻辑非 |
AND或&& | 逻辑与 |
OR或|| | 逻辑或 |
XOR | 逻辑异或 |
3.1NOT或者!
NOT或者!称为逻辑非,表示当操作数为0时,返回值为1;当操作数为非零值是,返回值为0;当操作数为NULL时,返回值为NULL。SQL语句:
SELECT NOT 10,NOT -10,NOT (1-1),NOT 1+1,NOT NULL;
SELECT !10,!-10,!(1-1),!1+1,!NULL;
运行上述语句,结果为:
由上图可知,除了第四个不一样外,其余均一致,这是因为NOT的优先级低于+,而!的优先级高于+,因此!1+1相当于(!1)+1,而NOT 1+1 相当于NOT(1+1),因此两者的结果不一致,在使用运算符时,尤其需要注意运算符的优先级,在文章最后我将附上运算符的优先级表。
3.2AND或者&&
AND或者&&称为逻辑与,表示当所有操作数均为非零值并且不为NULL时,返回1,当有一个或者多个操作数为0时,返回结果为0;其余情况均返回NULL。SQL语句为:
SELECT 1 AND 1,1 AND -1,1 AND 0,1 AND NULL,0 AND NULL;
SELECT 1 && 1,1 && -1,1 && 0,1 && NULL,0 && NULL;
运行上述语句,结果为:
由上图可知,“AND”和“&&”作用相同。注:AND运算符可以有多个操作数,但是多个操作数运算时,AND两边一定要使用空格,不然会影响结果的正确性。
3.3OR或者||
OR或者||称为逻辑或,当两个操作数为非NULL,且任意一个为非零时,返回为1,否则返回0;当有一个操作数为NULL,且另一个操作数为非零值,返回1,否则返回NULL;当两个操作数都为NULL时,返回NULL。SQL语句:
SELECT 1 OR 0,1 OR 2,0 OR 0,NULL OR 1,NULL OR 0,NULL OR NULL;
SELECT 1 || 0,1 || 2,0 || 0,NULL || 1,NULL || 0,NULL || NULL;
运行上述语句,结果为:
由上图可知,“OR”和“||”的作用相同。
3.4XOR
XOR称为逻辑异或,表示当任意一个操作数为NUL时,返回NULL;对于非NULL的操作数,如果两个操作数都是非0或者都是0,则返回0;如果一个为0,一个为非0,则返回1。SQL语句:
SELECT 1 XOR 1,1 XOR 0,0 XOR 0,1 XOR NULL,1 XOR 1 XOR 1;
运行上述语句,结果如下:
注:A XOR B相当于(A AND (NOT B)) 。
三、位运算符
位运算符是在二进制数上进行计算的运算符。位运算符会将操作数变成二进制数,然后进行位运算,最后将计算结果从二进制变成十进制数。MYsql中提供的位运算符有位或(|)、位与(&)、位异或(^)、位左移(<<)、位右移(>>)、位取反(~)。
3.1位或(|)
位或运算的实质是将参与运算的操作数按照对应的二进制数逐位进行逻辑或运算。对应的二进制位有一个或者两个为1则该位的运算返回1,否则返回0。SQL语句:
SELECT 15|20,2|4|8;
运行上述语句,结果如下:
由上图可知, 15转化为二进制为1111,20转化为二进制为10100,按位或运算后为11111,转化为十进制为31;2转化为二进制为10,4转化二进制为100,8转化为二进制为1000,进行位或运算得1110,转化为10进制为14。
3.2位与(&)
位与运算的实质是将操作数转化为二进制逐位进行逻辑与运算,对应的二进制位都为1则运算结果返回1,否则返回0,SQL语句:
SELECT 15&20,2&4&8;
运行上述语句,结果如下:
由上图可知, 15转化为二进制为1111,20转化为二进制为10100,按位或运算后为00100,转化为十进制为4;2转化为二进制为10,4转化二进制为100,8转化为二进制为1000,进行位或运算得0000,转化为10进制为0。
3.3位异或(^)
位异或运算的实质是将操作数转化为二进制逐位进行逻辑异或运算,对应的二进制位不同则运算结果返回1,否则返回0,SQL语句:
SELECT 15^20,2^4^8;
运行上述语句,结果如下:
由上图可知, 15转化为二进制为1111,20转化为二进制为10100,按位异或运算后为11011,转化为十进制为27;2转化为二进制为10,4转化二进制为100,8转化为二进制为1000,进行位或运算得1110,转化为10进制为14。
3.4位左移(<<)
位左移运算的实质是将操作数转化为二进制值,所有位都左移制定位数,左边高位的数值将被移出并丢弃,右边低位空出的位置用0补齐。相当于在二进制值后面加0,左移一位加一个0。语法格式:expr<<n,其中n指定expr要位移的位数。SQL语句:
SELECT 15<<2,4<<1;
运行上述语句,结果为:
由上图可知,15的二进制值为1111,位左移2位得111100,转化为十进制为60;4的二进制值为100,位左移1位得1000 ,转化为十进制为8。
3.5位右移
位右移运算的实质是将操作数转化为二进制值,所有位都右移制定位数,右边低位的数值将被移出并丢弃,左边高位空出的位置用0补齐。相当于在二进制值后面从最后删除位,左移一位删除一个位。语法格式:expr>>n,其中n指定expr要位移的位数。SQL语句:
SELECT 15>>2,4>>1;
运行上述语句,结果为:
由上图可知,15的二进制值为1111,位右移2位得11,转化为十进制为3;4的二进制值为100,位右移1位得10 ,转化为十进制为2。
3.6位取反(~)
位取反的运算的实质是将操作数转化为二进制后逐位进行反转,即将1转为0,将0转为1,SQL语句:
SELECT 4&~1;
运行上述语句,结果如下:
由图可知,~的优先级高于&因此上述语句先对1进行位取反再与4进行位与运算,1进行位取反为1110,4转化为二进制为0100,进行位与运算得0100,转化为十进制为4;注:MYSQL经过位运算之后的数值是一个64位的无符号整数,位运算时都是按照64位二进制值进行位运算,使用BIN()函数查看1进行位取反的结果为:
由上图可知位运算的本质,上述4&~1的运算便可明白是怎么计算的了。
四、运算符的优先级
运算符的优先级决定了不同的运算符在表达式中的计算的先后顺序,详见下表(运算符按优先级从低到高排列):
优先级 | 运算符 |
最低 | =(赋值运算),:= |
||,OR | |
XOR | |
&&,AND | |
NOT | |
BETWEEN,CASE,WHEN,THEN,ELSE | |
=(比较运算),<=>,>=,<=,>,<,<>,!=,IS,LIKE,REGEXP.IN | |
| | |
& | |
<<,>> | |
+,- | |
*,/(DIV),%(MOD) | |
^ | |
’-(负号),~(位反转) | |
最高 | ! |
不同运算符的优先级是不同的,一般情况下,级别高的运算符会先进行计算,如果级别相同,按照表达式的顺序从左到右计算,在无法确定优先级的情况下可以用()来改变优先级,并且会使计算过程更加清晰。