25.2 MySQL 运算符

2023-10-24_00005

1. 伪表

在MySQL中, DUAL是一个特殊的单行, 单列的虚拟表, 主要用于在SELECT语句中计算表达式或执行函数, 而不需要从实际的数据表中检索数据.
使用DUAL的原因主要有以下几点:* 1. 简化计算: 通过在SELECT语句中使用DUAL, 可以方便地计算表达式或执行函数, 而无需创建临时表或执行子查询.
* 2. 统一语法: 在某些情况下, 使用DUAL可以使SQL语句保持统一的语法结构, 简化代码逻辑.
* 3. 性能优化: 由于DUAL是虚拟表, 不会占用实际的磁盘空间, 也不会对性能产生负面影响.

2. 算术运算

算术运算符主要用于数学运算, 可以连接运算符前后的两个数值或表达式, 对数值或表达式进行运算.
运算符名称作用示例
+加法运算符计算两个值或表达式的和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
注意事项:
* 1. MySQL中对于非整型的表达式进行隐式转换时, 会尝试将其转换为数值类型.如果转换成功, 则使用转换后的数值进行计算; 如果转换失败, MySQL通常会将该表达式按0计算.这种行为是为了确保查询的执行不会因为非数值类型的表达式而中断.隐式转换可能会导致一些意想不到的结果, 尤其是当转换失败时.因此, 在编写MySQL查询时, 最好确保使用的数据类型是匹配的, 以避免潜在的问题.* 2. 以下类型的字符串可以被转为数值:整数字符串: 由数字字符(0-9)组成的字符串, 可以表示一个整数. 例如. "123"可以被转为数值123.浮点数字符串: 由数字字符和小数点组成的字符串, 可以表示一个浮点数(小数). 例如, "3.14"可以被转为数值3.14.科学计数法字符串: 使用科学计数法表示的数值字符串, 例如, "1.23E4"可以被转为数值12300.0.字符串中的空格和其他非数字字符可能会导致转换失败.此外, 某些特殊情况下, 如超出数值类型范围或格式不符合要求, 转换也可能失败.* 3. 在数学运算中, 0不能用作除数; 在MySQL中, 一个数除以0为NULL.
* 4. 与浮点数进程计算得到的结果是浮点数, 除法运算的结果是浮点数(不管是否能除尽, 结果都为一个浮点数).

2.1 加减法运算

-- 加法
mysql> SELECT 1 + 2;
+-------+
| 1 + 2 |
+-------+
|     3 |
+-------+
1 row in set (0.00 sec)
-- 使用伪表统一语法
mysql> SELECT 1 + 2 FROM DUAL;
+-------+
| 1 + 2 |
+-------+
|     3 |
+-------+
1 row in set (0.00 sec)
-- 纯数字字符串(包括整数和浮点数), 可以转换为整型.
mysql> SELECT 1 + '1' FROM DUAL;
+---------+
| 1 + '1' |
+---------+
|       2 |
+---------+
1 row in set (0.00 sec)
-- 不同数据类型相加, 字符串无法转换为数字按0计算.
mysql> SELECT 1 + 'A' FROM DUAL;
+---------+-----------+
| 1 + 'A' | 'A' + 'A' |
+---------+-----------+
|       1 |         0 |
+---------+-----------+
1 row in set, 1 warning (0.00 sec)
-- 减法运算
mysql> SELECT 1 - 1 FROM DUAL;
+-------+
| 1 - 1 |
+-------+
|     0 |
+-------+
1 row in set (0.00 sec)-- 纯数字字符串(包括整数和浮点数), 可以转换为整型.
mysql> SELECT 1 - '1' FROM DUAL;
+---------+
| 1 - '1' |
+---------+
|       0 |
+---------+
1 row in set (0.00 sec)

2.2 乘除法运算

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

2.3 求模运算

mysql> SELECT 10 % 2, 10 % 3 FROM DUAL;
+--------+--------+
| 10 % 2 | 10 % 3 |
+--------+--------+
|     0  |      1 |
+--------+--------+
1 row in set (0.00 sec)
-- 筛选出员工表中employee_id是偶数的员工名字:
mysql> SELECT first_name FROM employees WHERE employee_id % 2 = 0;
+-------------+
| first_name  |
+-------------+
| Steven      |
| ...         | -- 省略
| Hermann     |
| William     |
+-------------+
54 rows in set (0.03 sec)

3. 比较运算符

比较运算符: 用来对表达式左边的操作数和右边的操作数进行比较, 比较的结果为真则返回1, 比较的结果为假则返回0, 其他情况则返回NULL.
比较运算符经常被用来作为SELECT查询语句的条件来使用, 返回符合条件的结果记录.
运算符名称作用例示
=等于判断两个值, 字符串或表达式是否相等SELECT C FROM TABLE WHERE A= B
<=>安全等于安全地判断两个值, 字符串或表达式是否相等SELECT C FROM TABLE WHERE A<=>B
!= 或 <>不等于判断两个值, 字符串或表达式是否不相等SELECT C FROM TABLE WHERE A!= B
<小于判断前面的值, 字符串或表达式是否小于后面的值, 字符串或表达式SELECT C FROM TABLE WHERE A<B
<=小于等于判断前面的值, 字符串或表达式是否小于等于后面的值, 字符串或表达式SELECT C FROM TABLE WHERE A<= B
>大于判断前面的值, 字符串或表达式是否大于后面的值, 字符串或表达式SELECT C FROM TABLE WHERE A>B
>=大于等于判断前面的值, 字符串或表达式是否大于等于后面的值l, 字符串或表达式SELECT C FROM TABLE WHERE A>= B
注意事项: 
* SQL中赋值符号使用( := ).
* 整型与字符比较时, 会将字符串进行隐式转换, 转换失败则按0计算.
* 字符串之间按ASCII编码的数字进行比较.

