MySQL学习之路5(2)

常见运算符介绍

MySQL的内部运算主要有四大类:
算术运算符、比较运算符、逻辑运算符、位操作运算符。
1.算术运算符
MySQL中的算术运算符

运算符 作用
+ 加法运算
- 减法运算
* 乘法运算
/ 除法运算,返回商
% 求余运算,返回余数
例:创建表tmp14,定义数据类型为INT的字段num,插入值64,对num值进行算术运算:
mysql> CREATE TABLE tmp14(num INT);
Query OK, 0 rows affected (1.26 sec)

mysql> INSERT INTO tmp14 value(64);
Query OK, 1 row affected (0.36 sec)

mysql> SELECT num,num+10,num-3+5,num+36.5 FROM tmp14;
+------+--------+---------+----------+
| num  | num+10 | num-3+5 | num+36.5 |
+------+--------+---------+----------+
|   64 |     74 |      66 |    100.5 |
+------+--------+---------+----------+
1 row in set (0.24 sec)

例:对tmp14中的num进行乘法除法运算:

mysql> SELECT num,num*2,num/2,num/3,num%3 FROM tmp14;
+------+-------+---------+---------+-------+
| num  | num*2 | num/2   | num/3   | num%3 |
+------+-------+---------+---------+-------+
|   64 |   128 | 32.0000 | 21.3333 |     1 |
+------+-------+---------+---------+-------+
1 row in set (0.00 sec)

例:用0除num。

mysql> SELECT num,num/0,num%0 FROM tmp14;
+------+-------+-------+
| num  | num/0 | num%0 |
+------+-------+-------+
|   64 |  NULL |  NULL |
+------+-------+-------+
1 row in set, 2 warnings (0.07 sec)

结果为NULL.

2.比较运算符
2.1等于运算符 =
“=”顾名思义,用来判断两东西是否相等(数字、字符串、表达式)。
例:使用‘=’来进行相等判断:

mysql> SELECT 1=0,'2'=2,2=2,'0.02'=0,'B'='B',(1+3)=2+2,NULL=NULL;
+-----+-------+-----+----------+---------+-----------+-----------+
| 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.29 sec)

数值比较有如下规则:
(1)若有一个或两个参数为NULL,则比较运算的结果为NULL。
(2)若同一个比较运算中的两个参数都是字符串,则按照则按照字符串进行比较。
(3)若两个参数均为整数,则按照整数进行比较。
(4)若一个字符串和数字进行相等判断,则MySQL可以自动将字符串转换为数字。

2.2安全等于运算符<=>
此操作符与=操作符执行相同的比较,只是多了一个NULL的判断。
例:使用<=>进行相等的判断:

mysql> SELECT 1<=>0,'2'<=>2,2<=>2,'0.02'<=>0,'B'<=>'B',(1+3)<=>(2+1),NULL<=>NULL;
+-------+---------+-------+------------+-----------+---------------+-------------+
| 1<=>0 | '2'<=>2 | 2<=>2 | '0.02'<=>0 | 'B'<=>'B' | (1+3)<=>(2+1) | NULL<=>NULL |
+-------+---------+-------+------------+-----------+---------------+-------------+
|     0 |       1 |     1 |          0 |         1 |             0 |           1 |
+-------+---------+-------+------------+-----------+---------------+-------------+
1 row in set (0.10 sec)

2.3不等于运算符<>或!=
这两个运算符不能判断NULL,如果不相等返回1,相等返回0。
例:使用<>和!=进行不相等判断:

mysql> SELECT 'good'<>'god',1<>2,5.5!=5,(1+3)!=(1+2),NULL<>NULL,NULL!=NULL;
+---------------+------+--------+--------------+------------+------------+
| 'good'<>'god' | 1<>2 | 5.5!=5 | (1+3)!=(1+2) | NULL<>NULL | NULL!=NULL |
+---------------+------+--------+--------------+------------+------------+
|             1 |    1 |      1 |            1 |       NULL |       NULL |
+---------------+------+--------+--------------+------------+------------+
1 row in set (0.05 sec)

2.4小于或等于运算符<=

mysql> SELECT 'GOOD'<='GOD',1<=2,4<=4,4<='5',(1+3)<=(2+1),NULL<=NULL;
+---------------+------+------+--------+--------------+------------+
| 'GOOD'<='GOD' | 1<=2 | 4<=4 | 4<='5' | (1+3)<=(2+1) | NULL<=NULL |
+---------------+------+------+--------+--------------+------------+
|             0 |    1 |    1 |      1 |            0 |       NULL |
+---------------+------+------+--------+--------------+------------+
1 row in set (0.16 sec)

2.5小于运算符<

