本章目录
一.mysql高级语句分类
1.1 运算符
简介:MySQL 的运算符用于对记录中的字段值进行运算。MySQL 的运算符共有四种,
分别是:算术运算符、比较运算符、逻辑运算符和位运算符。
1.1.1 算术运算符
运算符 描述
- 加法
- 减法
- 乘法
- / 除法
- % 取余数
语句演示:select 1+2 as addition, 2-1 as subtraction, 2*3 as multiplication, 4/2 as division, 7%2 as remainder;
- 注意事项:
在除法运算和求余数运算中,除数不能为 0,若除数是 0,返回的结果则为 NULL。需要注意的是,
如果有多个运算符,按照先乘除后加减的优先级进行运算,相同优先级的运算 符没有先后顺序。
在 MySQL 的字段值内还有一种情况:某些字符串类型的字段存储的数字型字符串,这些字段在进行算术运算时将会被自动转换为数字的值。
如果字符串的开始部分是数字,在转 换时将被转换为这个数字。如果是既包含字符又包含数字得的混合字符串,
无法转换为数字时,将被转换为 0。
1.1.2 比较运算符
简介:比较运算符是查询数据记录时经常使用的一类运算符。通过使用比较运算符可以判断出
表中有哪些记录是符合条件的,如果比较的结果为真则返回 1,如果为假则返回 0,
比较的结果如果不确定则返回 NULL。其中字符串在进行比较的时候默认是不区分大小写的,
如果要区分大小写可以通过 binary 关键字来实现
- 常用的比较运算符
1.1.2.1等于运算符
含义:等号(=)是用来判断数字、字符串和表达式是否相等的,如果相等则返回1,如果不相等则返回0。
如果比较的两者有一个值是 NULL,则比较的结果就是 NULL。其中字符的比较是根据 ASCII 码来判断的,
如果 ASCII 码相等,则表示两个字符相同;如果ASCII码不相等,则表示两个字符不相同。
语句演示:select 2=4,2=‘2’,‘e’=‘e’,(2+2)=(3+1),‘r’=NULL;
从以上查询可以看出来:
如果两者都是整数,则按照整数值进行比较。
如果一个整数一个字符串,则会自动将字符串转换为数字,再进行比较。
如果两者都是字符串,则按照字符串进行比较。
如果两者中至少有一个值是 NULL,则比较的结果是 NULL。
1.1.2.2 不等于运算符
含义:不等于号有两种写法,分别是<>或者!=,用于针对数字、字符串和表达式不相等的比较。
如果不相等则返回 1,如果相等则返回 0,这点正好跟等于的返回值相反。需要注意的是不等于运算符不能用于判断 NULL。
语句演示:SELECT ‘kgc’<>‘bdqn’, 1<>2, 3!=3, 2.5!=2, NULL<>NULL ;
1.1.2.3 大于、大于等于、小于、小于等于运算符
- 大于(>)运算符用来判断左侧的操作数是否大于右侧的操作数,若大于返回 1,否则返回 0,同样不能用于判断 NULL。
- 小于(<)运算符用来判断左侧的操作数是否小于右侧的操作数,若小于返回 1,否则返回 0,同样不能用于判断 NULL。
- 大于等于(>=)判断左侧的操作数是否大于等于右侧的操作数,若大于等于返回 1,否则返回 0,不能用于判断 NULL。
- 小于等于(<=)判断左侧的操作数是否小于等于右侧的操作数,若小于等于返回 1,否则返回 0,不能用于判断 NULL。
语句演示:select 5>4,‘a’>‘b’,2>=3,(2+3)>=(1+2),4.4<3,1<2,‘x’<=‘y’,5<=5.5,‘u’>=NULL;
1.1.2.4 IS NULL、IS NOT NULL
含义:IS NULL 判断一个值是否为 NULL,如果为 NULL 返回 1,否则返回 0。
IS NOT NULL 判断一个值是否不为 NULL,如果不为 NULL 返回 1,否则返回 0。
语句演示:select 2 IS NULL,‘f’ IS NOT NULL,NULL IS NULL;
注意:
IS NULL 和 IS NOT NULL 一个判断为空,另一个判断不为空,只是有无 NOT 这个关键字的区别,同时返回值不同。
1.1.2.5 BETWEEN AND
含义:BETWEEN AND 比较运算通常用于判断一个值是否落在某两个值之间。
语句演示:select 4 BETWEEN 2 AND 6,5 BETWEEN 6 AND 8,‘c’ BETWEEN ‘a’ AND ‘f’;
1.1.2.6 LEAST、GREATEST
含义:LEAST:当有两个或者多个参数时,返回其中的最小值。如果其中一个值为 NULL,则返回结果就为 NULL。
GREATEST:当有两个或者多个参数时,返回其中的最大值。如果其中一个值为 NULL, 则返回结果就为 NULL。
语句演示:SELECT least(1,2,3),least(‘a’,‘b’,‘c’),greatest(1,2,3),greatest(‘a’,‘b’,‘c’);
从以上结果可以看出,LEAST 比较的参数为数字时,返回的是其中最小的值;当比较的参数为字符串时,
返回字母表中顺序最靠前的字符。GREATEST 比较的参数为数字时, 返回的是其中最大的值;
当比较的参数为字符串时,返回字母表中顺序最靠后的字符。
1.1.2.7 IN、NOT IN
- IN 判断一个值是否在对应的列表中,如果是返回 1,否则返回 0。
- NOT IN 判断一个值是否不在对应的列表中,如果不是返回 1,否则返回 0。
语句演示: SELECT 2 in (1,2,3,4,5),‘c’ not in (‘a’,‘b’,‘c’);
从以上结果可以看出,IN 和 NOT IN 的返回值正好相反。
1.1.2.8 LIKE、NOT LIKE
含义:LIKE 用来匹配字符串,如果匹配成功则返回 1,反之返回 0。LIKE 支持两种通配符:’%’ 用于匹配任意数目的字符,
而’_’只能匹配一个字符。NOT LIKE 正好跟 LIKE 相反,如果没有匹配成功则返回 1,反之返回 0。
语句演示:SELECT ‘bdqn’ LIKE ‘bdq_’,‘kgc’ LIKE ‘%c’,‘etc’ NOT LIKE ‘%th’;
1.1.3 逻辑运算符
简介:逻辑运算符又被称为布尔运算符,通常用来判断表达式的真假,如果为真返回 1,否则返回 0,
真和假也可以用 TRUE 和 FALSE 表示。MySQL 中支持使用的逻辑运算符有四种,
、
运算符 描述
NOT 或 ! 逻辑非
AND 或 && 逻辑与
OR 或 || 逻辑或
XOR 逻辑异或
1.1.3.1 逻辑非
含义:逻辑非使用 NOT 或!表示。逻辑非将跟在它后面的逻辑测试取反,
把真变为假,把假变为真。如果 NOT 后面的操作数为 0 时,所得值为 1;如果操作数为非 0 时,所得值为 0;
如果操作数为 NULL 时,所得值为 NULL。
语句演示:SELECT not 2,!3,not 0,!(4-4);
1.1.3.2 逻辑与
含义:逻辑与通常用于判断两个值或多个值的有效性,如果所有值都是真返回 1,否则返回 0
逻辑与使用 AND 或者&&表示。
语句演示:SELECT 2 AND 3,4 && 0,0 && NULL,1 AND NULL;
1.1.3.3 逻辑或
含义:逻辑或表示包含的操作数,任意一个为非零值并且不是 NULL 值时,返回 1,否则返回0。
逻辑或通常使用 OR 或者||来表示。
语句演示:SELECT 2 OR 3,4 || 0,0 OR NULL,1 || NULL;
1.1.3.4 逻辑异或
含义:两个非 NULL 值的操作数,如果两者都是 0 或者都是非 0,则返回 0;如果一个为 0, 另一个为非 0,则返回结果为 1;
当任意一个值为 NULL 时,返回值为 NULL。
语句演示:SELECT 2 XOR 3,0 XOR 0,0 XOR 5,1 XOR NULL,NULL XOR NULL;
1.1.4 位运算符
简介:位运算符实际上是对二进制数进行计算的运算符。MySQL 内位运算会先将操作数变成二进制格式,然后进行位运算,
最后在将计算结果从二进制变回到十进制格式,方便用户查看。MySQL 支持 6 种位运算符
运算符 描述
& 按位与
| 按位或
~ 按位取反
^ 按位异或
<< 按位左移 >> 按右左移
语句演示:SELECT 10 & 15, 10 | 15, 10 ^ 15, 5 &~1;
那么上图这个结果是怎么得出来的呢?
我们一一分析一下:
10 转换为二进制数是 1010, 15 转换为二进制数是 1111。
- 按位与运算(&),是对应的二进制位都是 1 的,它们的运算结果为 1,否则为 0,所以 10 & 15 的结果为 10。
- 按位或运算(|),是对应的二进制位有一个或两个为 1 的,运算结果为 1,否则为 0, 所以 10 | 15 的结果为 15。
- 按位取反(~),是对应的二进制数逐位反转,即 1 取反后变为 0, 0 取反后变为 1。数字 1 的二进制是 0001,取反后变为
1110, 数字 5 的二进制是 0101,将 1110 和 0101进行求与操作,其结果是二进制的 0100,转换为十进制就是 4。
再举一个按位左移和按位右移的例子:
语句演示:SELECT 1<<2, 2<<2,10>>2,15>>2;
分析一下:
左移或右移运算符,都是将数转换为二进制后,然后在左移或右移指定的位数,超出的位数将被移除并丢弃,空出来的位置用 0 补齐。
- 例如,“2<<2”将数字 2 的二进制数 0010, 向左移动两位后变成 10,右侧用 00 补齐,最终变为二进制的
1000,转换为十进制是 8。 - “15>>2”将数字 15 转换为二进制是 1111,向右移动两位,右侧的两位 11 被丢弃,变为 11, 左侧用 00
补齐,最终变为二进制的 0011,转换为十进制就是 3。