3.1 等号

mysql> SELECT 1 = 1, 1 = '1', 0 = 'a', 'a' = 'a', (5 + 3) = (2 + 6), '' = NULL , NULL = NULL;
+-------+---------+---------+-----------+-------------------+-----------+-------------+
| 1 = 1 | 1 = '1' | 0 = 'a' | 'a' = 'a' | (5 + 3) = (2 + 6) | '' = NULL | NULL = NULL |
+-------+---------+---------+-----------+-------------------+-----------+-------------+
|     1 |       1 |       1 |         1 |                 1 |      NULL |        NULL |
+-------+---------+---------+-----------+-------------------+-----------+-------------+
1 row in set, 1 warning (0.00 sec)
-- 查询员工表工资为10000的员工名字:
mysql> SELECT first_name FROM employees WHERE salary = 10000;
+------------+
| first_name |
+------------+
| Peter      |
| Janette    |
| Harrison   |
| Hermann    |
+------------+
4 rows in set (0.00 sec)

3.2 安全等于

安全等于运算符( <=> )可以用来对NULL进行判断.
其中一个操作数为NULL时, 其返回值为0, 而不为NULL.
在两个操作数均为NULL时, 其返回值为1, 而不为NULL;
mysql> SELECT 1 <=> '1', 1 <=> 0, 'a' <=> 'a', (5 + 3) <=> (2 + 6), '' <=> NULL, NULL <=> NULL FROM DUAL;
+-----------+---------+-------------+---------------------+-------------+---------------+
| 1 <=> '1' | 1 <=> 0 | 'a' <=> 'a' | (5 + 3) <=> (2 + 6) | '' <=> NULL | NULL <=> NULL |
+-----------+---------+-------------+---------------------+-------------+---------------+
|         1 |       0 |           1 |                   1 |           0 |             1 |
+-----------+---------+-------------+---------------------+-------------+---------------+
1 row in set (0.00 sec)
-- 查询员工表中佣金百分比为NULL的员工名字和佣金百分比:
mysql> SELECT first_name, commission_pct FROM employees WHERE commission_pct <=> NULL;
+-------------+----------------+
| first_name  | commission_pct |
+-------------+----------------+
| Steven      |           NULL |
| Neena       |           NULL |
| ...         |           ...  | -- 省略
| Hermann     |           NULL |
| Shelley     |           NULL |
| William     |           NULL |
+-------------+----------------+
72 rows in set (0.00 sec)

3.3 不等于

不等于运算符用于判断两边的数字, 字符串或者表达式的值是否不相等, 如果不相等则返回1, 相等则返回0.
mysql> SELECT 1 <> 1, 1 != 2, 'a' != 'b', (3+4) <> (2+6), 'a' != NULL, NULL <> NULL;
+--------+--------+------------+----------------+-------------+--------------+
| 1 <> 1 | 1 != 2 | 'a' != 'b' | (3+4) <> (2+6) | 'a' != NULL | NULL <> NULL |
+--------+--------+------------+----------------+-------------+--------------+
|      0 |      1 |          1 |              1 |        NULL |         NULL |
+--------+--------+------------+----------------+-------------+--------------+
1 row in set (0.00 sec)

3.4 大于小于

-- 查询员工表中工资在6000到8000之间的员工名字, 和薪资, 不包括6000和8000.
mysql> SELECT first_name, salary FROM employees WHERE salary > 6000 AND salary < 8000;
+-------------+---------+
| first_name  | salary  |
+-------------+---------+
| Ismael      | 7700.00 |
| Jose Manuel | 7800.00 |
| ...         | ...     |
| Kimberely   | 7000.00 |
| Charles     | 6200.00 |
| Susan       | 6500.00 |
+-------------+---------+
19 rows in set (0.00 sec)

4. 比较运算关键字

运算符名称描述示例
IS NULL为空运算判断值, 字符串或表达式是否为空SELECT B FROM TABLE WHERE A IS NULL
IS NOT NULL不为空运算判断值, 字符串或表达式是否不为空SELECT B FROM TABLE WHERE A IS NOT NULL
LEAST最小值运算在多个值中返回最小值SELECT D FROM TABLE WHERE C = LEAST(A,B)
GREATEST最大值运算在多个值中返回最大值SELECT D FROM TABLE WHERE C = GREATEST(A,B)
BETWEEN ... AND ...两值之间的运算判断一个值是否在两个值之间SELECT D FROM TABLE WHERE C BETWEEN A AND B
ISNULL为空运算判断一个值, 字符串或表达式是否为空SELECT B FROM TABLE WHERE A ISNULL
IN属于运算判断一个值是否为列表中的任意一个值SELECT D FROM TABLE WHERE C IN (A, B)
NOT IN不属于运算判断一个值是否不是一个列表中的任意一个值SELECT D FROM TABLE WHERE C NOT IN (A,B)
LIKE模糊匹配运算判断一个值是否符合模糊匹配规则SELECT C FROM TABLE WHERE A LIKE B
REGEXP正则表达式运算判断一个值是否符合正则表达式的规则SELECT C FROM TABLE WHERE A REGEXP B
RLIKE正则表达式运算判断一个值是否符合正则表达式的规则(同义词)SELECT C FROM TABLE WHERE A RLIKE B