mysql> SELECT 'GOOD'<'GOD',1<2,4<4,4<'5',(1+3)<(2+1),NULL<NULL;
+--------------+-----+-----+-------+-------------+-----------+
| 'GOOD'<'GOD' | 1<2 | 4<4 | 4<'5' | (1+3)<(2+1) | NULL<NULL |
+--------------+-----+-----+-------+-------------+-----------+
|            0 |   1 |   0 |     1 |           0 |      NULL |
+--------------+-----+-----+-------+-------------+-----------+
1 row in set (0.81 sec)

2.6 大于等于运算符>=

mysql> SELECT 1>=0,'2'>=2,2>=2,'0.02'>=0,'B'>='B',(1+3)>=2+2,NULL>=NULL;
+------+--------+------+-----------+----------+------------+------------+
| 1>=0 | '2'>=2 | 2>=2 | '0.02'>=0 | 'B'>='B' | (1+3)>=2+2 | NULL>=NULL |
+------+--------+------+-----------+----------+------------+------------+
|    1 |      1 |    1 |         1 |        1 |          1 |       NULL |
+------+--------+------+-----------+----------+------------+------------+
1 row in set (0.00 sec)

2.7大于符号>

mysql> SELECT 1>0,'2'>2,2>2,'0.02'>0,'B'>'B',(1+3)>2+2,NULL>NULL;
+-----+-------+-----+----------+---------+-----------+-----------+
| 1>0 | '2'>2 | 2>2 | '0.02'>0 | 'B'>'B' | (1+3)>2+2 | NULL>NULL |
+-----+-------+-----+----------+---------+-----------+-----------+
|   1 |     0 |   0 |        1 |       0 |         0 |      NULL |
+-----+-------+-----+----------+---------+-----------+-----------+
1 row in set (0.00 sec)

2.8 IS NULL(SNULL),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.96 sec)

2.9BETWEEN AND 运算符

mysql> SELECT 4 BETWEEN 4 AND 6,4 BETWEEN 2 AND 5,12 BETWEEN 9 AND 10;
+-------------------+-------------------+---------------------+
| 4 BETWEEN 4 AND 6 | 4 BETWEEN 2 AND 5 | 12 BETWEEN 9 AND 10 |
+-------------------+-------------------+---------------------+
|                 1 |                 1 |                   0 |
+-------------------+-------------------+---------------------+
1 row in set (0.03 sec)

mysql> SELECT 'X' BETWEEN 'F' AND 'G','b' BETWEEN 'a' AND 'b';
+-------------------------+-------------------------+
| 'X' BETWEEN 'F' AND 'G' | 'b' BETWEEN 'a' AND 'b' |
+-------------------------+-------------------------+
|                       0 |                       1 |
+-------------------------+-------------------------+
1 row in set (0.00 sec)

2.10 LEAST运算符
返回最小值。

mysql> SELECT LEAST(2,1),least(20.0,3.0,100.5),least('a','b','c'),least(10,null),least(2,2.0);
+------------+-----------------------+--------------------+----------------+--------------+
| LEAST(2,1) | least(20.0,3.0,100.5) | least('a','b','c') | least(10,null) | least(2,2.0) |
+------------+-----------------------+--------------------+----------------+--------------+
|          1 |                   3.0 | a                  |           NULL |          2.0 |
+------------+-----------------------+--------------------+----------------+--------------+
1 row in set (0.25 sec)

mysql> select least(2.00,2.0),least(3.0,2);
+-----------------+--------------+
| least(2.00,2.0) | least(3.0,2) |
+-----------------+--------------+
|            2.00 |          2.0 |
+-----------------+--------------+
1 row in set (0.00 sec)

2.11 GREATEST(value 1,value 2)

mysql> SELECT GREATEST(2,1),GREATEST(20.0,3.0),GREATEST('A','B','C'),GREATEST(10,NULL);
+---------------+--------------------+-----------------------+-------------------+
| GREATEST(2,1) | GREATEST(20.0,3.0) | GREATEST('A','B','C') | GREATEST(10,NULL) |
+---------------+--------------------+-----------------------+-------------------+
|             2 |               20.0 | C                     |              NULL |
+---------------+--------------------+-----------------------+-------------------+
1 row in set (0.02 sec)

2.12 IN、NOT IN运算符

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.04 sec)

在左侧表达式为NULL的情况下,或表中找不到匹配项并且表中一个表达式为NULL的情况下,IN的返回值均为NULL。

2.13 LIKE)(模糊查询)
LIKE运算符用来匹配字符,可以使用下面两种通配符:
(1)‘%’,匹配任何数目的字符,甚至包括零字符。
(2)‘_’,只能匹配一个字符。
例:使用运算符LIKE进行字符串匹配运算,SQL语句如下:

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.12 sec)

当使用使用数据表做统计或者管理时常用到类似如下语句:

SELECT name FROM WHERE name LIKE '%小%';
SELECT name FROM WHERE phone LIKE '139_ _ _ _ _ _ 89';

