运算符

算数运算符

运算符名称作用示例
+加法运算符计算两个值或表达式的和SELECT a + b;
-减法运算符计算两个值或表达式的差SELECT a - b;
*乘法运算符计算两个值或表达式的乘积SELECT a * b;
/或DIV除法运算符计算两个值或表达式的商SELECT a / b;
SELECT a DIV b;
%或MOD求模(求余)运算符计算两个值或表达式的余数SELECT a % b;
SELECT a MOD b;

加法与减法运算符

mysql> SELECT 100 , 100 + 0 , 100 - 0 , 100 + 50 , 100 + 50 - 30 , 100 + 35.5, 100 - 35 FROM dual;
+-----+---------+---------+----------+---------------+------------+----------+
| 100 | 100 + 0 | 100 - 0 | 100 + 50 | 100 + 50 - 30 | 100 + 35.5 | 100 - 35 |
+-----+---------+---------+----------+---------------+------------+----------+
| 100 |     100 |     100 |      150 |           120 | 135.5      |       65 |
+-----+---------+---------+----------+---------------+------------+----------+
1 row in set (0.04 sec)

由运算结果可以得出如下结论:

① 一个整数类型的值对整数进行加法和减法操作,结果还是一个整数;
② 一个整数类型的值对浮点数进行加法和减法操作,结果是一个浮点数;
③ 加法和减法的优先级相同,进行先加后减操作与进行先减后加操作的结果是一样的;
④ 在 Java 中,+的左右两边如果有字符串,那么表示字符串的拼接。但是在 MySQL 中+只表示数值相加。如果遇到非数值类型,先尝试转成数值,如果转失败,就按 0 计算。(补充:MySQL 中字符串拼接要使用字符串函数CONCAT()实现)

乘法与除法运算符

mysql> SELECT 100 , 100 * 1 , 100 * 1.0, 100 / 1.0, 100 / 2 , 100 + 2 * 5 / 2 , 100 /3, 100 DIV 0 FROM dual;
+-----+---------+-----------+-----------+---------+-----------------+---------+-----------+
| 100 | 100 * 1 | 100 * 1.0 | 100 / 1.0 | 100 / 2 | 100 + 2 * 5 / 2 | 100 /3  | 100 DIV 0 |
+-----+---------+-----------+-----------+---------+-----------------+---------+-----------+
| 100 |     100 | 100.0     | 100.0000  | 50.0000 | 105.0000        | 33.3333 | NULL      |
+-----+---------+-----------+-----------+---------+-----------------+---------+-----------+
1 row in set (0.04 sec)

由运算结果可以得出如下结论:

① 一个数乘以整数 1 和除以整数 1 后仍得原数;
② 一个数乘以浮点数 1 和除以浮点数 1 后变成浮点数,数值与原数相等;
③ 一个数除以整数后,不管是否能除尽,结果都为一个浮点数;
④ 一个数除以另一个数,除不尽时,结果为一个浮点数,并保留到小数点后 4 位;
⑤ 乘法和除法的优先级相同,进行先乘后除操作与先除后乘操作,得出的结果相同;
⑥ 在数学运算中, 0 不能用作除数,在 MySQL 中,一个数除以 0 为 NULL。

求模(求余)运算符

mysql> SELECT 12 % 3 , 12 MOD 5, 12 % -5, -12 % 5, -12 % -5 FROM dual;
+--------+----------+---------+---------+----------+
| 12 % 3 | 12 MOD 5 | 12 % -5 | -12 % 5 | -12 % -5 |
+--------+----------+---------+---------+----------+
|      0 |        2 |       2 |      -2 |       -2 |
+--------+----------+---------+---------+----------+
1 row in set (0.04 sec)

比较运算符

  比较运算符用来对表达式左边的操作数和右边的操作数进行比较,比较的结果为真则返回 1 ,比较的结果为假则返回 0 ,其他情况则返回 NULL。

运算符名称作用
=等于运算符判断两个值、字符串或表达式是否相等
<=>安全等于运算符安全的判断两个值、字符串或表达式是否相等
<>或!=不等于运算符判断两个值、字符串或表达式是否不相等
<小于运算符判断前面的是否小于后面的值、字符串或表达式
<=小于等于运算符判断前面的是否小于或等于后面的值、字符串或表达式
>大于运算符判断前面的是否大于后面的值、字符串或表达式
>=大于等于运算符判断前面的是否大于或等于后面的值、字符串或表达式

等号运算符

(1)等号运算符(=)判断等号两边的值、字符串或表达式是否相等,如果相等则返回 1 ,不相等则返回 0;

(2)在使用等号运算符时,遵循如下规则:

mysql> SELECT 'a' = 'b', 1 = 1, 1 = 'a', '' = null, null = null FROM dual;
+-----------+-------+---------+-----------+-------------+
| 'a' = 'b' | 1 = 1 | 1 = 'a' | '' = null | null = null |
+-----------+-------+---------+-----------+-------------+
|         0 |     1 |       0 | NULL      | NULL        |
+-----------+-------+---------+-----------+-------------+
1 row in set (0.04 sec)

安全等于运算符

  安全等于运算符(<=>)与等于运算符(=)的作用是相似的,==唯一的区别是<=>可以用来对 NULL 进行判断。在两个操作数均为 NULL 时,其返回值为 1,而不为 NULL;当一个操作数为 NULL 时,其返回值为 0,而不为 NULL。

mysql> SELECT 1 <=> '1', 1 <=> 0 , 'a' <=> 'a', '' <=> NULL,NULL <=> NULL FROM dual;
+-----------+---------+-------------+-------------+---------------+
| 1 <=> '1' | 1 <=> 0 | 'a' <=> 'a' | '' <=> NULL | NULL <=> NULL |
+-----------+---------+-------------+-------------+---------------+
|         1 |       0 |           1 |           0 |             1 |
+-----------+---------+-------------+-------------+---------------+
1 row in set (0.04 sec)

不等于运算符

  不等于运算符(<>或!=)用于判断两边的数字、字符串或者表达式的值是否不相等,如果不相等则返回 1,相等则返回 0。不等于运算符不能判断 NULL 值,如果两边的值有任意一个为 NULL,或两边都为 NULL,则结果为 NULL。

mysql> SELECT 1 <> 2, 1 != 2, '1' <> '1', null != null, null != 1 FROM dual;
+--------+--------+------------+--------------+-----------+
| 1 <> 2 | 1 != 2 | '1' <> '1' | null != null | null != 1 |
+--------+--------+------------+--------------+-----------+
|      1 |      1 |          0 | NULL         | NULL      |
+--------+--------+------------+--------------+-----------+
1 row in set (0.04 sec)

非符号运算符

运算符名称作用
IS NULL为空运算判断值是否为空
IS NOT NULL不为空运算判断值是否不为空
LEAST最小值运算符在多值中返回最小值
GREATEST最大值运算符在多值中返回最大值
BETWEEN AND两值之间的运算符判断一个值是否存在两值之间
ISNULL为空运算符判断值是否为空
IN属于运算符判断列表是否包含值
NOT IN不属于运算符判断列表是否不包含值
LIKE模糊匹配运算符判断值是否模糊匹配规则
REGEXP正则表达式运算符判断值是否符合正则表达式规则
RLIKE正则表达式运算符判断值是否符合正则表达式规则

空 / 非空运算符

SELECT * FROM title_info WHERE remark IS NULL;
SELECT * FROM title_info WHERE ISNULL(remark);
SELECT * FROM title_info WHERE remark IS NOT NULL;

最小 / 最大值运算符

GREATEST和LEAST函数都使用N个参数,并分别返回最大和最小值。
语法:

GREATEST(value1, value2, ...);
LEAST(value1,value2,...);

以下比较规则适用于这两个函数:

① 如果任何参数为 NULL,则两个函数都将立即返回 NULL,而不进行任何比较
② 如果在 INT 或 REAL 上下文中使用函数,或者所有参数都是整数值或 REAL 值,那么它们将分别作为 INT 和 REAL 来比较
③ 如果参数由数字和字符串组成,则函数将它们作为数字进行比较
④ 如果至少一个参数是非二进制(字符)字符串,则函数将将参数作为非二进制字符串进行比较
⑤ 在所有其他情况下,函数将参数作为二进制字符串进行比较

mysql> SELECT LEAST('d','e','g','m') AS 'LEAST', GREATEST('d','e','g','m') AS 'GREATEST' FROM dual;
+-------+----------+
| LEAST | GREATEST |
+-------+----------+
| d     | m        |
+-------+----------+
1 row in set (0.04 sec)

BETWEEN AND 运算符

# BETWEEN 条件一 AND 条件二 (查询条件一和条件二范围内的数据,包含边界)
SELECT employee_id, salary FROM employees WHERE salary BETWEEN 2000 AND 5000;

IN / NOT IN 运算符

# IN 运算符
mysql> SELECT 'a' IN ('a','b','c'), 1 IN ( 2 , 3 ), NULL IN ('a','b'), 'a' IN ('a', NULL);
+----------------------+----------------+-------------------+--------------------+
| 'a' IN ('a','b','c') | 1 IN ( 2 , 3 ) | NULL IN ('a','b') | 'a' IN ('a', NULL) |
+----------------------+----------------+-------------------+--------------------+
|                    1 |              0 | NULL              |                  1 |
+----------------------+----------------+-------------------+--------------------+
1 row in set (0.04 sec)