4.1 为空运算符

IS NULL或者ISNULL判断一个值是否为NULL, 如果为NULL则返回1, 否则返回0.
-- 查询员工表中commission_pct为NULL的员工名字:
mysql> SELECT first_name FROM employees WHERE  commission_pct IS NULL;
+-------------+----------------+
| first_name  | commission_pct |
+-------------+----------------+
| Steven      |           NULL |
| Neena       |           NULL |
| ...         |           ...  | -- 省略
| Hermann     |           NULL |
| Shelley     |           NULL |
| William     |           NULL |
+-------------+----------------+
72 rows in set (0.00 sec)
-- 或者
mysql> SELECT first_name FROM employees WHERE ISNULL(commission_pct);
+-------------+----------------+
| first_name  | commission_pct |
+-------------+----------------+
| Steven      |           NULL |
| Neena       |           NULL |
| ...         |           ...  | -- 省略
| Hermann     |           NULL |
| Shelley     |           NULL |
| William     |           NULL |
+-------------+----------------+
72 rows in set (0.00 sec)

4.2 不为空运算

IS NOT NULL判断一个值是否为NULL, 如果不为NULL则返回1, 否则返回0.
-- 查询员工表中commission_pct为不NULL的员工名字:
mysql> SELECT first_name FROM employees WHERE commission_pct IS NOT NULL;
+-------------+
| first_name  |
+-------------+
| John        |
| ...         | -- 省略
| Kimberely   |
| Charles     |
+-------------+
35 rows in set (0.00 sec)
-- 或 (先判断是否为NULL, 然后取反)
mysql> SELECT first_name FROM employees WHERE NOT commission_pct <=> NULL;
+-------------+
| first_name  |
+-------------+
| John        |
| ...         | -- 省略
| Kimberely   |
| Charles     |
+-------------+

4.3 最小/大运算符

-- 比较序列中最大的值
mysql> SELECT LEAST('g','b','t','m'), GREATEST('g','b','t','m') FROM DUAL;
+------------------------+---------------------------+
| LEAST('g','b','t','m') | GREATEST('g','b','t','m') |
+------------------------+---------------------------+
| b                      | t                         |
+------------------------+---------------------------+
1 row in set (0.01 sec)

4.4 区间取值

区间取值: 查询的字段 BETWEEN 边界下限 AND 边界上限; 包含边界值.
-- 查询员工表中工资在6000到8000的员工名字.
mysql> SELECT first_name FROM employees WHERE salary BETWEEN 6000 AND 8000;
+-------------+
| first_name  |
+-------------+
| Bruce       |
| Ismael      |
| ...         | -- 省略
| Pat         |
| Susan       |
+-------------+
24 rows in set (0.00 sec)

4.5 属于

-- 查询员工表中部门编号为10, 20, 30的员工姓名和部门id:
mysql> SELECT first_name, department_id FROM employees WHERE 
department_id = 10 OR department_id = 20 OR department_id = 30;
+------------+---------------+
| first_name | department_id |
+------------+---------------+
| Jennifer   |            10 |
| Michael    |            20 |
| Pat        |            20 |
| Den        |            30 |
| Alexander  |            30 |
| Shelli     |            30 |
| Sigal      |            30 |
| Guy        |            30 |
| Karen      |            30 |
+------------+---------------+
9 rows in set (0.01 sec)mysql> SELECT first_name, department_id FROM employees WHERE department_id IN (10, 20, 30);
+------------+---------------+
| first_name | department_id |
+------------+---------------+
| Jennifer   |            10 |
| Michael    |            20 |
| Pat        |            20 |
| Den        |            30 |
| Alexander  |            30 |
| Shelli     |            30 |
| Sigal      |            30 |
| Guy        |            30 |
| Karen      |            30 |
+------------+---------------+
9 rows in set (0.00 sec)

4.6 不属于

-- 查询员工表中部门编号不是10, 20, 30的员工姓名和部门id:
mysql>  SELECT first_name, department_id FROM employees WHERE department_id NOT IN (10, 20, 30);
+-------------+---------------+
| first_name  | department_id |
+-------------+---------------+
| Steven      |            90 |
| Neena       |            90 |
| ...         |            .. | -- 省略
| Susan       |            40 |
| Hermann     |            70 |
| Shelley     |           110 |
| William     |           110 |
+-------------+---------------+

4.7 模糊查询