这总做法可加快我们匹配到所需的事物。

2.14 REGEXP(正则表达式)
REGEXP用来匹配字符串,REGEXP运算符在进行匹配时,常用的有下面几种通配符:
(1)‘^’ 匹配以 ^后面的字符开头的字符串。 ^a:以a开头
(2)‘$ ’ 匹配以 $ 后面的字符结尾的字符串。 a$:以a结尾
(3)‘.’ 匹配任何一个单字符。 .+字符串,以.后面的字符串结尾
(4)‘[…]’匹配在方括号内的任何字符。 [abc]匹配a、b或c。为了命名字符的 范围,使用‘-’。“[a-z]”匹配任何字母,“[1-9]”匹配任何数字。
(5)‘ *’匹配零个或多个在它前面的字符。 “x * ”匹配任何数量的‘x’字符,“. *”匹配任何数量的任何字符。
例:使用REGEXP进行字符串匹配运算,SQL语句如下:

mysql> SELECT 'sssky' REGEXP '^s','ssky' REGEXP 'y$','ssky' REGEXP '.sky','ssky' REGEXP '[ab]';
+---------------------+--------------------+----------------------+----------------------+
| 'sssky' REGEXP '^s' | 'ssky' REGEXP 'y$' | 'ssky' REGEXP '.sky' | 'ssky' REGEXP '[ab]' |
+---------------------+--------------------+----------------------+----------------------+
|                   1 |                  1 |                    1 |                    0 |
+---------------------+--------------------+----------------------+----------------------+
1 row in set (0.81 sec)

3.逻辑运算符
在SQL中,逻辑运算符的求值所得结果均为TRUE(1)、FALSE(0)或NULL。
3.1 NOT 或者!(逻辑非)
当操作数为0时,得1;操作数非0时,得0;操作数为NULL时,返回NULL。
例:分别使用非运算符“NOT”和“!”进行逻辑判断,SQL语句如下:

mysql> SELECT NOT 10,NOT (1-1),NOT NULL,NOT 1+1;
+--------+-----------+----------+---------+
| NOT 10 | NOT (1-1) | NOT NULL | NOT 1+1 |
+--------+-----------+----------+---------+
|      0 |         1 |     NULL |       0 |
+--------+-----------+----------+---------+
1 row in set (0.03 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.11 sec)

! 1+1之所以为1是因为!的优先级高于+,因此计算步骤为(!1)+1=0+1=1。

3.2 AND 或者 &&(逻辑与运算符)
逻辑与运算符表示当所有操作数均为非零值、并且不为NULL时,结果为1。
例:分别使用“AND”和“&&”进行逻辑判断,SQL语句如下:

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.02 sec)

注意:当一个或多个操作数为0时,返回0!

mysql> SELECT 1&&-1,1 && 0 ,1&&NULL,0 AND NULL;
+-------+--------+---------+------------+
| 1&&-1 | 1 && 0 | 1&&NULL | 0 AND NULL |
+-------+--------+---------+------------+
|     1 |      0 |    NULL |          0 |
+-------+--------+---------+------------+
1 row in set (0.00 sec)

提示:AND 两边一定要用空格隔开,&&不需要空格,但是可以使用。

3.3 OR 或者 ||(逻辑或运算符)
表示当两个操作数均为非NULL值,且任意一个操作数非0时,结果为1,否则结果为0;当一个为NULL,另一个非零时,结果为1,否则结果为NULL;当两个操作数均为NULL时,所得结果为NULL。
例:分别使用运算符“OR”和“||”进行逻辑判断, SQL语句如下:

mysql> SELECT 1 OR -1,1 OR 2,1 OR NULL,0 OR NULL,NULL OR NULL;
+---------+--------+-----------+-----------+--------------+
| 1 OR -1 | 1 OR 2 | 1 OR NULL | 0 OR NULL | NULL OR NULL |
+---------+--------+-----------+-----------+--------------+
|       1 |      1 |         1 |      NULL |         NULL |
+---------+--------+-----------+-----------+--------------+
1 row in set (0.01 sec)

mysql> SELECT 1 || -1,1 || 2,1 || NULL,0 || NULL,NULL || NULL;
+---------+--------+-----------+-----------+--------------+
| 1 || -1 | 1 || 2 | 1 || NULL | 0 || NULL | NULL || NULL |
+---------+--------+-----------+-----------+--------------+
|       1 |      1 |         1 |      NULL |         NULL |
+---------+--------+-----------+-----------+--------------+
1 row in set (0.00 sec)

练习:

mysql> SELECT TRUE AND (NOT (FALSE OR (NULL AND FALSE)));
+--------------------------------------------+
| TRUE AND (NOT (FALSE OR (NULL AND FALSE))) |
+--------------------------------------------+
|                                          1 |
+--------------------------------------------+
1 row in set (0.02 sec)

