MySQL: MySQL运算符与表达式详解

最后更新:2026-08-26

运算符是 SQL 查询的基础——WHERE 条件的每一个判断都离不开它们。

本课系统讲解 MySQL 所有运算符及使用场景。

100%
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. 你将学到


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

📖 小节


📝 作业

  1. 基础题(难度⭐):写一个查询,找出售价在 100-500 之间、库存大于 0、名称包含 'phone' 的商品。

  2. 进阶题(难度⭐⭐):写一个查询,找出过去 7 天内、金额大于 200、状态为 'paid' 或 'shipped'、客户邮箱不为空的订单。

  3. 挑战题(难度⭐⭐⭐):设计一个权限系统,用位运算存储和检查用户的读/写/执行权限。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