在模糊查询中, 有两个人特殊符号:
* 1. 百分号(%): 代表不确定个数的字符(0, 1个或多个).
* 2. 下划线(_): 代表一个不确定的字符.
* 可以在特殊符号前面添加\取消转义; 还可以使用关键字ESCAPE指定取消转义的字符.
-- 查询员工表中包含字符'a'的员工名字.
mysql> SELECT first_name FROM employees WHERE first_name LIKE '%a%';
+-------------+
| first_name  |
+-------------+
| Neena       |
| Alexander   |
| David       |
| Valli       |
| ...         | -- 省略
| Hermann     |
| William     |
+-------------+
70 rows in set (0.00 sec)
-- 查询员工表中名字以'a'开头的员工名字.
mysql> SELECT first_name FROM employees WHERE first_name LIKE 'a%';
+------------+
| first_name |
+------------+
| Alexander  |
| Alexander  |
| Adam       |
| Alberto    |
| Allan      |
| Amit       |
| Alyssa     |
| Alexis     |
| Anthony    |
| Alana      |
+------------+
10 rows in set (0.00 sec)
-- 查询员工表中名字含有字符'a'与字符'e'的员工名字.
mysql> SELECT first_name FROM employees WHERE first_name LIKE '%a%' AND first_name LIKE '%e%';
+-------------+
| first_name  |
+-------------+
| Neena       |
| Alexander   |
| Daniel      |
| ...         | -- 省略
| Michael     |
| Hermann     |
+-------------+
29 rows in set (0.00 sec)-- 或
mysql> SELECT first_name FROM employees WHERE first_name LIKE '%a%e%' OR first_name LIKE '%e%a%';
+-------------+
| first_name  |
+-------------+
| Neena       |
| Alexander   |
| Daniel      |
| ...         | -- 省略
| Michael     |
| Hermann     |
+-------------+
29 rows in set (0.00 sec)
-- 查询员工表中, 名字的第3个字符是'a'的员工名字:
mysql> SELECT first_name FROM employees WHERE first_name LIKE "__a%";
+------------+
| first_name |
+------------+
| Diana      |
| Adam       |
| Shanta     |
| Clara      |
| Charles    |
| Jean       |
| Alana      |
+------------+
7 rows in set (0.00 sec)
-- 查询职位历史表中(job_history)职位id的第2个字符是_且第3个字符是'A'的职位id:
mysql> SELECT job_id FROM job_history WHERE job_id LIKE '__\_a%';
+------------+
| job_id     |
+------------+
| AC_ACCOUNT |
| AC_ACCOUNT |
| AD_ASST    |
+------------+
3 rows in set (0.00 sec)
-- 使用关键字ESCAPE自定义取消转义符号:
mysql>  SELECT job_id FROM job_history WHERE job_id LIKE '__$_a%' ESCAPE '$';
+------------+
| job_id     |
+------------+
| AC_ACCOUNT |
| AC_ACCOUNT |
| AD_ASST    |
+------------+
3 rows in set (0.00 sec)

4.8 REGEXP运算符

REGEXP运算符用来匹配字符串, 语法格式为: expr REGEXP 匹配条件.
如果expr满足匹配条件, 返回1, 如果不满足, 则返回0.
若expr或匹配条件任意一个为NULL, 则结果为NULL.
REGEXP运算符在进行匹配时, 常用的有下面几种通配符:
* 1. "^": 匹配以该字符后面的字符开头的字符串.
* 2. "$": 匹配以该字符前面的字符结尾的字符串.
* 3. ".": 匹配任何一个单字符.
* 4. "[...]": 匹配在方括号内的任何字符.例如, "[abc]"匹配'a''b''c'.可以使用一个'-'号设置区间范围. "[a-z]"匹配任何字母, "[0-9]"匹配任何数字.
* 5. "*": 匹配零个或多个在它前面的字符.例如, "x*"匹配任何数量的"x"字符, "[0-9]*"匹配任何数量的数字, ".*"匹配任何数量的任何字符, 包括空字符串.
-- 匹配员工表中名字以A开头的员工名字:
mysql> SELECT first_name FROM employees WHERE first_name REGEXP '^a';
+------------+
| first_name |
+------------+
| Alexander  |
| Alexander  |
| ...        |
| Alexis     |
| Anthony    |
| Alana      |
+------------+
10 rows in set (0.02 sec)
-- 匹配员工表中名字以r结尾的员工名字:
mysql> SELECT first_name FROM employees WHERE first_name REGEXP 'r$';
+-------------+
| first_name  |
+-------------+
| Alexander   |
| Alexander   |
| ...         |
| Tayler      |
| Jennifer    |
| Jennifer    |
+-------------+
11 rows in set (0.00 sec)

5. 逻辑运算