这里原理是这样的min{ 1 , (1 - max {0 , min {1/2 , 0 } } ) }

3.4 XOR(逻辑异或运算符)
当任意一个操作数为NULL时,返回值为NULL;对于非NULL的操作数,如果两个操作数都是非零或者都是零,则返回0;如果一个为零,另一个非零,返回结果为1。
例:使用异或运算符“XOR”进行逻辑判断,SQL语句如下:

mysql> SELECT  1 XOR 1,0 XOR 0, 1 XOR 0, 1 XOR NULL,0 XOR NULL,1 XOR 1 XOR 1;
+---------+---------+---------+------------+------------+---------------+
| 1 XOR 1 | 0 XOR 0 | 1 XOR 0 | 1 XOR NULL | 0 XOR NULL | 1 XOR 1 XOR 1 |
+---------+---------+---------+------------+------------+---------------+
|       0 |       0 |       1 |       NULL |       NULL |             1 |
+---------+---------+---------+------------+------------+---------------+
1 row in set (0.10 sec)

提示:a XOR b =(a AND (NOT b))=((NOT a)AND b)
实例:

mysql> SELECT 1 XOR 3,(1 AND (NOT 3)),((NOT 1) AND 3);
+---------+-----------------+-----------------+
| 1 XOR 3 | (1 AND (NOT 3)) | ((NOT 1) AND 3) |
+---------+-----------------+-----------------+
|       0 |               0 |               0 |
+---------+-----------------+-----------------+
1 row in set (0.00 sec)

4. 位运算符
位运算符是用来对二进制字节中的位进行测试、移位或者测试处理。

4.1 位或运算符 |

位或运算符的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑或运算。对应的二进制位有一个或两个为1则该位的运算结果为1,否则为0。
例:使用位或运算符进行运算,SQL语句如下:

mysql> SELECT 10|15,9|4|2;
+-------+-------+
| 10|15 | 9|4|2 |
+-------+-------+
|    15 |    15 |
+-------+-------+
1 row in set (0.10 sec)

10的二进制值:1010
15的二进制值:1111
9的二进制值:1001
4的二进制值:0100
2的二进制值:0010
按位或运算后均为1111。即15,其结果为一个64位无符号整数。

4.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)

4.3 位异或运算符 ^
对应位的二进制不同结果为1,相同为0。
例:使用位异或运算符进行运算:

mysql> SELECT 10^15,9^4^2,1^0,1^1;
+-------+-------+-----+-----+
| 10^15 | 9^4^2 | 1^0 | 1^1 |
+-------+-------+-----+-----+
|     5 |    15 |   1 |   0 |
+-------+-------+-----+-----+
1 row in set (0.11 sec)

4.4 位左移运算符 <<
使指定的二进制值的所有位都左移指定的位数。左移指定位数之后,左边高位的数值将被移出并丢弃,右边低位空出的位置补零。
例:使用位左移运算符进行运算,SQL语句如下:

mysql> SELECT 1<<2,4<<2;
+------+------+
| 1<<2 | 4<<2 |
+------+------+
|    4 |   16 |
+------+------+
1 row in set (0.00 sec)

1的二进制值:0000 0001 左移两位后变成0000 0100,即十进制整数4;
十进制4左移两位后变成0001 0000,即变成十进制整数16。

4.5 位右移运算符 >>
与位左移运算符类似。右移指定位数之后,右边低位的数值将被移出并丢弃,左边高位空出来的位置用0补齐。

例:使用位右移运算符进行运算:

mysql> SELECT 1>>1,16>>2;
+------+-------+
| 1>>1 | 16>>2 |
+------+-------+
|    0 |     4 |
+------+-------+
1 row in set (0.00 sec)

4.6 位取反运算符 ~
按对应的二进制数逐位反转,1->0,0->1。
例:使用位取反运算符进行运算:

mysql> SELECT 5&~1;
+------+
| 5&~1 |
+------+
|    4 |
+------+
1 row in set (0.00 sec)

1:0001
~1:1110
5:0101
0101&1110=0100->4

可以使用BIN()查看取反之后的结果:

mysql> SELECT BIN(~1);
+------------------------------------------------------------------+
| BIN(~1)                                                          |
+------------------------------------------------------------------+
| 1111111111111111111111111111111111111111111111111111111111111110 |
+------------------------------------------------------------------+
1 row in set (0.10 sec)

mysql> SELECT BIN(~5);
+------------------------------------------------------------------+
| BIN(~5)                                                          |
+------------------------------------------------------------------+
| 1111111111111111111111111111111111111111111111111111111111111010 |
+------------------------------------------------------------------+
1 row in set (0.00 sec)

5.运算符的优先级
这里不作说明。

猜你喜欢

转载自blog.csdn.net/weixin_43037507/article/details/84979474