MySQL: MySQL运算符与表达式详解
最后更新:2026-08-26
运算符是 SQL 查询的基础——WHERE 条件的每一个判断都离不开它们。
本课系统讲解 MySQL 所有运算符及使用场景。
graph TB
A[MySQL 运算符] --> B[算术运算符<br/>+ - * / DIV %]
A --> C[比较运算符<br/>= != > < BETWEEN LIKE IN]
A --> D[逻辑运算符<br/>AND OR NOT XOR]
A --> E[位运算符<br/>& | ^ ~ << >>]
C --> C1[BETWEEN 范围]
C --> C2[IN 列表]
C --> C3[LIKE 模糊]
C --> C4[IS NULL 空值]
C --> C5[<=> 安全等于]
1. 你将学到
- 算术运算符(+−×÷)
- 比较运算符(=/>/</BETWEEN/LIKE/IN)
- 逻辑运算符(AND/OR/NOT)
- 位运算符(&/|/^)
- 运算符优先级
2. 一个报表的真实故事
(1) 痛点:筛选条件写不对
一个运营想查"过去 30 天、金额大于 100、状态不是取消的订单":
SQL
-- 错误写法
SELECT * FROM orders
WHERE order_date > '2026-06-03' AND amount > 100 AND status != 'cancelled';
-- 漏了:status 可能是 NULL
(2) 运算符的解法
SQL
-- 正确写法:处理 NULL
SELECT * FROM orders
WHERE order_date > DATE_SUB(CURDATE(), INTERVAL 30 DAY)
AND amount > 100
AND (status != 'cancelled' OR status IS NULL);
收益: 不遗漏 NULL 数据,查询结果准确。
3. 算术运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
+ |
加 | SELECT 1 + 1; → 2 |
- |
减 | SELECT 5 - 3; → 2 |
* |
乘 | SELECT 2 * 3; → 6 |
/ |
除 | SELECT 10 / 3; → 3.3333 |
DIV |
整除 | SELECT 10 DIV 3; → 3 |
% |
取余 | SELECT 10 % 3; → 1 |
MOD |
取余 | SELECT MOD(10, 3); → 1 |
▶ 示例:算术运算
SQL
-- 计算订单总价
SELECT
product_name,
price,
quantity,
price * quantity AS total
FROM order_items;
-- 计算折扣价
SELECT
product_name,
original_price,
discount_rate,
original_price * (1 - discount_rate / 100) AS sale_price
FROM products;
输出:
TEXT
📖 仅展示
+--------------+-------+----------+-------+
| product_name | price | quantity | total |
+--------------+-------+----------+-------+
| iPhone | 999 | 2 | 1998 |
| MacBook | 1999 | 1 | 1999 |
+--------------+-------+----------+-------+
4. 比较运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
= |
等于 | WHERE id = 1 |
<> 或 != |
不等于 | WHERE status != 'deleted' |
< |
小于 | WHERE age < 18 |
> |
大于 | WHERE price > 100 |
<= |
小于等于 | WHERE score <= 60 |
>= |
大于等于 | WHERE amount >= 1000 |
BETWEEN |
范围 | WHERE age BETWEEN 18 AND 30 |
IN |
列表 | WHERE status IN ('active', 'pending') |
LIKE |
模糊匹配 | WHERE name LIKE 'J%' |
IS NULL |
为空 | WHERE email IS NULL |
IS NOT NULL |
不为空 | WHERE email IS NOT NULL |
<=> |
安全等于 | NULL <=> NULL → 1 |
▶ 示例:BETWEEN 范围查询
SQL
-- 查询价格在 100 到 500 之间的商品
SELECT * FROM products WHERE price BETWEEN 100 AND 500;
-- 等价于
SELECT * FROM products WHERE price >= 100 AND price <= 500;
-- 查询某个日期范围内的订单
SELECT * FROM orders WHERE order_date BETWEEN '2026-01-01' AND '2026-06-30';
▶ 示例:IN 列表查询
SQL
-- 查询特定状态的订单
SELECT * FROM orders WHERE status IN ('pending', 'paid', 'shipped');
-- 等价于
SELECT * FROM orders WHERE status = 'pending' OR status = 'paid' OR status = 'shipped';
-- 查询特定部门的员工
SELECT * FROM employees WHERE department_id IN (1, 3, 5, 7);
▶ 示例:LIKE 模糊匹配
SQL
-- % 匹配任意多个字符
SELECT * FROM users WHERE name LIKE 'J%'; -- J 开头
SELECT * FROM users WHERE name LIKE '%son'; -- son 结尾
SELECT * FROM users WHERE name LIKE '%john%'; -- 包含 john
-- _ 匹配单个字符
SELECT * FROM users WHERE phone LIKE '138____1111'; -- 第4-7位任意
-- ESCAPE 转义
SELECT * FROM files WHERE name LIKE '%\%%' ESCAPE '\\'; -- 包含 %
▶ 示例:NULL 比较
SQL
-- NULL 不能用 = 比较
SELECT * FROM users WHERE email = NULL; -- ❌ 错误,返回空
SELECT * FROM users WHERE email IS NULL; -- ✅ 正确
-- NULL 不能用 != 比较
SELECT * FROM users WHERE email != NULL; -- ❌ 错误
SELECT * FROM users WHERE email IS NOT NULL; -- ✅ 正确
-- 安全等于 <=>
SELECT NULL = NULL; -- NULL(不确定)
SELECT NULL <=> NULL; -- 1(确定相等)
5. 逻辑运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
AND |
逻辑与 | WHERE a = 1 AND b = 2 |
OR |
逻辑或 | WHERE a = 1 OR b = 2 |
NOT |
逻辑非 | WHERE NOT (status = 'deleted') |
XOR |
异或 | WHERE a = 1 XOR b = 2 |
▶ 示例:AND/OR 组合
SQL
-- AND:两个条件都满足
SELECT * FROM employees
WHERE department = 'Engineering' AND salary > 8000;
-- OR:满足任一条件
SELECT * FROM employees
WHERE department = 'Sales' OR department = 'Marketing';
-- 组合:注意优先级(AND > OR)
SELECT * FROM employees
WHERE (department = 'Sales' OR department = 'Marketing')
AND salary > 5000;
▶ 示例:NOT 取反
SQL
-- NOT IN
SELECT * FROM products WHERE category_id NOT IN (1, 2, 3);
-- NOT BETWEEN
SELECT * FROM orders WHERE amount NOT BETWEEN 100 AND 500;
-- NOT LIKE
SELECT * FROM users WHERE email NOT LIKE '%@test.com';
-- NOT EXISTS
SELECT * FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);
6. 位运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
& |
按位与 | SELECT 5 & 3; → 1 |
| |
按位或 | SELECT 5 | 3; → 7 |
^ |
按位异或 | SELECT 5 ^ 3; → 6 |
~ |
按位取反 | SELECT ~5; → -6 |
<< |
左移 | SELECT 1 << 3; → 8 |
>> |
右移 | SELECT 8 >> 2; → 2 |
▶ 示例:位运算应用
SQL
-- 权限系统(位掩码)
-- 读=1, 写=2, 执行=4
CREATE TABLE permissions (
user_id INT,
permission TINYINT
);
-- 用户有读+写权限 = 1|2 = 3
INSERT INTO permissions VALUES (1, 3);
-- 检查是否有写权限 (3 & 2 = 2, 非0表示有)
SELECT * FROM permissions WHERE permission & 2;
7. 运算符优先级
从高到低:
| 优先级 | 运算符 |
|---|---|
| 1 | ! (NOT) |
| 2 | - (负号), ~ (取反) |
| 3 | ^ (异或) |
| 4 | *, /, DIV, %, MOD |
| 5 | +, - |
| 6 | <<, >> |
| 7 | & |
| 8 | | |
| 9 | =, <=>, <>, !=, <, <=, >, >=, LIKE, IN, BETWEEN |
| 10 | AND, && |
| 11 | OR, ||, XOR |
💡 提示: 不确定优先级时,用括号
() 明确执行顺序。
❓ 常见问题
Q
= 和 <=> 有什么区别?A
= 比较 NULL 返回 NULL,<=> 比较 NULL 返回 1(确定相等)。<=> 是 MySQL 特有的安全等于。Q LIKE 和 REGEXP 哪个快?
A LIKE 更快(可以走索引),REGEXP 更灵活(正则匹配)。简单匹配用 LIKE。
Q AND 和 OR 的优先级?
A AND 优先级高于 OR。
WHERE a=1 OR b=2 AND c=3 等价于 WHERE a=1 OR (b=2 AND c=3)。建议用括号明确。Q NULL 参与运算结果是什么?
A 任何运算涉及 NULL,结果都是 NULL。
1 + NULL = NULL,'abc' || NULL = NULL。📖 小节
- 算术运算符用于数值计算:
+−×÷ DIV % - 比较运算符用于条件过滤:
= / != / < / > / BETWEEN / LIKE / IN / IS NULL - 逻辑运算符组合条件:
AND / OR / NOT / XOR - 位运算符操作二进制位:
& / | / ^ / ~ / << / >> - NULL 参与运算结果为 NULL,比较用
IS NULL或<=> - 优先级不确定时用括号
📝 作业
-
基础题(难度⭐):写一个查询,找出售价在 100-500 之间、库存大于 0、名称包含 'phone' 的商品。
-
进阶题(难度⭐⭐):写一个查询,找出过去 7 天内、金额大于 200、状态为 'paid' 或 'shipped'、客户邮箱不为空的订单。
-
挑战题(难度⭐⭐⭐):设计一个权限系统,用位运算存储和检查用户的读/写/执行权限。