逻辑运算:
* 1. 逻辑与 AND (&&): 当两个布尔值同时为true,返回true; 否则, 返回false.
* 2. 逻辑或 OR  (||): 当两个布尔值中至少一个为true, 返回true; 否则, 返回false.
* 3. 逻辑非 NOT (!) : 对单个布尔值进行取反操作, 即将true变为false, false变为true.
* 4. 逻辑异或 XOR   : 当两个布尔值一个为true, 一个为false, 返回true.如果两个布尔值相同, 即都为true或都为false, 异或操作返回false.以下是AND, OR, NOT和XOR四种逻辑运算的真值表格:
ABAND (A && B)OR (A || B)NOT (!A)XOR (A ^ B)
truetruetruetruefalsefalse
truefalsefalsetruefalsetrue
falsetruefalsetruetruetrue
falsefalsefalsefalsetruefalse
-- 查询员工表中, 部门id为10或者20的员工名字和部门id:
mysql> SELECT first_name, department_id FROM employees WHERE department_id = 10 OR department_id = 20;
+------------+---------------+
| first_name | department_id |
+------------+---------------+
| Jennifer   |            10 |
| Michael    |            20 |
| Pat        |            20 |
+------------+---------------+
3 rows in set (0.03 sec)
-- 查询员工表中, 部门id为50 并且工资为50的员工名字, 工资, 部门id:
mysql> SELECT first_name, salary, department_id FROM employees WHERE department_id = 50 AND salary > 6000;
+------------+---------+---------------+
| first_name | salary  | department_id |
+------------+---------+---------------+
| Matthew    | 8000.00 |            50 |
| Adam       | 8200.00 |            50 |
| Payam      | 7900.00 |            50 |
| Shanta     | 6500.00 |            50 |
+------------+---------+---------------+
4 rows in set (0.00 sec)
-- 查询员工表中, 工资不在6000 - 8000 之间的员工名字, 工资:
mysql> SELECT first_name, salary FROM employees WHERE salary NOT BETWEEN 6000 AND 8000;
+------------+----------+
| first_name | salary   |
+------------+----------+
| Steven     | 24000.00 |
| Neena      | 17000.00 |
| Lex        | 17000.00 |
| ...        |      ... | -- 省略
| Jennifer   |  4400.00 |
| Michael    | 13000.00 |
| Hermann    | 10000.00 |
| Shelley    | 12000.00 |
| William    |  8300.00 |
+------------+----------+
83 rows in set (0.00 sec)
-- 查询员工表中, 佣金提成不为NULL的员工名字, 佣金提成:
-- SELECT first_name, commission_pct FROM employees WHERE commission_pct IS NOT NULL;
mysql> SELECT first_name, commission_pct FROM employees WHERE NOT commission_pct <=> NULL;
+-------------+----------------+
| first_name  | commission_pct |
+-------------+----------------+
| John        |           0.40 |
| Karen       |           0.30 |
| Alberto     |           0.30 |
| Gerald      |           0.30 |
| ...         |            ... | -- 省略
| Alyssa      |           0.25 |
| Jonathon    |           0.20 |
| Jack        |           0.20 |
| Kimberely   |           0.15 |
| Charles     |           0.10 |
+-------------+----------------+
35 rows in set (0.00 sec)
-- 异或两种情况:
* 1. 部门id为50,   则工资小于6000.
* 2. 部门id不为50, 则工资大于6000.
mysql> SELECT first_name, department_id, salary FROM employees WHERE department_id = 50 XOR salary > 6000;
+-------------+---------------+----------+
| first_name  | department_id | salary   |
+-------------+---------------+----------+
| Steven      |            90 | 24000.00 |
| ...         |            .. |      ... | -- 省略
| Alana       |            50 |  3100.00 |
| Kevin       |            50 |  3000.00 |
| Donald      |            50 |  2600.00 |
| Douglas     |            50 |  2600.00 |
| Michael     |            20 | 13000.00 |
| Susan       |            40 |  6500.00 |
| Hermann     |            70 | 10000.00 |
| Shelley     |           110 | 12000.00 |
| William     |           110 |  8300.00 |
+-------------+---------------+----------+

5. 位运算

运算符描述示例
&按位与对两个数字的对应位执行与运算.
|按位或对两个数字的对应位执行或运算.
^按位异或对两个数字的对应位执行异或运算.
~按位取反对一个数字的每个位取反.
>>右移将数字的二进制表示向右移动指定位数.
<<左移将数字的二进制表示向左移动指定位数.
mysql> SELECT 12 & 5, 12 | 5, 12 ^ 5 FROM DUAL;
+--------+--------+--------+
| 12 & 5 | 12 | 5 | 12 ^ 5 |
+--------+--------+--------+
|      4 |     13 |      9 |
+--------+--------+--------+
1 row in set (0.00 sec)
十进制: 12 --> 二进制: 1 1 0 0   十进制: 12 --> 二进制: 1 1 0 0   十进制: 12 --> 二进制: 1 1 0 0  
十进制:  5 --> 二进制: 0 1 0 1   十进制:  5 --> 二进制: 0 1 0 1   十进制:  5 --> 二进制: 0 1 0 1
与计算: --一一得一-------------  或计算: --有一得一-------------   异或计算:--一零得一-----------
十进制:  4 <-- 二进制: 0 1 0 0   十进制: 13 <-- 二进制: 1 1 0 1    十进制: 9 <-- 十进制: 1 0 0 1
mysql> SELECT  ~1 FROM DUAL;
+----------------------+
| ~1                   |
+----------------------+
| 18446744073709551614 |
+----------------------+
1 row in set (0.00 sec)mysql> SELECT 10 & ~1 FROM DUAL;
+---------+
| 10 & ~1 |
+---------+
|      10 |
+---------+
1 row in set (0.00 sec)
数字1:  0000000000000000000000000000000000000000000000000000000000000001,
1取反:  1111111111111111111111111111111111111111111111111111111111111110. (18446744073709551614)
数字10: 0000000000000000000000000000000000000000000000000000000000001010,
与运算: ----------------------------------------------------------------
数字10: 0000000000000000000000000000000000000000000000000000000000001010.
-- 在一定范围内满足: 每向左移动1位, 相当于乘以2; 每向右移动一位, 相当于除以2.
mysql> SELECT 4 << 1 , 8 >> 1 FROM DUAL;
+--------+--------+
| 4 << 1 | 8 >> 1 |
+--------+--------+
|      8 |      4 |
+--------+--------+
1 row in set (0.00 sec)

6. 运算符优先级

优先级运算符描述
1:=, =(赋值)赋值操作符.
2OR(||), XOR逻辑或, 逻辑异或.
3AND(&&)逻辑与操作符.
4NOT逻辑非操作符.
5BETWEEN, CASE, WHEN, THEN, ELSEBETWEEN, CASE, WHEN, ELSE操作符.
6= (比较运算符), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN比较运算符和模式匹配操作符.
7|按位或操作符.
8&按位与操作符.
9<<, >>左位移, 右位移操作符.
10-, +减法, 加法操作符.
11\*, /, DIV, %, MOD乘法, 除法, 整数除法, 取余操作符.
12^按位异或操作符.
13-(负号), ~(按位取反)一元负号, 一元按位取反操作符.
14!逻辑非操作符(部分MySQL版本中支持).
15()括号, 改变运算符的优先级.
请注意, 表格中较高的优先级的运算符会优先进行计算, 而较低优先级的运算符则会在较高优先级运算符计算完毕后进行.
括号可以用于改变运算符的优先级.