SELECT * FROM title_info WHERE `type` IN ('S','D');

# NOT IN 运算符
mysql> SELECT 'a' NOT IN ('a','b','c'), 1 NOT IN ( 2 , 3 ), NULL NOT IN ('a','b'), 'a' NOT IN ('a', NULL);
+--------------------------+--------------------+-----------------------+------------------------+
| 'a' NOT IN ('a','b','c') | 1 NOT IN ( 2 , 3 ) | NULL NOT IN ('a','b') | 'a' NOT IN ('a', NULL) |
+--------------------------+--------------------+-----------------------+------------------------+
|                        0 |                  1 | NULL                  |                      0 |
+--------------------------+--------------------+-----------------------+------------------------+
1 row in set (0.04 sec)

SELECT * FROM title_info WHERE `type` NOT IN ('S','D');

LIKE 运算符

  LIKE 运算符主要用来匹配字符串,通常用于模糊匹配,如果满足条件则返回 1,否则返回 0。如果给定的值或者匹配条件为 NULL,则返回结果为 NULL。

% :匹配 0 个或多个字符
_ :只能匹配一个字符

# 查询包含'安全'的数据
SELECT * FROM title_info WHERE question LIKE '%安全%';
# 查询以'安全'结束的数据
SELECT * FROM title_info WHERE question LIKE '%安全';
# 查询以'安全'开始的数据
SELECT * FROM title_info WHERE question LIKE '安全%';
# 查询第二个字符是'安全'的数据
SELECT * FROM title_info WHERE question LIKE '_安%';

转义字符

如果使用\表示转义,要省略ESCAPE;如果不是\,则要加上ESCAPE。

# 查询以'安全_'开始的数据
SELECT * FROM title_info WHERE question LIKE '安全\_%';
SELECT * FROM title_info WHERE question LIKE '安全$_%' ESCAPE '$';

REGEXP / RLIKE 运算符

语法格式:expr REGEXP / RLIKE 匹配条件

如果expr满足匹配条件,返回 1;如果不满足,则返回 0。若expr或匹配条件任意一个为 NULL,则结果为 NULL。

# 常用的有下面几种通配符
-- ^ 匹配以该字符后面的字符开头的字符串
-- $ 匹配以该字符前面的字符结尾的字符串
-- . 匹配任何一个单字符
-- * 匹配零个或多个在它前面的字符
-- [...] 匹配在方括号内的任何字符

SELECT 'Tweet' RLIKE '^Tw.*t$';
SELECT 'Tweet' REGEXP '^Tw.*t$';

逻辑运算符

运算符作用示例
NOT或!逻辑非SELECT NOT A;
AND或&&逻辑与SELECT A AND B;
SELECT A && B;
OR或||逻辑或SELECT A OR B;
SELECT A || B;
XOR逻辑异或SELECT XOR A;

逻辑非运算符

mysql> SELECT NOT 1 , NOT 0 , NOT( 1 + 1 ), ! 1 , NOT NULL;
+-------+-------+--------------+-----+----------+
| NOT 1 | NOT 0 | NOT( 1 + 1 ) | ! 1 | NOT NULL |
+-------+-------+--------------+-----+----------+
|     0 |     1 |            0 |   0 | NULL     |
+-------+-------+--------------+-----+----------+
1 row in set (0.04 sec)

逻辑与运算符

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

逻辑或运算符

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

逻辑异或运算符

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

相异为真

位运算符

运算符作用示例
&按位与SELECT A & B;
|按位或SELECT A | B;
^按位异或SELECT A ^ B;
~按位取反SELECT ~A;
<<按位左移SELECT A << 2;
>>按位右移SELECT A >> 2;

位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。

mysql> SELECT 3 & 5, 3 | 5, 3 ^ 6, ~3, 8 << 2, 8 >> 2;
+-------+-------+-------+----------------------+--------+--------+
| 3 & 5 | 3 | 5 | 3 ^ 6 | ~3                   | 8 << 2 | 8 >> 2 |
+-------+-------+-------+----------------------+--------+--------+
|     1 |     7 |     5 | 18446744073709551612 |     32 |      2 |
+-------+-------+-------+----------------------+--------+--------+
1 row in set (0.04 sec)

计算演示.png

运算符的优先级

运算符优先级.png

提示

数字编号越大,优先级越高,优先级高的运算符先进行计算。可以看到,赋值运算符的优先级最低,使用()括起来的表达式的优先级最高。

扩展:使用正则表达式查询

正则通配符说明.png