我看到了那天的夕阳,美得如此骄艳,我便决定,追寻夕阳,拼尽余生。
上一章简单介绍了 MySQL删除数据(八),如果没有看过,请观看上一章
我们讲过了,插入数据,修改数据和删除数据,你以为该讲查询数据了吗? 怎么可能,查询数据那么麻烦,老蝴蝶才不先讲呢。
这一章讲解一下 MySQL的运算符。
MySQL的运算符,与 Java, C 或者C++一样,也有一些常见的运算符。
MySQL的运算符分类:
- 算术运算符
- 比较运算符
- 逻辑运算符
- 位运算符
相比较 Java, 少了 赋值运算符 和 ?三目运算符, instanceof 运算符等。
仍然使用 yuejl 数据库的 user 表。
一. 算法运算符
一.一 拥有运算符
符号 |
名称 |
例子 |
+ |
加法 |
2+7 |
- |
减法 |
7-2 |
* |
乘法 |
2*7 |
/ |
除法 |
7/2 |
% |
取余(求模) |
7%2 |
结果是一个新的数值。
一.二 举例查询
1 . 可以单独在数据库中查询,不指定表。 也不用像oracle 数据库那样 用 dual 虚拟表。
select 2+7,7-2,2*7,7/2,7%2 ;
2 . 与数据库表里面的 整数型数据进行联合
如, user 表里面的 age 字段。
select age,age+2,age-2,age*2,age/2,age%2 from user;
可以发现, MySQL 会保留四位小数。 如 24/2 时是 12.0000
一.三 除0 和%0 的操作
除数不能为0. 看MySQL 如何处理的
select 2/0,2%0;
两个结果都是0. 但注意,有警告,虽然不报错。
1 row in set, 2 warnings (0.00 sec)
二. 比较运算符
二.一 拥有运算符
符号 |
名称 |
例子 |
> |
大于 |
7>2 |
< |
小于 |
7<2 |
= |
等于 |
2=2 |
<>,!= |
不等于 |
7!=2,7<>2 |
>= |
大于等于 |
7>=2 |
<= |
小于等于 |
7<=2 |
<=> |
安全等于 |
2<=>2 |
is null |
是否是空 |
7 is null |
is not null |
是否不为空 |
7 is not null |
least |
返回最小值 |
least(7,2,5) |
greatest |
返回最大 值 |
greatest(7,2,5) |
between … and … |
是否在两个值之间 |
7 bettween 2 and 10 |
isnull |
是否是空,是一个函数操作符 |
isnull(7) |
in |
在里面 |
7 in (2,7) |
not in |
不在里面 |
7 not in(2,7) |
like |
通配符匹配 |
‘两个蝴蝶飞’ like ‘%蝴蝶%’ |
regexp |
正则匹配 |
123 regexp ‘23’ |
二.二 举例查询
二.二.一 = 号 比较, 返回值为 0(假) 1(真)
select 2=7,2=2,'yuezl'='yuezl','2'=2,(2+7)=(5+4),2=null,null=null;
前两个 2=7,2=2 是普通的数字比较。 第三个 ‘yuezl’=‘yuezl’ 是字符串的比较。
‘2’=2 是字符串与数字的比较, 会先将字符串转换成数字,再进行比较。
(2+7)=(5+4) 是表达式比较,表达式结果相同,为真。
2=null 返回的是null
null=null, 返回的是 null, 当与 null进行比较时,无论是什么,都返回 null.
非数字型字符串也可以与数字进行= 号, 一律返回 假 (0)
select 97='a';
二.二.二 <=> 号比较。 返回值为 0(假) 1(真)
这个叫 安全等, 是对 =的加强版。 加强的是什么呢, 加强的是 null 值。 当左右两个比较值没有一个值为null时,那么 <=> 就等于 ‘=’ 号。 如果有 null值,那么就不一样了。
select 2<=>null,null<=>7,null<=>null;
两个均为null时,不返回 null,而是返回 1(真)。 只有一个为null时,那么返回 0 (假)
二.二.三 < 号 返回值为 0(假) 1(真)
select 2<7,2.500<7,'yuezl'<'abc',null<null;
字符串比较时,按照 ASCII 码进行比较, 与java中的字符串比较一致。
null与null 比较时,返回 null.
非数字型字符串也可以与 数字进行比较, 会先将字符串通过ASCII 码 转换成数字,然后再进行比较。
select 98>'a',98>'abc',95<'a',95<'abc';
但看见没有,有警告。 所以,最好不要这么比较。 接下来,也都正常的进行比较。
二.二.四 > 号。 返回值为 0(假) 1(真)
select 7>2,(3+5)>(2+1),'bc'>'ac',null>null;
二.二.五 <>号|!= 返回值为 0(假) 1(真)
不等于号, 用 <> 或者 != 均可以。 但建议使用 <> 号。
select 7<>2,7!=2,'yuejl'<>'yuejl','yuejl'!='good',(3+4)<>(2+4),null <> null;
二.二.六 <= 小于等于号 返回值为 0(假) 1(真)
select 2<=7,7<=7,8<=7,'yuejl'<='yuejl',null<=null;
二.二.七 >= 大于等于号 返回值 为0 (假) 1(真)
select 2>=7, 7>=7,8>=7,(3+4)>=(2+5),'abc'>='bac',null>=null;
二.二.八 is null | isnull(数字) 是空 返回值 为0 (假) 1(真)
如果是空,返回 1, 如果不是空,则返回0.
select 7 is null,isnull(7),'两个蝴蝶飞' is null, null is null, isnull(null);
通常在筛选表数据时,对空属性值进行判断。 如 筛选 age 为空时的数据, 应该是
select * from user where age is null;
而不是 where age=0;
null 与 0,’’ 是有区别的。
select 0 is null,'' is null;
二.二.九 is not null 不是 空。 返回值 为0 (假) 1(真)
如果是空, 则返回 0, 如果不是空,则返回 1. 与 is null 正好相反。
select 7 is not null, '两个蝴蝶飞' is not null, null is not null;
也通常是用在筛选表格数据时,对属性值不为空的进行判断。
0 并不是 null,’’ 空字符串也不是null.
select 0 is not null,'' is not null;
二.二.十 between … and… 在…和…之间 返回值 为0 (假) 1(真)
包括两边的值。 [开始值,结束值] 是一个闭区间,相当于 属性值>=开始值 and 属性值<=结束值。
select 2 between 1 and 7, 2 between 2 and 7,7 between 2 and 7,10 between 2 and 7;
也有 字母之间的 between … and …形式,转换成 ASCII 码进行比较。
select 'b' between 'a' and 'c', 'f' between 'b' and 'd','c' between 'ab' and 'ef','cd' between 'ad' and 'de';
与字符串之间的比较是一致的。 先比较第一个,如果第一个一样,才比较第二个字母。 第一个字母不一样,就不比较了,直接出来相应的结果。
二.二.十.一 least(n1,n2,n3…) 返回最小值,是 least集合里面的数值
select least(1,2,3),least(100,101,102),least('b','a','c'),least(3,6,null);
least,如果集合里面有一个null值,就返回null.
二.二.十.二 greatest(n1,n2,n3…) 返回 最大值,是 greatest集合里面的数值
select greatest(2,5,7),greatest('a','b','c'),greatest(3,6,null);
greatest, 如果集合里面有一个 null值,就返回 null.
二.二.十.三 in(集合) 在集合里面 返回值 为0 (假) 1(真)
select 8 in (2,3,8),10 in(2,4,6),'ab' in ('ac','ab','dc');
关于 null 值的情况。
select null in (2,5,6),null in (2,5,null), 8 in(3,5,6),8 in (3,5,null),8 in(3,8,null);
显示null 值有两种情况:
- 左侧的比较值是null. 无论是否存在集合里面。
- 左侧的比较值不是null, 如果集合里面没有这个匹配项,并且有一个表达式为null
二.二.十.四 not in (集合) 不在集合里面 返回值 为0 (假) 1(真)
与 in (集合) 正好相反
select 7 not in (2,5,6) ,7 not in (2,5,7), 'ab' not in ('ac','aa','bc');
关于null 的情况。
select null not in (2,5,6),null not in (2,5,null), 8 not in(3,5,6),8 not in (3,5,null),8 not in(3,8,null);
显示 null的值 与 in 相同。
二.二.十.五 like 匹配通配符 返回值 为0 (假) 1(真)
通配符有两种:
1 .% 任意长度的任意字符,包括0长度的字符。
2 . _ 任意的单个字符。 长度只能是1.
select '两个蝴蝶飞' like '%蝴蝶%','两个蝴蝶飞' like '_个蝴蝶飞','两个蝴蝶飞' like '%老蝴蝶%';
如果想找不匹配的, 用 note like
select '两个蝴蝶飞' not like '%蝴蝶%','两个蝴蝶飞' not like '_个蝴蝶飞','两个蝴蝶飞' not like '%老蝴蝶%';
二.二.十.六 regexp 正则表达式匹配 返回值 为0 (假) 1(真)
关于正则表达式,这儿就不讲解了。 以后会有专门的一系列去讲解正则表达式。
select 123456 regexp '^12','两个蝴蝶飞' regexp '蝴蝶飞$','abcd132' regexp 'cd13','abcd' regexp 'cde';
用 regexp 与 like 基本是相同的。
如上面的那些语句,是可以等价于 like 的。
123456 regexp ‘^12’ 等价于 123456 like ‘12%’
‘两个蝴蝶飞’ regexp ‘蝴蝶飞$’ 等价于 ‘两个蝴蝶飞’ like ‘%蝴蝶飞’
‘abcd132’ regexp ‘cd13’ 等价于 ‘abcd132’ like ‘%cd13%’;
也有不匹配的, 用 not regexp
select 123456 not regexp '^12','两个蝴蝶飞' not regexp '蝴蝶飞$',
'abcd132' not regexp 'cd13','abcd' not regexp 'cde';
推荐MySQL最好使用 regexp. 但实际生活中, like 用得比较多。
除了 least() 和greatest() 之外,其他比较运算符 返回的值 都是 0 (假) 1(真).
三. 逻辑运算符
三.一 拥有的运算符
符号 |
名称 |
例子 |
Not 或者! |
非 |
not 2 或者!2 |
and 或者 && |
与 |
1 and 2, 1&&2 |
or 或者 || |
或 |
1 or 2 或者1||2 |
xor |
异或 |
1 xor 0 |
在MySQL数据库里面, 1 代表着真,0代表着假, 非 0 代表着 真。
三.二 not 或者! 非
select not 8, not 0, !5,!0;
真为假, 假为真。
三.二 and 或者 && 与
select 3 and 2, 5 and 0,0 and 5, 0 and 0;
两个同时为真,才为真。
三.三 or 或者 || 或
select 3 or 2, 5 or 0,0 or 5, 0 or 0;
两个只要有一个为真,就为真。
三.四 xor 异或
select 1 xor 0, 1 xor 1, 0 xor 0, 0 xor 1;
两个数 相同为假,不同为真。 相同指的是在逻辑上相同。 1与2 都是真,是相同的。
四. 位运算符
四.一 拥有的运算符
符号 |
名称 |
例子 |
~ |
按位取反 |
~3 |
& |
按位取与 |
3&5 |
| |
按位取或 |
3|5 |
<< |
左移 |
3<<2 |
>> |
右移 |
5>>2 |
3 表示成二进制就是
00000000 00000000 00000000 00000011
5 表示成二进制就是
00000000 00000000 00000000 00000101
四.二 ~ 取反
select ~3;
00000000 00000000 00000000 00000011 =3
11111111 11111111 11111111 11111100 =18446744073709551612
其中, bin() 方法是查询 该数的二进制数。 如果前面为0,就省略。
四.三 & 取与
select 3&5;
00000000 00000000 00000000 00000011= 3
& 00000000 00000000 00000000 00000101=5
00000000 00000000 00000000 00000001=1
四.四 | 取或
select 3|5;
00000000 00000000 00000000 00000011= 3
| 00000000 00000000 00000000 00000101=5
00000000 00000000 00000000 00000111=7
四.五 << 左移
相当于 数字* 2^n;
select 3<<2;
00000000 00000000 00000000 00000011= 3
<<2 00000000 00000000 00000000 00000011
00000000 00000000 00000000 0001100=12
四.六 >> 右移
相当于 数字/2^n;
select 5>>2;
00000000 00000000 00000000 00000101=5
>>2 00000000 00000000 00000000 000001 01
00000000 00000000 00000000 000001=1
位操作与 java中的位操作是一样。
五. 运算符的优先级
优先级 |
运算符 |
1 |
() |
2 |
!(非) |
3 |
-负号) ,~ (位反转) |
4 |
^ (异或) |
5 |
*(乘),/(除),%(取余) |
6 |
+(加),-(减) |
7 |
<< (左移),>>(右移) |
8 |
&(按位与) |
9 |
|(按位或) |
10 |
=(比较运算),<=>,>=,>,<=,<,<>,!=,IS,Like, Regexp,In |
11 |
between, case,when,then,else |
12 |
not |
13 |
&&,And |
14 |
XOR |
15 |
||,OR |
16 |
= |
谢谢!!!