7. 正则表达式查询

正则表达式通常被用来检索或替换那些符合某个模式的文本内容, 根据指定的匹配模式匹配文本中符合要求的特殊字符串.
例如: 从一个文本文件中提取电话号码, 查找一篇文章中重复的单词或者替换用户输入的某些敏感词语等,
这些地方都可以使用正则表达式; 正则表达式强大而且灵活,可以应用于非常复杂的查询.
MySQL中使用REGEXP关键字指定正则表达式的字符匹配模式.下表列出了REGEXP操作符中常用字符匹配列表:
选项说明例子示例
^匹配以指定字符开头的字符串.'^b': 匹配以字母 b 开头的字符串.book, big, bababa, bike
$匹配以指定字符结尾的字符串.'st$': 匹配以 st 结尾的字符串.test, resist, persist
.匹配任何单个字符.'b.t': 匹配任何b和t之间有一个字符的字符串.bit, bat, but, bite
*匹配前面的字符0次或更多次.'f*n': 匹配字符 n 前面有任意个字符 f 的字符串.fn, fan, faan, fabcn
+匹配前面的字符至少1次或多次.'ba+': 匹配以b开头后面紧跟至少有一个a的字符串ba, bay, bare, battle
<字符串>匹配包含指定字符串的文本.'fa': 匹配包含fa的字符串fan, afa, faad
[字符集合]匹配字符集合中的任何一个字符.'[xa]': 匹配包含x或者z的字符串.dizzy, zebra, x-ray, extra
[^ ]匹配不在指定字符集合中的任何字符.'[^abc]': 匹配任何不包含a, b, c的字符串.desk, fox, f8ke
字符串{n,}匹配前面的字符串至少n次.'b{n}': 匹配2个或更多的b.bbb, bbbb, bbbbbb
字符串{n,m}匹配前面的字符串至少n次, 至多m次.'b{2, 4}': 匹配含最少2个, 最多4个的b的字符串.bb, bbb, bbbb
如果n为0, 此表达式为可选.a{0,3}: a可以出现0, 1, 2, 3次, 即整个表达式是可选的.无, a, aa, aaa
* 1. 查询以特定字符或字符串开头的记录字符'^'匹配以特定字符或者字符串开头的文本.查询员工表中, 名字以字母'b'开头的员工名字, SQL语句如下:
mysql> SELECT first_name FROM employees WHERE first_name REGEXP '^b';
+------------+
| first_name |
+------------+
| Bruce      |
| Britney    |
+------------+
2 rows in set (0.02 sec)
* 2. 查询以特定字符或字符串结尾的记录字符'$'匹配以特定字符或者字符串结尾的文本.查询员工表中, 名字以字母't'结尾的员工名字, SQL语句如下:
mysql> SELECT first_name FROM employees WHERE first_name REGEXP 't$';
+------------+
| first_name |
+------------+
| Amit       |
| Pat        |
+------------+
2 rows in set (0.00 sec)
* 3. 用符号"."来替代字符串中的任意一个字符, 字符'.'匹配任意一个字符.查询员工表中, 名字中有字母'a''c'且两个字母之间只有一个字母的员工名字, SQL语句如下:
mysql> SELECT first_name FROM employees WHERE first_name REGEXP 'a.c';
+------------+
| first_name |
+------------+
| Nancy      |
| Vance      |
+------------+
2 rows in set (0.00 sec)
* 4. 使用"*""+"来匹配多个字符; 星号'*'匹配前面的字符任意多次, 包括0. 加号'+'匹配前面的字符至少一次.查询员工表中, 名字以字母'b'开头且后面会出现字母'e'的员工名字, SQL语句如下:
mysql> SELECT first_name FROM employees WHERE first_name REGEXP '^b.*e+.*';
+------------+
| first_name |
+------------+
| Bruce      |
| Britney    |
+------------+
2 rows in set (0.00 sec)
* 5. 匹配指定字符串, 正则表达式可以匹配指定字符串, 只要这个字符串在查询文本中即可,如要匹配多个字符串, 多个字符串之间使用分隔符'|'隔开.1. 查询员工表中, 名字中有字符'it'的员工名字; 2. 查询员工表中, 名字中有字符'it''ii'的员工名字;
mysql> SELECT first_name FROM employees WHERE first_name REGEXP 'it';
+------------+
| first_name |
+------------+
| Amit       |
| Sundita    |
| Nandita    |
| Britney    |
+------------+
4 rows in set (0.00 sec)mysql> SELECT first_name FROM employees WHERE first_name REGEXP 'it|ic';
+------------+
| first_name |
+------------+
| Michael    |
| Patrick    |
| Amit       |
| Sundita    |
| Nandita    |
| Britney    |
| Michael    |
+------------+
7 rows in set (0.00 sec)
在一般情况下, LIKE和REGEXP操作符都可以用于匹配指定的字符串.
它们之间的主要区别在于匹配方式和规则的不同.
* 1. LIKE操作符是基于模式匹配的, 使用通配符%和_来匹配任意字符和单个字符.当使用LIKE进行匹配时, 如果要匹配的字符串出现在文本的中间, 它不会被找到并返回相应的行.* 2. REGEXP操作符是基于正则表达式匹配的, 可以执行更复杂和灵活的模式匹配.当使用REGEXP进行匹配时, 如果要匹配的字符串在文本中间出现, 它可以被找到并返回相应的行.
mysql> SELECT first_name FROM employees WHERE first_name LIKE 'it';
Empty set (0.01 sec)mysql> SELECT first_name FROM employees WHERE first_name LIKE '%it%';
+------------+
| first_name |
+------------+
| Amit       |
| Sundita    |
| Nandita    |
| Britney    |
+------------+
4 rows in set (0.00 sec)
* 6. 匹配指定字符中的任意一个, 方括号'[]'指定一个字符集合, 只匹配其中任何一个字符, 即为所查找的文本.查询员工表中, 名字中有字符'a''i'的员工名字;
-- 字符串格式中指定匹配的字符组, 中括号中指定匹配的单个字符.
mysql> SELECT first_name FROM employees WHERE first_name REGEXP '[ai]';
+-------------+
| first_name  |
+-------------+
| Neena       |
| Alexander   |
| David       |
| ...         | --省略
| William     |
+-------------+
88 rows in set (0.00 sec)
* 7. 匹配指定字符以外的字符, "[^字符集合]"匹配不在指定集合中的任何字符.查询员工表中, 名字中不包含字符'a-i'的员工名字;
-- [^]匹配的字符中如果有一个字符不在他的排除范围就能匹配成功!!!
mysql> SELECT first_name FROM employees WHERE first_name REGEXP '[^a-e]';
+-------------+
| first_name  |
+-------------+
| Steven      |
| Neena       |
| Tayler      |
| ...         | --省略
| William     |
+-------------+
107 rows in set (0.00 sec)-- 对于严格排除包含指定字符范围的名字, 可以使用其他方法, 例如使用正则表达式的边界匹配(如^和$).
mysql> SELECT first_name FROM employees WHERE first_name REGEXP '^[^a-e]+$';
+------------+
| first_name |
+------------+
| John       |
| Luis       |
| Guy        |
| TJ         |
| Ki         |
| John       |
| John       |
| Winston    |
| Timothy    |
+------------+
9 rows in set (0.00 sec)-- '^[^a-e]+$': 这个正则表达式表示匹配整个字符串, 该字符串中的每一个字符都不是小写字母'a'到'e'.
-- 这里的+表示前面的字符类([^a-e])可以出现一次或多次.
-- 因此, 这个正则表达式会匹配任何完全由不在'a'到'e'范围内的字符组成的字符串.
* 8. 使用{n,}或者{n,m}来指定字符串连续出现的次数."字符串{n,}"表示至少匹配n次前面的字符; "字符串{n,m}"表示匹配前面的字符串不少于n次, 不多于m次.例如, a{2,}表示字母a连续出现至少2, 也可以大于2; a{2,4}表示字母a连续出现最少2, 最多不能超过4.查询员工表中, 名字中字符'e'出现2-3次的员工名字;
-- 注意: 不要在逗号和数字之间加空格.
mysql> SELECT first_name FROM employees WHERE first_name REGEXP 'e{2, 3}';
ERROR 3692 (HY000): Incorrect description of a {min,max} interval.mysql> SELECT first_name FROM employees WHERE first_name REGEXP 'e{2,3}';
+------------+
| first_name |
+------------+
| Neena      |
+------------+
1 rows in set (0.00 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/118366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

thinkphp5使用phpmail发送qq邮件

目录 1、使用composer 工具安装&#xff0c;在tp5根目录下执行 2、封装发送邮件方法 3、控制器中调用 4、运行后结果 1、使用composer 工具安装&#xff0c;在tp5根目录下执行 composer require phpmailer/phpmailer 安装成功后显示下面目录 2、封装发送邮件方法 function…

linux中好玩的数据流定向和管道命令一

知识点复习&#xff1a; 什么是数据流定向&#xff0c;个人理解就是将 一些结果信息不打印在屏幕上&#xff0c;而是定位在某一个文件里面 ll /wdf > file 会覆盖file的原内容 ll /wdf >> 会追加到原文件后面 比如在自己的目录新建1.TXT&#xff0c; 2.txt ll /…

echarts 仪表盘统计图

<!--仪表盘统计图--><div class"ybptx" ref"btryzb"></div>mounted(){this.getBtData();}getBtData() {let chart this.$echarts.init(this.$refs.btryzb);let data_czzf this.cznlzhpj.czzfs;let option {series: [{name: 内层数据刻…

asp.net网球馆计费管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net网球馆计费管理系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 aspnet网球馆计费管理系统1 二、…

Vue 项目进行 SEO 优化

SSR 服务器渲染 服务端渲染, 在服务端 html 页面节点, 已经解析创建完了, 浏览器直接拿到的是解析完成的页面解构 关于服务器渲染&#xff1a;Vue 官网介绍 &#xff0c;对 Vue 版本有要求&#xff0c;对服务器也有一定要求&#xff0c;需要支持 nodejs 环境。 优势: 更好的 …

01. 板载硬件资源和开发环境

一、板载硬件资源 STM32F4VGT6-DISCOVERY硬件资源如下&#xff1a; (1). STM32F407VGT6微控制器有1M的FLASH存储器&#xff0c;192K的RAM&#xff0c;LQFP100封装 (2). 板上的ST-LINK_V2可以使用选择的方式把套件切换成一个独立的ST-LINK/V2来 使用&#xff08;可以使用SWD…

NPI加速器在烽火科技SMT车间的应用:贴片机程序制作效率的革新

烽火科技&#xff0c;一个在国内颇具知名度的高科技企业&#xff0c;坐落于武汉光谷的SMT车间中&#xff0c;机器嗡嗡作响&#xff0c;作业员们忙碌地进行着生产。工厂使用的是ASM的贴片机&#xff0c;使用Sipalce Pro作为其编程软件。然而&#xff0c;在高效的生产线背后&…

Hafnium简介和构建

安全之安全(security)博客目录导读 目录 一、Hafnium简介 二、Hafnium构建 2.1.1 先决条件 2.1.1.1 构建Host 2.1.1.2 工具链 2.1.1.3 依赖 2.1.1.4 获取源码 2.1.2 构建 一、Hafnium简介 可信固件为Armv8-A、Armv9-A和Armv8-M提供了安全软件的参考实现。它为SoC开发人…

OpenCV #以图搜图:感知哈希算法(Perceptual hash algorithm)的原理与实验

1. 介绍 感知哈希算法&#xff08;Perceptual Hash Algorithm&#xff0c;简称pHash&#xff09; 是哈希算法的一种&#xff0c;主要用来做相似图片的搜索工作。 2. 原理 感知哈希算法&#xff08;pHash&#xff09;首先将原图像缩小成一个固定大小的像素图像&#xff0c;然后…

FPGA驱动步进电机-Sin曲线加速

FPGA驱动步进电机-Sin曲线加速 基本实现原理实际仿真的波形程序 以下由特权同学的FPGA文档摘取 Sin 曲线控制 step 脉冲信号生成的功能框图如下所示。 基本实现原理 ①判断步进电机驱动的目标频率 stepper_delay_target 与当前频率 stepper_delay_current的值是否一致&#…

360智慧生活旗舰产品率先接入“360智脑”能力实现升级

10月25日&#xff0c;360智慧生活秋季新品及视觉云方案发布会在深圳召开。360智能硬件产品&#xff0c;诸如 360可视门铃、360智能摄像机、360行车记录仪、360儿童手表和家庭防火墙等&#xff0c;都在各自的行业有着举足轻重得地位&#xff0c;而这次发布的系列新品&#xff0c…

2023高频前端面试题-vue

1. 什么是 M V VM Model-View-ViewModel 模式 Model 层: 数据模型层 通过 Ajax、fetch 等 API 完成客户端和服务端业务模型的同步。 View 层: 视图层 作为视图模板存在&#xff0c;其实 View 就是⼀个动态模板。 ViewModel 层: 视图模型层 负责暴露数据给 View 层&…

mysql 命令行安装

一、安装包下载 1、下载压缩包 &#xff08;1&#xff09;公众号获取 关注微信公众号【I am Walker】&#xff0c;回复“mysql”获取 &#xff08;2&#xff09;官网下载 安装地址MySQL :: Download MySQL Community Server ​ ​ 二、解压 下载完之后进行解压&…

vscode代码快捷输入

Vscode代码片段快捷输入 常用的代码片段为了避免重复输入,可以使用Vsco的中用户代码片段进行设置,这样就可以实现快捷输入. 操作流程 如下 打开vscode的设置 2. 找到用户代码片段 3. 选择模板 4. 然后写入代码片段即可 上面的代码片段可以设置多个,看自己 重点关注的是 prefi…

勒索病毒最新变种.locked1勒索病毒来袭,如何恢复受感染的数据?

引言&#xff1a; 在当今数字化时代&#xff0c;网络威胁不断进化&#xff0c;.locked1勒索病毒就是其中一种常见的恶意软件。这种病毒会加密您的文件&#xff0c;然后勒索赎金以解锁它们。本文将详细介绍.locked1勒索病毒&#xff0c;包括如何恢复被加密的数据文件和如何预防…

微信小程序投票管理系统:打造智能、便捷的投票体验

前言 随着社交网络的兴起和移动互联网的普及&#xff0c;人们对于参与和表达意见的需求越来越强烈。在这个背景下&#xff0c;微信小程序投票管理系统应运而生。它为用户提供了一个智能、便捷的投票平台&#xff0c;使用户可以轻松创建和参与各种类型的投票活动。本文将详细介…

嚼一嚼Halcon中的3D手眼标定

文章目录 一、问题概述1、何为手眼标定&#xff1f;2、手眼标定的2种形式1&#xff09;眼在手上&#xff08;eye in hand&#xff09;&#xff1a;即相机固定在机械臂末端2&#xff09;眼在手外&#xff08;eye to hand&#xff09;&#xff1a;即相机固定在机械臂以外的地方 3…

微信小程序:点击按钮出现右侧弹窗

效果 代码 wxml <!-- 弹窗信息 --> <view class"popup-container" wx:if"{{showPopup}}"><view class"popup-content"><!-- 弹窗内容 --><text>这是一个右侧弹窗</text></view> </view> <…

Linux:实用操作

Linux&#xff1a;实用操作 1. 各类小技巧1.1 controlc(ctrl c) 强制停止1.2 可以通过快捷键&#xff1a;control d(ctrl d)&#xff0c;退出账户的登录1.3 历史命令搜索1.4 光标移动快捷键 2. 软件安装2.1 介绍2.2 yum命令(需要root权限)在这里插入图片描述 3. systemctl4.…

Java CC 解析 SQL 语法示例

示例&#xff1a;SimpleSelectParser 解析 select 11; 输出 2&#xff1b; 0&#xff09;总结 编写 JavaCC 模板&#xff0c;*.jj 文件。 编译生成代码文件。 移动代码文件到对应的包下。 调用生成的代码文件。 1&#xff09;JavaCC 模板 main/javacc/SimpleSelectParse…